Archives par mot-clé : Responsive Design

ASP.NET MVC : Adaptez vos vues selon le device

On parle de plus en plus de Responsive Web Design (RWD) afin d’adapter l’affichage d’un site en fonction du périphérique de l’utilisateur. Il existe également le Web Design Adaptatif qui permet notamment de renvoyer un contenu adapté au terminal. En effet, le poids de la page a une importance lorsque l’on a un terminal avec une connectivité limitée (un téléphone par exemple). Il se peut également que les fonctionnalités d’une version mobile soient différentes d’une version classique par exemple.

ASP.NET MVC apporte avec la version 4 la possibilité d’avoir des Display Modes adaptés en fonction du périphériques. Ainsi, vous pouvez avoir plusieurs vues (1 pour la version mobile et 1 pour la version normale par exemple) sans modifier toute votre application.

Par défaut, 2 modes sont gérés : classique et mobile. ASP.NET MVC étant très configurable et extensible, il est possible de définir ses propres modes. Le tutorial sur le site officiel sur les fonctionnalités pour le mobiles, montre comment ajouter ces modes.

WURFL / 51Degrees

Wurfl et 51Degrees sont 2 librairies qui permettent une plus grande flexibilité dans la détection des devices mobiles (en proposant une base de données permettant d’identifier les navigateurs mobiles de façon plus précise et plus sûre) et donc une gestion des définitions des modes plus précis.

Quelques liens sur l’utilisation de ces librairies avec ASP.NET MVC :

WURFL

51Degrees

/!\ Si vous utilisez T4MVC, il faut utiliser  Views.ViewNames.Index (qui renvoie le nom de la vue Index dans notre exemple) et non pas Views.Index (qui renvoi le chemin vers le fichier de la vue ex : ~/Home/Index.cshtml). En effet, le moteur renverra,  dans ce cas, tout le temps vers la vue spécifiée par le chemin et non pas la vue correspondant à votre device.

MVC3

Comme précisé précédemment, cette fonctionnalité n’a été apportée qu’avec la  version 4 de MVC. J’ai eu à mettre en place ce type de gestion avec un site en MVC 3. Il existe une extension NuGet, MobileViewEngine, qui permet le support basique de cette fonctionnalité (L’article de présentation du package sur le blog de l’auteur Scott Hanselman, membre de la Web Platform Team chez Microsoft). En effet, Il n’est pas possible d’ajouter des modes et la détection se fait via Browser.IsMobileDevice d’ASP.NET (dont la base de données n’est pas la plus à jour). Cette gestion n’étant pas adaptée dans mon cas, je suis donc parti du code source de ce package afin de le modifier et l’adapter à mon besoin en utilisant WURFL.

CSS : Tuile Responsive

J’ai dans un article précedent parler de responsive design afin d’adapter un site en fonction des devices des visiteurs. Nous allons voir comment faire des tuiles responsive.
Nous allons repartir de l’exemple d’un article précédent montrant comment tronquer du texte en CSS. L’exemple montrait des tuiles carrées. Nous allons adpater le design pour avoir des tuiles rectangulaire si la largeur est inférieure à 480px.

Une tuile est définie par un titre, une description et une image.
Le code html d’une tuile est le suivant :

<li>
<a class="tile" title="Partager avec un Ami" href="#">
<h1>Partager avec un Ami</h1>
<img src="share.png" alt="">
<p>Partager sur Twitter, Facebook, ...</p>
</a>
</li>

Voici le code CSS qui permet d’afficher les tuiles sous formes d’un carré.

div#home[role="main"] ul#tiles-panel li {
	display: inline-block;
	list-style: none outside none;
	margin: 0 8px 8px 0;
	vertical-align: top;
}

.tile {
	-moz-box-sizing: border-box;
	background: none repeat scroll 0 0 #F0F1F4;
	border-bottom: 3px solid #7B4F9D;
	display: inline-block;
	height: 176px;
	text-decoration: none;
	vertical-align: top;
	width: 176px;
}

.tile h1 {
	color: #253340;
	display: block;
	font-family: "Segoe UI",Segoe,"Trebuchet MS",Tahoma,Geneva,sans-serif;
	font-size: 20px;
	font-weight: 500;
	line-height: 148%;
	margin: 0;
	padding: 10px;
	text-decoration: none;
	white-space: nowrap;
	text-overflow : ellipsis;
	overflow : hidden;
	text-align : center;
}

.tile img {
	left: 50%;
	margin: 5px 0 10px -25px;
	position: relative;
}

