Les media queries rendent possible de fixer des règles spécifiques en fonction du media (support) du contenu d’un site. On connaît et utilise depuis un bon bout de temps le @media print
pour fixer des règles applicables à l’impression.
L’utilisation de plus en plus répandue des téléphones portables ou tablettes pour surfer sur le web ainsi que l’apparition de très grands écrans a rendu l’usage des media queries dédiées aux différentes largeurs affichées assez répandu. Encore faut-il peser différents paramètres pour bien faire les choses.
En bas de ce billet figure une petite bibliographie de référence. Je crois inutile de m’appliquer à reformuler ce qui est déjà si bien dit, aussi ne poserai-je ici que les problématiques auxquelles je suis confrontée pour que des avis ou discussions puissent se tenir à leur sujet.
Utiliser les media queries
Méthode d’import
J’ai choisi pour le moment d’importer depuis la feuille de style maîtresse (style.css
) une feuille qui comporte toutes les règles des media queries.
Je manque de critères d’appréciation (et j’attends vos contributions) pour évaluer s’il eût mieux valu appeler cette feuille directement dans l’entête du fichier ? J’ai hésité aussi – et j’hésite encore – à faire une feuille par directive relative à la taille d’écran et de les appeler par import sous la forme :
@import url(small.css) and screen only (max-width:480px); @import url(medium.css) and screen only (min-width:481px) and (max-width:1024px); etc.
Ou combinaison de ces deux moyens. Je ne sais pas si ça change quelque chose sur les performances par exemple, ou si l’appel séparé via le head permettrait de ne pas charger inutilement une feuille de style qui ne sera pas exploitée par le support ?
Layouts
Dans presque tous les tutos que j’ai lus à ce sujet, un layout (structure) est déterminé par défaut dans les règles communes puis ces règles sont surchargées en cas de (écran plus petit, écran plus grand, etc.). Cela impose, comme vous pouvez le voir dans l’exemple de css publié par Raphaël sur Alsacréations (lien plus bas) d’y aller parfois à coups de serpe avec des !important
pour être sûr que la règle pèsera plus lourd que celle lue en premier.
Cela veut dire aussi que les « mauvaises » règles sont lues/chargées en plus des « bonnes », celles dont on a vraiment besoin à ce moment-là.
Je ne suis pas sûre de ne pas me tromper car je trouve bizarre de ne l’avoir pas vu faire comme ça ailleurs, mais j’ai choisi quant à moi de ne définir dans les règles communes que celles qui le sont réellement et de déporter toutes les autres dans les @media
kivonbien. Ça m’évite aussi d’avoir trop à me préoccuper du poids respectif de chaque règle.
À quelles valeurs fixer les seuils ?
Une fois qu’on s’est dit qu’on allait adapter la présentation en fonction de la place disponible, encore faut-il se poser la question des seuils. Le premier est – relativement – facile : une grande partie des téléphones mobiles affiche 320px en largeur (480 en mode paysage quand celui-ci existe). Mais après ? C’est qu’il y a des écrans qui vont chercher dans les 2500 pixels de large maintenant. 320px (voire moins) à 2520px (voire plus) ça fait un paquet de possibilités !
Le site mediaqueri.es, qui offre une galerie de design adaptatifs n’explique pas non plus (ou je n’ai pas trouvé) la base qui explique leurs choix de captures (320, 768, 1024, 1600). Enfin si, ils disent smartphone, tablet, netbook, desktop, mébon ça fait quand même un peu doigt-mouillé comme méthode.
J’ai cherché de la littérature à ce sujet mais n’ai rien trouvé. Les articles trouvés sur le web ne justifient pas leurs choix de seuils (hormis celui de 320/480) ou ne les expliquent que par les ipad, iphone et autres produits Mac, ce que je trouve un peu biaisé.
Puis, une nuit de sommeil et la réflexion aidant, la Lumière m’est apparue brusquement et j’ai LA réponse : ça dépend ! Aaaah tout de suite on se sent mieux, pas vrai ? Non mais sérieux, il n’y a pas d’autre réponse je crois, car ça dépend de la variation que vous appliquez et à quelle dimension elle se justifie. Par exemple j’estime que la lecture d’un article en pleine page est plus confortable tant que l’écran est moins large qu’environ 900-1000px, surtout que ça permet de mettre une marge confortable à gauche et à droite, ce que j’apprécie beaucoup. Ce « seuil » se justifie pour moi aussi dans ces eaux-là car j’ai choisi de laisser la taille des caractères par défaut du navigateur, couramment réglée sur 16px et que jusqu’à 900-1000px avec marges ça correspond à un nombre de caractères par ligne que j’estime harmonieux.
Voilà donc le seuil que je fixe pour le passage de 1 colonne à 2 colonnes. J’y ajoute ensuite des ajustements (titre plus petit sur tout petit écran, marge de plus en plus grande selon la taille, etc.).
Mise en œuvre
Pour représenter graphiquement les seuils et les queries correspondants, voici l’infographie de ce qui se passe ici[1].
J’ai donc deux « groupes » principaux correspondant à la structure de la page :
- moins de 960px :
screen and (max-width:960px)
(1 colonne) ; - plus de 961px :
screen and (min-width: 961px)
(2 colonnes) ;
J’y ajoute :
- 480px pour le seuil entre petit et grand titre ;
- 640px pour le seuil entre toutes petites marges latérales et grandes marges latérales.
À noter, c’est aussi à 640px que je fixe le seuil d’adaptation de la taille de l’image maximale ainsi qu’une règle spécifique censée améliorer la lisibilité sur les écrans i-Quelquechose
S’il en manque en cours de route, on avisera !
Largeur de fenêtre ou largeur d’écran ?
Oh, that is the question my dear. Regarde dans le fichier user_head.html
: la deuxième partie fait appel à un script javascript (références en bas de ce billet) pour que les media queries soient comprises par les navigosores. Au-dessus figure cette ligne :
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0;" />
La différence entre width
et device-width
c’est que le premier tient compte de la largeur de la fenêtre de consultation et le deuxième de la largeur de l’écran. La règle width=device-width
c’est celle qui lui dit en gros : écoute, pépère, cherche pas à savoir si j’ai un androïd ou si j’ai quinze fenêtres ouvertes côte à côte sur mon 27 pouces ; ne t’occupe que de la taille qu’a mon site pour s’y étaler.
Dans les articles peu favorables à l’utilisation massive (et il faut bien le dire très à la mode) des media queries, je suis assez sensible à l’argument « Nautamine » : par pitié ne me donnez pas le mal de mer si j’ai le malheur de retailler ma fenêtre de navigateur.
Du coup… je doute !
Bibliographie sélective
Galeries
- mediaqueri.es : galerie de démonstrations d’utilisation des media queries.
Articles en français
- Les Media Queries CSS3, par Dew, sur Alsacréations. Impeccable pour une première approche ; complet et didactique.
- Faut arrêter avec les Media Queries ! par Rémi, sur hteumeuleu. Un contrepoint intéressant, qu’on y adhère ou pas. C’est toujours bien devant un effet de mode que les arguments contre soient entendus et discutés.
Articles en anglais
- La documentation du W3C évidemment.
- Responsive web design, par Ethan Marcotte sur A List Apart. Comme c’est bien souvent le cas pour les articles d’A List Apart, celui-ci fait référence.
- CSS Media Query for mobile is fools gold et un article « contre ».
- List of displays by pixel density sur Wikipedia. Un recensement de la majeure partie des tailles d’écran. Assez parlant…
Outils
- CSS3 mediaqueries js : un script javascript qui permet l’utilisation des media queries sur les vieux navigateurs.
- Une feuille de styles de base pour le web mobile, par Raphaël, sur le toujours indispensable Alsacréations.
Notes
[1] Yapa à dire, tu as la classe pour les infographies, merci Franck !
21 réactions
1 De brol - 24/05/2011, 16:53
Bonjour,
Une pétouille :
manque un / de fin à : <meta name=”viewport” content=”width=device-width; initial-scale=1.0; maximum-scale=1.0;”>
et je suis un peu embêté (pour mon confort perso) de ne pas avoir l’affichage 2 colonnes en 1280. il serait peut-être intéressant de connaître le % de chaque résolutions écran avant de fixer la répartition du nombre de colonnes ?
Merci.
2 De Kozlika - 24/05/2011, 17:00
Je n’ai pas bossé encore sur les structures ! (cf. le zip en téléchargement du Jour 1) Je te rappelle que c’est un chantier en live, hum ?
Merci pour la coquille, je corrige de ce pas :-)
3 De Kozlika - 24/05/2011, 17:03
Euh… c’est quoi cette histoire de pourcentage de chaque résolution ? Tu parles du pourcentage de visiteurs ? Non pertinent pour moi dans le cadre d’un thème distribuable : j’ai lu récemment chez Eric Daspet ses stats à ce sujet : il a énormément de visiteurs sur téléphone. Sur mon blog perso, je n’en ai pratiquement aucun :-)
4 De brol - 24/05/2011, 17:45
Ahhhhh, qu’elle est donc cette fourberie ? L’image ne correspond plus (http://brol.info/divers/media-queri… - pratique le cache) à ce que j’ai vu quand j’ai écrit mon premier commentaire !
Bon, je parle du pourcentage de visiteur en général, pas de ton blog ou de celui d’un autre, mais plutôt de ce genre de zinzin : http://www.strategiesdunet.com/blog… en plus récent évidemment.
D’autre part, je suis étonné que tu mélanges les réso écran (ordi) et celles des smartmachins (yc tablettes).
Je pensais, visiblement à tort, qu’on s’orientait vers une css pour les écrans et une autre pour les machins mobiles.
Dernière râlerie, pas top pratique la largeur de la zone de commentaire…
5 De Kozlika - 24/05/2011, 18:02
Brol, tu serais bien gentil mon bon de lire un peu les billets ici pour comprendre dans quel contexte tu te situes : ce blog se présente tel que le thème avance.
IL N’EST PAS FINI IL COMMENCE À PEINE.
Rapelle-toi qu’au Jour 1 nous n’avons mis en place que le ”rebase.css” pour mettre tous les navigateurs d’accord, la couleur des liens et une ou deux règles pour vérifier que les media queries sont correctement en place. C’est donc *normal* que tu ne visualises pas de deuxième colonne et que la zone de commentaires ne soit pas tout à fait comme il faut ! Je dirais même que mon rebase est rudement bien puisqu’il te donne l’impression qu’à un poil près tu es devant un thème fini :-)
(L’infographie ne correspond plus parce que Franck l’a refaite pour mieux coller aux explications.)
Le pourcentage des visiteurs en général me dira les résolutions d’écran les plus répandues mais pas la largeur du navigateur ni si Ductile a des seuils plus pertinents que d’autres à fixer.
L’un des objets de l’article d’aujourd’hui étant précisément d’évoquer (c’est le sujet de la dernière partie) le dilemme résolution d’écran vs. taille de la fenêtre je ne sais pas ce qui a pu te faire penser qu’on se dirigeait vers une css desktop/netbook et une css mobile ?
6 De brol - 24/05/2011, 18:33
J’ai bien compris que tout ceci évoluait au fil des billets. Je ne suis pas tout à fait bouché.
J’ai également bien compris que tu invitais les gens à discuter des orientations (avoir une zone de commentaire un poil plus mieux foutue participe au confort de ceux qui vont jouer le jeu, enfin dans mon joli monde à moi). Je peux très bien ne plus intervenir si tu veux.
J’imagine que cette partie :
@import url(small.css) and screen only (max-width:480px);
@import url(medium.css) and screen only (min-width:481px) and (max-width:1024px);
etc.
me laissait à penser qu’il y aurait une css en fonction de la taille de la fenêtre (ou du navigateur), et par extrapolation une css desktop/netbook et une css mobile.
Bon, la pétouille a été corrigée dans le billet, pas dans le code.
7 De Ombre (aka patidou) - 24/05/2011, 18:43
Bonjour Kozlika,
En ce qui me concerne j’utilise :
<meta name=”viewport” content=”width=device-width, minimum-scale=1.0” />
…pour le viewport. Pour ce qui est du fichier css, je dois encore prendre en compte les iPads (en plus de petites corrections ici et là). Je vais le corriger ce soir.
Tu peux aller voir ce billet :
http://lombre.net/post/2010/10/24/P…
(avec ses commentaires), il y a quelques liens utiles.
8 De Kozlika - 24/05/2011, 18:49
Salut Patidou, merci de ta visite :-)
Ce qui m’intéresserait le plus, c’est de savoir pourquoi via meta dans le head ? Ou, disons, qu’est-ce qui compte comme critère dans la décision de plutôt comme ci ou comme ça ?
9 De patidou - 24/05/2011, 19:10
Si on n’utilise pas cette meta dans le head, mon iPhone 3G affiche le site dans sa résolution virtuelle qui est beaucoup lus grande que la résolution de l’appareil. Conséquences : tout est trop petit à l’écran et ce n’est pas zoomable. L’enfer.
La solution de la meta n’est pas la meilleure car figée dans le code html de la page, c’est pour ça que Opera propose de déporter les informations de viewort dans la css :
http://www.opera.com/docs/specs/pre…
Il faut voir si le w3c va accepter cette technique. ;-)
De mon côté j’ai pas mal galéré et expérimenté (et je n’ai pas encore tout compris). Au départ j’avais même ajouté un maximum-scale=1.1 mais ça bloquait le zoom et certaines personnes ayant une mauvaise vue ne pouvaient plus agrandir le texte.
Au final je me suis inspiré de la css de alsacréations et surtout des bonnes pratiques de html5 boilerplate (la plupart transposables en xhtml 1.0).
10 De Kozlika - 24/05/2011, 23:33
Vi vi Patidou, désolée je me suis mal exprimée. Je sais tout ça, ma question est de savoir quelle est la différence (en terme de performances ou d’effet) entre appeler la feuille de style dans le head ou via @import ou @media dans la feuille de style maîtresse. Ce n’est donc pas de cette meta dont je parle mais de lignes du genre :
<link rel="stylesheet" media="only screen and (max-width: 480px)" href="small.css" />
brol > pas de soucis, commente autant que tu veux. Simplement ce blog vivant au même rythme que les “Jour x” l’espace des commentaires ne sera modifié que quand on en sera là :-)
11 De mirovinben - 25/05/2011, 07:40
Concernant “largeur de la fenêtre de consultation / largeur de l’écran” : je suis partisan de “largeur de l’écran” (comme Nautamine si j’ai bien tout compris).
12 De Patidou - 25/05/2011, 13:29
Quand on utilise @import, les navigateurs (je ne sais plus si c’est seulement IE ou tous) téléchargent les CSS les unes après les autres, tandis qu’avec <link> elles sont téléchargées simultanément. Donc gain en rapidité.
Avec la syntaxe que tu donnes dans ton commentaire, il y aura autant de feuilles de styles que de queries, donc à chaque fois une requête http, ce qui a aussi un effet sur les performances.
Maintenant rien n’empêche de tout séparer pendant la phase de conception pour la facilité de gestion et de tout regrouper dans une CSS unique (avec des @media) pour la version finale. ;-)
13 De Patidou - 25/05/2011, 13:42
Et pour ce qui est du débat largeur d’écran/largeur de fenêtre, j’ai mis les deux :D :
@media handheld, only screen and (max-device-width:500px), only screen and (max-width:500px), only screen and (-webkit-min-device-pixel-ratio: 1.5) {
/*styles*/
}
Avantage, je peux voir ce que donne la version mobile en rétrécissant la fenêtre du navigateur sans devoir dégainer l’iPhone. D’ailleurs je trouve ça plus pratique un site qui s’adapte à mon navigateur pour faciliter sa lecture. ;-)
Exception : les styles pour l’iPad.
14 De Kozlika - 25/05/2011, 15:27
Pourquoi pas directement un width=device-width en ce cas ?
15 De Patidou - 25/05/2011, 15:38
Là je t’avoue que je ne connais pas la différence…
16 De lipki - 26/05/2011, 01:00
Je vote pour largeur de fenêtre.
S’il me prend l’envie de réduire une fenêtre, c’est pour qu’elle prenne moins de place, et par extension, que le contenu prenne moins de place, tout en restant lisible.
Actuellement on doit jongler avec deux scrollbar, c’est désagréable.
Les ceuse qui se plaigne des effets sur leur estomac fragile, sont juste des gonzesse.
(Oh mon dieu le sid-menu à disparu, je suis déstabilisé ! )
17 De Black Angel - 02/06/2011, 14:51
J’ai une nette préférence pour la taille de la fenêtre. En effet, comme lipki, si je redimensionne ma fenêtre, c’est pour pouvoir toujours lire le contenu dans un espace plus réduit afin d’avoir d’autres fenêtres ouvertes.
Et je ne vois pas d’effets nauséeux pour moi quand j’ai 3 autres pages ouvertes sur mon écran dont une vidéo, un jeu et une page web clignotante de 25 pubs par millimètre carré. ;-)
18 De Kozlika - 16/06/2011, 00:29
OK. Donc j’ai gardé le réglage en fonction de la taille de fenêtre (et non de viewport) et je fixe les seuils à 480, 640, 1024, 1280 et 1600 pour faire varier le nombre de colonnes et les marges – et ajuster les présentations de certains éléments en conséquence.
Si j’ai le temps demain, j’ajouterai dans la page des maquettes des screenshots correspondants. Cela dit je n’ai pas d’écran qui monte à 1600 donc aide bienvenue !
19 De Kozlika - 16/06/2011, 00:31
Ah et je remettrai la possibilité de zoom sur petit écran, c’est casse-pied de ne pas l’avoir.
20 De lipki - 16/06/2011, 02:12
http://img4.hostingpics.net/pics/70…
J’ai choisi une page courte pour éviter la scrollbar, mais si tu en veut une autre, demande.
21 De Kozlika - 16/06/2011, 22:00
Merci lipki !
Petite récap des seuils (vous la retrouverez en commentaire en haut du fichier mediaqueries.css à la prochaine livraison) :
Jusqu’à 480px: tout en une colonne, sidebar et stickers en bas
480px: passage des stickers en haut
640px: sidebar toujours en bas mais divisé en deux colonnes
1024px: passage à deux colonnes, sidebar à droite
1280px: décalage du post-info vers la gauche
1600px: marges plus grandes */