Outils CSS de base pour le design adaptatif

Alexandre Niveau
GREYC — Université de Caen
En partie adapté du cours de Jean-Marc Lecarpentier
TODO: multicolumn est bien supporté maintenant
TODO: parler de span pour grid pour les L1 ?

Contexte

Jusqu'en 2007, un site web se visitait sur un écran d'ordinateur
  • Différentes tailles d'écran, mais pas suffisamment importantes pour qu'un design prévu pour une largeur de 800 pixels soit vraiment inadapté
  • Quelques terminaux mobiles (PDA, Blackberry), mais rares, et affichent les pages web assez différemment

Arrivée de l'iPhone, puis des autres smartphones, puis des tablettes : les sites web doivent s'adapter à de multiples tailles d'écran

En parallèle, taille et définition des écrans d'ordinateur augmente

Il n'est plus pertinent de proposer une « version mobile » et une « version desktop » de son site web…

un seul site, qui doit s'adapter à toutes les possibilités

Responsive design

  • « Design adaptatif » : styles qui s'adaptent en fonction de la place disponible, de la résolution, de l'orientation de l'écran…
  • Adaptabilité en termes de :
    • mise en page : colonnes, placement des menus
    • contenu : montrer plus ou moins en fonction de l'espace
    • images : réduire leur taille
    • polices : à adapter selon l'écran

Media queries

  • Objectif : appliquer des règles CSS uniquement lorsque certains critères sont remplis
  • Exemple : « lorsque la largeur de la fenêtre est en-dessous de 800 pixels, je veux que mes paragraphes soient en jaune sur fond noir »
    @media (max-width: 800px) {
      p {
        background: black;
        color: yellow;
      }
    }
    
  • N.B.: la règle spéciale @media contient des règles CSS !
  • Référence complète : Media Queries W3C Recommendation

Critères possibles

Les propriétés sont de la forme critère: valeur

Nombreux critères possibles :
  • Couleur : color, color-index, monochrome
  • Caractéristiques de l'appareil (valeurs fixées) : device-height, device-width, device-aspect-ratio, resolution
  • Affichage (valeurs dynamiques) : height, width, orientation, aspect-ratio

La plupart des critères peuvent prendre les opérateurs min- et max-

Par exemple, min-width: 400px signifie « largeur supérieure à 400px » (autrement dit, la largeur minimale pour laquelle la propriété s'applique est 400px)

Utilisation des requêtes média en pratique

En pratique, on ne va quasiment utiliser que max-width et min-width

Si on met des media queries un peu partout dans son CSS et dans plusieurs sens (max/min), impossible de s'y retrouver !

On va plutôt avoir un CSS de base, modifié ensuite avec des requêtes média — si possible dans une seule direction

Soit on part de la version mobile et on fait des modifications pour des largeurs de plus en plus grandes, soit l'inverse

Exemple (simpliste) :
/* version par défaut: sur grand écran */
.menu { width: 30em; /* etc. */ }

/* écran plus petit: on passe le menu en horizontal */
@media (max-width: 100em) {
	.menu { width: 100%; }
	.menu li { display: inline-block; }
	/* etc. */
}

/* écran encore plus petit: on cache le menu */
@media (max-width: 50em) {
	.menu { display: none; }
}

Requêtes média dans le HTML

Remarque : on peut aussi utiliser les media queries dans l'attribut media de l'élément link, pour choisir quelle feuille de style charger

<link rel="stylesheet" media="print" href="print.css" />
<link rel="stylesheet" media="screen" href="all_screens.css" />
<link rel="stylesheet" media="screen and (max-width: 600px)"
                       href="small_screens.css"
/>

Ajustement automatique

  • Navigateurs mobiles : zoom automatique pour ajuster la page dans la largeur. À désactiver seulement si votre site est responsive !
  • Cela se fait dans le HTML avec une balise meta :
    <meta name="viewport" content="initial-scale=1" />
  • Autre valeur possible, pour empêcher l'internaute de modifier le niveau de zoom (uniquement sur terminal mobile) :
    <meta name="viewport" content="maximum-scale=1.0,
                                   minimum-scale=1.0" />
    
    Très déconseillé (sauf si vous savez ce que vous faites) : la possibilité de zoomer est indispensable pour l'accessibilité !
  • Plus de détails sur le viewport dans cet article en français
NB: @viewport en CSS a été abandonné (pb de performances pour le chargement des images)

Unités de longueur : rappel

  • Recommandation W3C
  • Pas besoin d'unité pour zéro
  • Longueur absolue :
    • pt : point, utilisé pour les médias destinés à l'impression
    • in : pouce (2,54cm, 1/72in = 1pt)
    • px : pixel = 1/96 in (un pixel CSS peut recouvrir plusieurs pixels de l'écran)
    • mm, cm
  • Longueur relative : taille calculée par rapport à l'élément parent
    • em : taille dépendant de la police de caractères.
    • % : relatif au bloc parent (par ex. taille de la police du bloc parent, largeur du bloc parent)

Unités de longueur pour le responsive design

  • Compromis entre relatif et absolu : rem, correspond à la valeur font-size de l'élément racine
  • Unités de longueur qui dépendent de la taille de la fenêtre :
    • vw: 1% de la largeur courante de la fenêtre (viewport width)
    • vh: 1% de la hauteur courante de la fenêtre (viewport height)
  • Par exemple, si la fenêtre fait 1200 pixels de large, un vw vaut 12 pixels
  • C'est une unité comme une autre ! Techniquement, rien n'empêche d'utiliser des vw et des vh partout à la place des px ou des em
  • Explications sur l'intérêt de ces unités (en particulier pour la taille de police et pour la hauteur des blocs)
tout un tas de nouvelles unités responsive ont été introduites, mais pas utiles pour la L1 a priori

Paliers

Content is like water. You put water into a cup it becomes the cup. You put water into a bottle it becomes the bottle. You put it in a teapot, it becomes the teapot.
Illustration par Stéphanie Walter (licence CC-BY-SA)

Conclusion

  • Responsive design : design qui s'adapte
  • Design bien fait = adaptabilité de base ! exemple: design avec des tableaux. NB: si HTML propre, garantit la possibilité d'accès minimal depuis n'importe quoi. à part les images ou les tableaux, le HTML pur est très responsive !
  • Attention aux frameworks qui permettent de faire du responsive, comme Bootstrap ou Foundation :