.tile p {
	color: #6A747E;
	font-family: "Segoe UI",Segoe,"Trebuchet MS",Tahoma,Geneva,sans-serif;
	font-size: 13px;
	font-weight: 500;
	line-height: 148%;
	margin: 0;
	padding: 0 10px;
	text-align: center;
}

Voici la démo de cet écran sans adaptation.

On peut voir qu’avec un petit écran, cet affichage n’est pas du tout adapté. Nous allons le modifier afin d’optimiser l’affichage sur les petites résolutions. Pour cela, nous allons :

  • afficher les tuiles sous formes rectangulaires les unes à la suite des autres
  • réduire l’image et la placer à la gauche de la tuile

Voici le code qui permet d’adapter le résultat pour une utilisation pour petits écrans avec l’utilisation d’une média queries ciblant les écrans ayant une largeur maximum de 480px :

@media only screen and (max-width: 480px) {
    h1 {
	font-size : 24px;    
    }
	
    div[role=main]#home   ul#tiles-panel  li {
	display: block; /*passage en block pour affichage les uns en dessous des autres */
	position : relative;        
    }
	
    /*Tiles*/
    ul {
        padding : 0;   
    }
    
    .tile {
        width : 100%;
        height : 55px;    
        display : block;
        border-bottom : 0px;
        border-left: 3px solid #7B4F9D;
    }
	
    .tile  h1 {
        padding : 0;    
    }

    .tile  h1, .tile p {
        margin-left : 50px;    
    }
	
    .tile img {
        position: absolute;
        top : 5px;
        left : 5px;
        width : 45px;
        height : 45px;
        margin : 0 1px; 
    }
}

Et voici le résultat avant/après (utilisation de la vue adaptative de Firefox pour tester) :

Tuile non Responsive

Tuile Responsive

La page de démo

Dans cet exemple, j’utilise les mêmes images pour les 2 versions alors qu’il serait mieux d’avoir des images adaptées en fonction de la résolution, ce qu’on appelle responsive images. Il faut savoir qu’il sera bientôt possible de définir plusieurs sources d’image afin de gérer ce cas (via l’attribut srcset de la balise image ou via l’élément picture) et qu’il existe déjà des polyfills comme srcset-polyfill. Pour en savoir plus, je vous conseille responsiveimages.org.

Firefox : Le mode Responsive Design

Je viens de découvrir un mode Responsive Design dans Firefox qui peut s’avérer pratique afin de tester le rendu d’un site responsive qui permet l’adaptation d’un site à différentes résolution (notamment). L’activation se fait dans le menu Outils > Développeur Web > Mode Responsive Design (il semblerait que le menu s’appelle maintenant Vue adaptative, mouais, je ne suis pas très fan. Ca me semble mois clair …) ou via le raccourci Maj+Ctrl+M.

Firefox : Activation du Mode Responsive DesignUne fois activée, la page en cours de consultation est affichée à l’intérieure d’un cadre dont il est possible de modifier la taille et l’orientation. Une liste de résolutions standards pour le responsive design est proposée et il est également possible d’adapter la résolution à des valeurs personnalisées via un redimensionnement manuel. Le changement d’orientation se fait en cliquant sur le bouton rotation.

Voici un exemple de rendu du site Smashing Magazine en 320×480.

Firefox : le Mode Responsive DesignSuper pratique !!!

CSS3 – Medias Queries : Adapter son site à différentes résolutions

Avec l’avènement des smartphones et des tablettes, il est possible d’accéder à un site avec des « devices » de résolution très différentes. Voyons comment via CSS modifier l’affichage de votre site en fonction de la résolution du terminal utilisé, sans pour autant modifier le code HTML.

C’est ce que l’on appelle le responsive design. Il existe 2 approches :

  • Mobile First ou amélioration progressive : cela consiste à concevoir votre site pour les petits terminaux et ajouter des améliorations pour les résolutions plus grande.
  • Desktop First ou dégradation élégante : dans cette approche, il s’agit de concevoir pour de grands écrans et supprimer les effets et éléments superflus pour les petits écrans.

La notion de responsive design ne se limite pas seulement aux media queries. L’adaptation pouvant se faire par d’autres moyens, par JavaScript notamment.

En terme de performance, les petits écrans sont souvent associés à des smartphones, moins performant que les ordinateurs de bureau par exemple. L’approche Mobile First sera moins gourmande. En effet, dans le cas du Desktop First, l’affichage par défaut sera adapté pour les grands écrans. La feuille de style sera appliquée puis ensuite les couches pour l’adaptation pour les petits écrans. Ainsi, plusieurs règles pour les mêmes éléments seront interprétées.

En HTML4/CSS2, il est possible de définir des styles en fonction du média (écran, imprimante, projecteur, …).

Les Media Queries CSS3 vont plus loin et permettent d’adapter votre site en fonction de paramètres comme :

  • l’orientation du terminal (portrait ou paysage) : orientation
  • la hauteur : height
  • la largeur : width
  • la hauteur du terminal : device-height
  • la largeur du terminal : device-width
  • le ratio : aspect-ratio

Syntaxe

Les media queries désignent l’expression qui permet de définir dans quel cas le code CSS doit être utilisé. Ce sont des expressions logiques qui peuvent contenir plusieurs conditions. Les opérateurs logiques disponibles sont :

  • and : et
  • only : seulement
  • not : non

A noter que le ou se fait via la virgule. En effet, on pourra définir plusieurs cas pour lesquels le style est applicable en séparant plusieurs media queries par une virgule.

@media only screen and (max-width: 480px), only screen and (max-device-width: 480px) {
    /* Code CSS */
}

Utilisation

L’utilisation des media queries dans votre page peut se faire via plusieurs techniques.

Fichier CSS unique

Le code CSS pour vos différentes adaptations peut être inclus dans un seul fichier. Le code spécifique pour une « adaptation » (résolution, orientation, …) étant inclus dans un sous bloc définissant les règles d’application. Dans l’exemple ci-dessous, la couleur de fond change pour les terminaux de type écran dont la largeur est inférieure à 480px.

/* fond gris par défaut */
body {
    background : #CCC;
}

@media only screen and (max-device-width: 480px) {
    /* fond blanc pour les terminaux de type écran dont la largeur est inférieure à 480px */
    body {
        background : #FFF;
    }
}

Fichiers séparés

Il est également possible de mettre le code spécifique dans des fichiers séparés. La règle d’application étant définie dans l’attribut média de la balise link.

<link rel="stylesheet" type="text/css" media="only screen and (max-device-width: 480px)" href="small-device.css" />

Configuration du viewport pour les terminaux mobiles

Dans le cas des terminaux mobiles comme des smartphones, il est nécessaire de configurer ce qu’on appelle le viewport afin de s’assurer que la résolution cible soit la résolution du terminal. En effet, afin d’assurer une compatibilité des sites pour les smartphones, le navigateur est configuré avec une résolution plus grande que celle de l’écran. Ainsi le site s’affiche pour une résolution plus grande ce qui oblige l’utilisateur a zoomer. La configuration se fait via la balise meta viewport.

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

Pour en savoir plus, je vous conseille l’article Comprendre le Viewport dans le Web mobile d’Alsacreations.

Maj du 1er Novembre 2012 :
Il est maintenant possible de déclarer le viewport directement en CSS via la directive @viewport.

@viewport{ 
    width: device-width; 
    zoom: 1; 
}

Pour en savoir plus, je vous invite à lire l’article Utilisez @viewport pour le Responsive!

Exemples

Voici une petite liste d’exemples qui montre la puissance des media queries :

  • L’exemple typique : Un gabarit de site qui s’adapte à la résolution du navigateur (exemple issus du site Alsacreations)
  • Des exemples plus originaux :
    • Santa’s Media Queries : le nombre des membres de la famille Simpson diminue avec la résolution
    • Too many fish is the sea : Le nombre de poisson diminue avec la résolution avec une animation (fonctionne seulement sous Firefox)
    • CSS3 Cherry Blossom : Animation de floraison d’un arbre lors de l’agrandissement de la résolution.

Liens

Voici quelques liens/ressources qui m’ont servi pour cet article :

Conclusion

L’utilisation des media queries permet d’adapter facilement un site à différents médias. Il est ainsi possible d’adapter votre site en fonction de la résolution, l’orientation, l’aspect ratio, … afin que ce dernier soit utilisable quelque soit le terminal (ordinateur, smartphone, tablette, TV, ..) sans pour autant modifier le code HTML. Il faut bien prendre en compte ce dernier point. En effet, si les fonctionnalités de la version mobile sont beaucoup plus réduites, il sera plus performant d’avoir une version dédiée à ces supports afin de ne pas charger un trop grand nombre d’éléments inutiles.
Le support des Media Queries est bon pour les navigateurs modernes mais peut poser problème sur les anciennes versions (IE 6/7/8, Firefox < 3.5, Safari 2 notamment). Il existe des solutions (polyfills) afin d’utiliser cette technologie sur les navigateurs non compatibles comme les librairies JavaScript Respond.js ou Enquire.js.