@media - Directive CSS
Résumé des caractéristiques de la directive @media
Description de la directive @media.
@media est une directive existant depuis longtemps dans le langage CSS. Elle a cependant été considérablement
enrichie avec les requêtes-média (media-queries).
Elle permet d'appliquer des styles en fonction des possibilités du terminal sur lequel la page est consultée.
L'exemple ci-dessous applique des marges nulles à gauche et à droite si l'écran utilisé est plus haut que large (portait).
@media(orientation:portrait) {
margin-left:0;
margin-right:0;
}
Mais il est possible tout aussi bien de tester une valeur par comparaison avec les opérateurs > ou <, ou même,
par une fourchette :
@media(width > 800px) {
margin-left:100px;
}
@media(500px <= height < 800px) {
margin-top:30px;
}
Dans sa définition initiale, @media permettait seulement de cibler le périphérique en fonction de son type : imprimante, écran, smartphone, etc.
En utilisant cette directive, il était donc possible de définir des mises en page spécifiques à chaque type de périphérique.
Cette solution a néanmoins été abandonnée car elle manquait de précision. En effet un écran de smartphone a parfois autant de définition qu'un écran de bureau.
Et de nombreuses autres caractéristiques sont souvent nécessaires : présence d'un pointeur précis (souris, tablette), nombre de couleurs que l'écran peut
restituer, etc.
Depuis CSS3 la directive @media a été enrichie et permet maintenant de cibler un périphérique de façon beaucoup plus précise, en fonction de ses
possibilités. On parle alors de media-query.
Si toutefois vous souhaitez consultez les explications sur l'ancienne syntaxe de @media, reportez-vous à la
fin de cette page.
Media queries disponibles.
La syntaxe complète des media queries permet de cibler un périphérique de façon beaucoup plus fine que simplement son type : on peut cibler le périphérique à partir de ses caractéristiques (media features) comme la résolution, sa capacité à restituer les couleurs, la présence d'une souris, etc.
Liste des caractéristiques (media features) disponibles :
Syntaxe générale de la directive @media.
Caractéristiques de l'écran :
- Aspect-ratio
- Display-mode
- Environment-blending
- Height
- Horizontal-viewport-segments
- Orientation
- Resolution
- Shape
- Vertical-viewport-segments
- Width
Présence d'un accessoire de pointage (souris par exemple) :
Restitution des couleurs :
- Color
- Color-gamut
- Color-index
- Dynamic-range
- Inverted-colors
- Monochrome
- Video-color-gamut
- Video-dynamic-range
Technologie du périphérique :
Préférences utilisateur :
- Forced-colors
- Prefers-color-scheme
- Prefers-contrast
- Prefers-reduced-data
- Prefers-reduced-motion
- Prefers-reduced-transparency
Autres caractéristiques diverses :
Syntaxes générales des requêtes media queries.
- @media (width >= 900px) { ... } @media (min-width:900px) { ... } @media screen and (min-width:900px) { ... }
Comparaison à une valeur numérique.
Toutes ces syntaxes sont équivalentes et ciblent les périphériques dont la définition en largeur est supérieure ou égale à 900 pixels. La première syntaxe, la plus récemment définie, est la plus lisible. Elle est maintenant bien reconnue et peut être utilisée sans gros risque de compatibilité avec les navigateurs actuels. Reportez-vous cependant à tableau de compatibilité figurant au bas de cette page.
Le fait de faire précéder la condition par
screen andest une précaution devenue quasiment inutile : elle assurait la compatibilité avec les vieux navigateurs. Même si le navigateur ne reconnaît pas la partie entre parenthèses, il reconnaît néanmoins le motscreen.On remarque que toutes les valeurs sont suivies d'une unité, qui sont les unités habituelles en CSS (voir les unités de dimension). On évitera cependant d'utiliser les unités relatives, qui n'ont pas beaucoup de sens dans ce contexte, mais qui sont néanmoins acceptées par la syntaxe. Elles sont alors déterminées par rapport à la valeur initiale : par exemple l'unité
emest calculé par rapport par rapport à la valeur initiale de la propriétéfont-size.La condition doit être inscrite entre parenthèses.
Dans quelques cas, il suffit d'indiquer le nom de la caractéristique, sans préciser de valeur. Par exemple
(color)cible les périphériques capables de restituer les couleurs, en excluant les périphériques monochromes.Si une condition fait référence à une caractéristique inexistante sur le périphérique concerné, la requête media query est fausse. Par exemple une condition sur le pointeur (souris) alors que le périphérique est une imprimante, rend l'ensemble de la requête faux : les styles ne sont pas appliqués.
- @media (900px <= width <= 1200px) { ... } @media (width >= 900px) and (width <= 1200px) { ... } @media (min-width:900px) and (max-width:1200px) { ... }
Fourchette de valeurs.
Les trois syntaxes ci-dessus sont équivalentes, et ciblent les périphériques dont la définition horizontale est comprise entre 900 pixels et 1200 pixels, bornes incluses. La première syntaxe est naturellement beaucoup plus claire puisqu'il est possible de définir une fourchette en une seule écriture.
- @media (orientation: portrait) { ... }
Comparaison à une valeur prédéfinie.
Certaines caractéristiques ne sont pas exprimées en valeurs numériques. Dans notre exemple, l'orientation peut être
portraitoulandscape. Les opérateurs>et<n'ont pas de signification dans ce cas de figure. De même les syntaxes avec les préfixesmin-etmax-ne sont pas possibles avec les caractéristiques non numériques :min-orientationn'a pas de sens.La syntaxe utilise ici le caractère deux points. Attention à ne pas utiliser le signe égal, qui serait pourtant plus intuitif puisque les opérateurs
<=et>=sont eux reconnus. - @media (width >= 1200px) and (height >= 900px) { ... } @media (width >= 1200px), (height >= 900px) { ... } @media (width >= 1200px) or (height >= 900px) { ... }
Combinaison de plusieurs conditions.
Les conditions multiples peuvent être associées par un ET logique. dans ce cas le mot
anddoit être précisé, ou par un OU logique, qui se traduit par une virgule entre les critères ou par le motor. Dans tous les cas, chacune des conditions doit se trouver entre parenthèses.Si le mot
orest utilisé à la place de la virgule, et que l'écriture fait intervenir à la fois desandet desor; il faudra obligatoirement préciser l'ordre de traitement en utilisant des parenthèses.@media (height < 900px) and (width < 900px) or (width > 1000px) est incorrect. @media (height < 900px) and ((width < 900px) or (width > 1000px)) est correct. - @media not (width >= 1200px) { ... } @media not (width >= 1200px), (height >= 900px) { ... }
Inversion d'une condition.
Le mot
notest l'opérateur de négation habituel. Notre premier exemple cible les périphériques dont la définition horizontale est inférieure à 1200 pixels.Dans le deuxième exemple, il faut noter que la négation ne s'applique que à la première condition. Il cible donc les périphériques dont la définition horizontale est inférieure à 1200 pixels et également ceux dont la définition verticale est supérieure à 900 pixels (la négation ne s'applique pas sur cette deuxième requête).
Le mot
notdoit obligatoirement être suivi par un espace avant la parenthèse ouvrante, pour éviter la confusion avec une fonction. - @media only print and (monochrome) { ... }
Le mot-clé
only.Le mot
onlyavait été défini pour assurer la compatibilité avec les anciens navigateurs, qui ne reconnaissent que le type de média (print) et pas la media queries qui suit(monochrome).
Sans cette précaution, les anciens navigateurs risquent d'appliquer à tord les styles à toutes les imprimantes, même celles qui ne sont pas monochromes.Le mot
only, ajouté avant le type de périphérique, est interprété par les anciens navigateurs comme un périphérique inconnu et empêche l'application à tord des styles à toutes les imprimantes.
onlyest neutre pour les navigateurs plus modernes qui traient la syntaxe complète des media queries.Cependant, cette précaution est maintenant inutile compte-tenu du fait que pratiquement tous les navigateurs reconnaissent la syntaxe complète des media queries.
Requêtes media queries pour évaluer les dimensions du périphérique.
- @media (width < 21cm) { ... } @media {height < 29.7cm) { ... } @media (device-width < 21cm) { ... } ✗ @media {device-height < 29.7cm) { ... } ✗
Les deux conditions
widthetheightcorrespondent à la largeur et à la hauteur du viewport s'il s'agit d'un périphérique à défilement continu comme un écran, ou aux dimensions de la boîte de page s'il s'agit d'un périphérique paginé comme une imprimante.widthetheightpeuvent être comparées à n'importe quelle valeur suivie d'une unité de dimension (voir les unités de dimension). Notre exemple utilise des centimètres, ce qui est courant pour caractériser une imprimante ; pour un écran on utilisera plutôt des pixels.Les anciens termes
device-widthetdevice-heightne doivent plus être utilisés.Si vous regardez cette page sur un PC de bureau, l'élément ci-dessous doit être bleu. En réduisant la largeur de la fenêtre, il devient transparent.
(width >= 1000) - @media (aspect-ratio > 1) { ... } @media (device-aspect-ratio > 1) { ... } ✗
La ratio est calculé par la formule : largeur divisé par hauteur. Cette information permet de déterminer l'orientation (voir ci-après) et la forme de l'écran. En particulier, un ratio de
1indique un écran carré, comme celui d'une montre connectée.Le terme
device-aspect-ratioest obsolète et ne doit plus être utilisé, bien que certains navigateurs le reconnaissent encore pour des raisons de compatibilité.La couleur de l'arrière-plan de l'élément ci-dessous réagit à l'orientation de l'écran. Sur un PC, vous pouvez simuler cela en réduisant la largeur de la fenêtre du navigateur.
(aspect-ratio > 1) - @media (orientation: portrait) { ... }
orientationne peut prendre que deux valeurs :portraitoupaysage. Les opérateurs<et>ne sont donc pas acceptés avecorientation.L'orientation est déterminée sur
paysagedès la largeur est supérieure ou égale à la hauteur. Un écran carré, comme celui d'une montre, aura donc une orientation en paysage.
Sur un terminal mobile comme un téléphone,orientationpermet de déterminer si l'appareil est tenu verticalement ou horizontalement. Sur un PC de bureau vous pouvez simuler cela en réduisant la largeur de la fenêtre jusqu'à la rendre inférieure à sa hauteur.(portrait:portrait)
Requêtes media queries pour évaluer la qualité de la restitution.
- @media (resolution > 300dppx) { ... }
Cette requête media queries cible les périphériques en fonction de la résolution de l'écran, c'est à dire le nombre de pixels sur une distance donnée. La plupart du temps la résolution d'un écran est la même horizontalement et verticalement ; si ce n'est pas le cas, c'est la résolution verticale qui est prise en compte.
La valeur comparée à
resolutiondoit être suivie d'une unité de résolution comme par exempledpi(DotPerInch ou Points par pouce). Voir les unités de résolution.La valeur
infinitepeut être utilisée, elle correspond aux périphériques qui ne sont pas pixelisés, comme par exemple les traceurs.Sur un écran d'ordinateur de bureau, le premier rectangle au moins devrait être affiché en bleu. Sur un téléphone portable il est possible que les deux rectangles soient bleus.
(resolution > 100dpi)(resolution > 200dpi) - @media (shape: rect) { ... } ⚠ @media (shape: round) { ... } ⚠
Avec
shapeil est possible de tester la forme de l'écran, entre arrondie (round) et rectangulaire (rect). Cette possibilité sera de plus en plus utile avec l'apparition des montres connectées.rect: l'écran a une forme rectangulaire ou qui s'en approche, comme une forme de rectangle aux coins arrondis.round: l'écran a une forme circulaire, ou qui s'en approche, comme un ellipse.
Si votre navigateur reconnaît la media-query
shape(et que vous consultez la page sur un écran rectangulaire), l'élément ci-dessous sera bleu. Dans le cas contraire, il sera transparent.(shape:rect)
Requêtes media queries pour évaluer la technologie de terminal.
La diversification de plus en plus importante des périphériques nécessite de pouvoir tester la technologie utilisée : écran cathodique (en voie de disparition), écran LCD, imprimante, traceur, panneau d'affichage, montre connectée, système pour la réalité augmentée, etc.
- @media (scan: interlace) { ... }
Cette requête media queries cible les périphériques en fonction du type de balayage de l'écran. Elle permet de distinguer les écrans cathodiques des écrans à LCD modernes. Cependant les écrans cathodiques sont devenus très rares à l'heure actuelle. Certaines polices de caractères sont mal restituées sur les écrans entrelacés, en particulier les polices avec empattements.
Les valeurs possibles sont :
interlace: les écrans cathodiques fonctionnent sur ce principe, qui permet de diminuer le scintillement, donc la fatigue visuelle. Cela consiste à tracer les lignes paires lors d'un premier balayage, et les lignes impaires lors du balayage suivant.progressive: tous les écrans actuels (LCD) fonctionnent sur ce principe.
(scan:progressive) - @media (grid) { ... }
Cette syntaxe détecte si l'écran reconstitue les caractères à partir d'une matrice de points de dimensions fixes. Plus aucun écran ne fonctionne comme ça : cette requête renvoie toujours faux.
(grid) - @media (update: slow) { ... }
Cette requête media queries cible les écrans en fonction de leur capacité à mettre à jour le contenu après le premier affichage. Très utile pour décider si les animations peuvent être activées ou non. De même les réactions aux actions de l'utilisateur (pseudo-classe
:hover) risquent d'être mal rendues sur un écran trop lent.Les valeurs acceptées sont :
none: la mise à jour n'est plus possible après la première restitution. C'est le cas des imprimantes par exemple.slow: le rafraîchissement de l'écran est possible mais lent.fast: le rafraîchissement de l'écran est suffisamment rapide pour restituer les animations.
La valeur peut être omise. Dans ce cas
(update)indique qu'une mise à jour est possible mais sans donner d'information sur sa rapidité.L'élément ci-dessous sera probablement bleu, sauf si votre navigateur ne reconnaît pas la media-query
update.(update:fast) - @media (overflow-block: none) { ... } @media (overflow-inline: none) { ... }
Ces deux media queries ciblent les périphériques en fonction de leur comportement en cas de débordement du contenu. Pour
overflow-blockil s'agit d'un débordement dans la direction des blocs, c'est à dire le sens vertical pour les langues latines), et pouroverflow-inlinece sera le débordement dans la direction des lignes.Les valeurs possibles pour
overflow-blocksont :none: le débordement est impossible. Le contenu excédentaire n'est pas affiché, comme par exemple sur un panneau d'affichage électronique.scroll: le contenu excédentaire est affiché en dehors de la zone visible ; le lecteur peut le consulter en faisant défiler. C'est le cas des écrans.paged: le contenu excédentaire est rejeté sur une nouvelle page. C'est le cas des imprimantes.
Si la valeur est omise
(overflow-block)indique qu'un débordement est possible mais sans indiquer le type de débordement.Pour
overflow-inline, les valeurs possibles sont :none: le contenu excédentaire n'est pas affiché, et il n'y a pas de moyen pour l'utilisateur de le faire apparaître.scroll: le lecteur peut faire apparaître le contenu excédentaire en faisant défiler l'écran (présence de barres de défilement par exemple.
Si la valeur est omise
(overflow-inline)est équivalent à(overflow-inline: scroll).Sur les échantillons ci-dessous, le premier doit être bleu sur un écran, et le deuxième doit être bleu sur un aperçu avant impression.
(overflow:scroll)(overflow:paged)
Requêtes media queries concernant la gestion des couleurs.
- @media (color) { ... } @media (color >= 8) { ... }
Cette requête media queries permet d'évaluer la capacité du périphérique à restituer les couleurs. La première syntaxe détermine seulement si le périphérique est en couleurs ou non. La deuxième permet de tester le nombre de bits réservés à chaque couleur. Si le périphérique est monochrome, le nombre de bits est
0.Si la première syntaxe est intéressante pour distinguer par exemple une imprimante en couleurs d'une imprimante noir et blanc, mais la deuxième ne donne pas une information très précise sur la gestion des couleurs du périphérique. Il sera sans doute plus intéressant d'utiliser
color-gamut(voir plus loin).Sur votre écran le premier élément sera probablement bleu, pas le second. Les couleurs sont en effet gérées avec 8 bis par couleur de base sur la plupart des systèmes.
(color >= 8)(color >= 16) - @media (color-index > 128) { ... }
Cette requête media queries permet de cibler les périphériques qui gèrent des couleurs indexées. La valeur indiquée correspond au nombre de couleurs dans l'index. Si le périphérique ne gère pas les couleurs par un index, la valeur est
0.Ci-dessous, le premier élément doit être bleu (pas de couleurs indexées), et le deuxième transparent.
(color-index >= 0)(color-index > 100) - @media (monochrome) { ... } @media (monochrome >= 4) { ... }
La première syntaxe cible les périphériques monochromes. La deuxième est plus précise : elle cible les périphériques monochromes qui gèrent le gris avec au minimum 4 bits par pixels (16 niveaux de gris).
L'échantillon ci-dessous doit être transparent car vous consultez cette page sur un écran couleur (probablement).
(monochrome) - @media (color-gamut: p3) { ... }
Cette syntaxe cible les périphériques capables de restituer l'espace de couleurs
p3. Reportez-vous si nécessaire à cette présentation des espaces de couleurs.color-gamutpermet d'envoyer les images qui correspondent le mieux aux capacités du périphérique.Les principales valeurs acceptées sont :
srgb: le périphérique est capable de restituer à peu près toutes les couleurs de l'espacesrgb, ce qui à l'heure actuelle, devrait être toujours le cas, cet espace de couleurs étant le moins exigeant, sauf bien sûr s'il s'agit d'un périphérique monochrome.p3: espace de couleurs plus large quesRGB.rec2020: espace de couleurs encore plus large quep3.
color-gamutpeut être vrai sur plusieurs valeurs. Par exemple si un écran supporte l'espacerec2020, il supportera également lep3et lesRGB. Pour cette raison, il faudra prendre soin d'écrire les directives@mediadans l'ordre croissant (en commençant parsrgbet en terminant par l'espace de couleurs le plus étendu).Sauf si vous utilisez un écran haut de gamme, il est probable que son gamut soit
sRGB. Vous pouvez le vérifier si le premier élément est bleu et le deuxième transparent.(color-gamut:sRGB)(color-gamut:p3) - @media (dynamic-range: high) { ... }
dynamic-rangecaractérise le contraste maximal que peut restituer un écran. Cette caractéristique se décompose en trois :- La luminosité maximale.
- Le contraste maximal, c'est à dire le ratio entre la luminosité maximale et la luminosité minimale que le systéme est capable de restituer.
- La profondeur de couleur, autrement dit le nombre de bits utilisées pour coder les couleurs.
Les valeurs possibles sont :
high: le périphérique supporte les fortes luminosités et les forts contrastes. D'autre part, les couleurs sont représentées sur au moins 24 bits.standard: tous les périphériques, même ceux qui ne présentent pas les caractéristiques décrites ci-dessus.
Ici aussi, il est probable que votre écran soit dans la catégorie standard.
(dynamic-range:standard)(dynamic-range:high) - @media (inverted-colors: inverted) { ... }
Une inversion des couleurs peut se produire par exemple lorsque l'utilisateur bascule son terminal en mode nuit (ou foncé).
inverted-colorsne réagit pas lorsque l'inversion est due à une règle de la feuille de styles.Les valeurs possibles pour
inverted-colorssont :none: lorsque les couleurs sont affichées normalement.inverted: les couleurs s'affichent inversées (les tons clairs sont sombres, et vice-versa).
La valeur peut être omise :
(inverted-colors)est équivalent à(inverted-colors:inverted).Si l'inversion des couleurs améliore la lisibilité du texte dans certaines conditions, elle pose un problème avec les images et les vidéos car ces éléments se retrouvent eux aussi affichés en négatif. Pour compenser ce problème, les navigateurs comportent en principe le code ci-dessous dans leur feuille de styles intégrée :
@media (inverted-colors) { img, video { filter: invert(100%); } }(inverted-color:none)(inverted-color:inverted) - @media (video-color-gamut: srgb) { ... }
Cette requête media queries a le même rôle que
color-gamutmais s'applique aux vidéos. Les valeurs possibles sont également les mêmes :srgb,p3, etc.Si votre navigateur reconnaît la media-query
video-color-gamut, le premier rectangle sera bleu, le deuxième transparent.(video-color-gamut:srgb)(video-color-gamut:p3) - @media (video-dynamic-range: hight) { ... }
Les valeurs et le rôle de
video-dynamic-rangesont les mêmes que pourdynamic-rangemais s'appliquent plus spécialement aux vidéos.Si votre navigateur reconnaît la media-query
video-dynamic-range, le premier rectangle au moins sera bleu.<(video-dynamic-range:standard)(video-dynamic-range:high) - @media (horizontal-viewport-segments: 2) { ... } @media (vertical-viewport-segments: 2) { ... }
Il arrive que l'écran soit physiquement divisé en plusieurs parties. C'est le cas par exemple des téléphones pliables comportant une charnière au milieu de l'écran, ou des écrans immenses utilisés en événementiel, et qui sont composés de plusieurs écrans juxtaposés.
La plupart des écrans domestiques sont composés d'un seul segment. Mais peut-être disposez-vous d'un écran qui en comporte plusieurs.
(vertical-viewport-segments:1)(vertical-viewport-segments > 1) - @media (display-mode: fullscreen) { ... }
Cette requête media queries permet de cibler les applications en fonction de leur mode d'affichage.
Les valeurs possibles sont :browser: affichage classique de la page dans un navigateur.fullscreen: plein écran. Cet affichage est accessible sous Windows avec la toucheF11. Tout ce qui n'est pas la page elle même est masqué : barre de menus, barre d'outils, barre d'adresse, titre de la fenêtre, etc.standalone: la page est affichée comme si elle était une application. Les accessoires spécifiques à la navigation web sont masques (barre d'adresse, boutons de navigation...) mais les éléments du système sont affichés (titre des fenêtres par exemple).minimal-ui: semblable àstandalonemais quelques éléments permettant la navigation sont affichés.
En affichage normal, seul le premier élément ci-dessous est bleu. Si vous passer en plein-écran (
F11sous windows), ce sera le deuxième élément qui deviendra bleu.(display-mode:browser)(display-mode:fullscreen) - @media (environment-blending: opaque) { ... }
Littéralement cette requête media queries permet de tester comment l'affichage se mélange avec l'environnement réel. Par exemple, les écrans d'aide à la conduite dans une voiture sont transparents et superposent leur affichage à la vision de l'environnement. Plus généralement, cela concerne toutes les applications en réalité augmentée.
Les valeurs acceptées sont :
opaque: l'écran n'est pas transparent.additive: l'écran est transparent et superpose son affichage à la vision réelle. Le noir est restitué comme transparent.subtractive: l'écran "soustrait" son affichage de la vision réelle : c'est le blanc qui est sans effet car rendu comme transparent. Ce type d'affichage correspond par exemple à un afficheur intégré à un miroir.
Sur un PC traditionnel ou sur un téléphone portable, c'est le premier rectangle qui sera bleu Si vous avez la change de posséder un écran du type
additive, ce sera le deuxième rectangle. A moins que votre navigateur ne supporte pas la media queryenvironment-blending.(environment-blending:opaque)(environment-blending:additive)
Requêtes media queries pour la détection du pointeur.
- @media (pointer: fine) { ... } @media (any-pointer: fine) { ... }
Ces deux syntaxes permettent de tester la présence d'un pointeur du genre souris, trackball, etc.
pointerne considère que le pointeur principal, tandis queany-pointerprend en compte tous les périphériques de pointage lorsqu'il y en a plusieurs.Les valeurs possibles pour
pointeretany-pointersont :none: no pointing device is available.coarse: a device is available but it is inaccurate, and does not allow clicking on small elements.fine: a precise pointing device is available.
La valeur peut être omise. Dans ce cas
(pointer)indique la présence d'un périphérique de pointage, sans qu'il soit possible de savoir s'agit d'un périphérique de pointage précis ou grossier.Voici un exemple de code qui garanti une taille minimale pour les boutons lorsque le périphérique de pointage est imprécis :
@media (pointer:coarse) { input[type='button'], button { min-with: 100px; min-height:50px; } }Les souris sont des pointeurs précis : sur un PC c'est donc le premier rectangle qui doit être bleu. Sur un téléphone par contre, le doigt est peu précis, ce sera donc le deuxième rectangle qui sera bleu.
(pointer:fine)(pointer:coarse) - @media (hover: none) { ... } @media (any-hover: none) { ... }
Ces deux syntaxes permettent de tester la possibilité pour le terminal de détecter le survol d'un élément. Une souris classique par exemple permet de survoler un élément sans le cliquer. Par contre sur un écran de téléphone portable, il n'est pas possible de détecter le doigt avant qu'il ne touche l'écran. Cette requête-média permet de décider s'il est pertinent d'utiliser la pseudo-classe
:hover.Les valeurs possibles pour
hoveretany-hoversont :none: la détection du survol n'est pas possible. C'est le cas si le périphérique est un téléphone portable par exemple.hover: le survol est détectable. Ce sera le cas de tous les terminaux comportant une souris ou un périphérique comparable.
La valeur peut être omise. Dans ce cas
(hover)est équivalent à(hover:hover)et(any-hover)est équivalent à(any-hover:hover).Ci-dessous, les deux rectangles doivent être bleus sur un PC classique.
(hover)(any-hover)
Préférences de l'utilisateur.
De nombreuses options pour améliorer la lisibilité sont proposées par les systèmes d'exploitation. L'utilisateur peut activer ou non ces options. D'autres paramètres peuvent être ajustés automatiquement par le système ou par le navigateur : par exemple lorsque la lumière ambiante est faible, le thème de couleurs "dark" est généralement activé. A l'inverse, dans une forte lumière ambiante, le contraste est augmenté pour faciliter la lecture.
Les requêtes media queries qui suivent permettent au développeur de styles de prendre ces paramètres en compte.
- @media (forced-colors: active) { ... }
forced-colorsteste si le mode d'affichage à contraste élevé est activé dans le système d'exploitation. Dans ce mode les couleurs sont modifiées pour offrir toujours un contraste maximal et une lisibilité accrue.Les valeurs possibles pour
forced-colorssont :none: lorsque le mode d'affichage choisi est normal.active: lorsque le mode d'affichage choisi est à fort contraste.
La valeur peut être omise :
(forced-colors)est équivalent à(forced-colors:active).Si le mode "Contraste élevé" est activé sur votre ordinateur, le deuxième rectangle doit être bleu.
(forced-colors:none)(forced-colors:active) - @media (prefers-color-scheme: dark) { ... }
Cette requête media queries permet de connaître le thème de couleurs choisi par l'utilisateur.
Les valeurs possibles pour
prefers-color-schemesont :light: l'utilisateur a choisi un thème clair.dark: l'utilisateur a choisi un thème foncé.
La spécification du W3C précise que de nouvelles valeurs pourront être définies dans l'avenir. En conséquence il est recommandé de ne pas considérer
lightetdarkcomme deux valeurs opposées. S'il est nécessaire d'écrire des styles lorsque le thèmedarkest choisi, et des styles dans le cas contraire, utiliser l'opérateurnot.Vous pouvez utiliser le panneau de paramètres de Windows pour basculer du mode
lightau modedark. Observez alors la couleur des rectangles.(prefers-color-scheme:light)(prefers-color-scheme:dark) - @media (prefers-contrast: less) { ... }
Cette requête media queries teste si l'utilisateur a choisi une valeur pour le contraste (ou s'il n'est pas intervenu sur ce réglage).
prefers-contrastpeut prendre les valeurs :no-preference: l'utilisateur n'a pas changé la valeur du contraste.less: l'utilisateur a demandé une réduction des contrastes.more: l'utilisateur a demandé un renforcement des contrastes.custom: l'utilisateur a demandé une valeur de contraste particulière.
La valeur peut être omise. Dans ce cas
(prefers-contrast)indique que l'utilisateur a modifié la valeur des contrastes, mais sans préciser s'il d'une augmentation ou d'une diminution.(prefers-contrast:no-preference)(prefers-contrast:less) - @media (prefers-reduced-data: reduce) { ... }
Cette requête media queries teste si l'utilisateur a opté pour une réduction du volume de données à transférer. Dans ce cas il est recommandé de proposer un contenu alternatif plus économique en volume de données.
Les valeurs possibles pour
prefers-reduced-datasont :no-preference: l'utilisateur n'a pas opté pour une réduction du volume de données.reduce: l'utilisateur a demandé à ce que le volume de données transférées soit réduit.
Si la valeur est omise, elle est équivalente à
reduce.Exemple. Lorsqu'il est demandé de réduire le volume de données, l'image d'arrière-plan de la page n'est pas affichée :
body {background-image:url('...'); @media (prefers-reduced-data) { body {background-image:none;} }(prefers-reduced-data:no-preference)(prefers-reduced-data:reduce) - @media (prefers-reduced-motion: reduce) { ... }
Cette requête media queries teste si l'utilisateur a opté pour une limitation des animations.
Les valeurs possibles pour
prefers-reduced-motionsont :no-preference: l'utilisateur n'a pas opté pour une réduction des animations.reduce: l'utilisateur a demandé à ce que les animations soient réduites.
La valeur peut être omise. Dans ce cas la syntaxe est équivalente à
(prefers-reduced-motion:reduce).(prefers-reduced-motion:no-preference)(prefers-reduced-motion:reduce) - @media (prefers-reduced-transparency: reduce) { ... }
La requête
prefers-reduced-transparencyteste si l'utilisateur a opté pour une limitation des effets de transparence ou translucidité.prefers-reduced-transparencypeut prendre les valeurs :no-preference: l'utilisateur n'a pas opté pour une réduction de la transparence.reduce: l'utilisateur a demandé à ce que la transparence ne soit plus gérée.
La valeur peut être omise. Dans ce cas
(prefers-reduced-transparency)est équivalent à(prefers-reduced-transparency:reduce).(...-transparency:no-preference)(...-transparency:reduce)
Possibilité d'exécuter du code.
- @media (scripting: enabled) { ... }
La requête
scriptingteste si le navigateur qui affiche le document est capable d'exécuter du code (la plupart du temps en javascript).Les valeurs possibles pour
scriptingsont :none: l'application qui affiche la page n'est pas capable d'exécuter du code ou bien cette fonctionnalité a été désactivée par l'utilisateur.enabled: l'application qui affiche la page est capable d'exécuter du code et cette fonctionnalité est activée.initial-only: l'application peut exécuter du code au chargement de la page mais pas par la suite. C'est le cas par exemple d'une imprimante.
La valeur peut être omise. Dans ce cas
(scripting)indique qu'un langage de script est disponible.Sur votre navigateur, le deuxième bloc sera probablement bleu, il indique que le langage de script est activé.
(scripting:none)(scripting:enabled)
Ciblage du périphérique par son type. ✗
Rappelons que ces syntaxes sont déconseillées à l'heure actuelle.
Voici à quoi ressemble une feuille de styles utilisant des directives @media pour appliquer des mises en forme différentes sur l'écran et à l'impression.
Notez le niveau d'accolades supplémentaire.
/* Règles à appliquer si la page est visionnée sur un écran */
@media screen {
.menu {
background-color:lightBlue;
width:200px;
}
...
}
/* Règles à appliquer si la page est imprimée */
@media print {
.menu {
display:none;
}
...
}
Remarque : il est possible aussi de créer une feuille de styles séparées pour chaque média, et de préciser ensuite le type de périphérique dans la balise link du code HTML :
link href="feuille1.css" media="screen" rel="stylesheet" type="text/css"
link href="feuille2.css" media="print" rel="stylesheet" type="text/css"
Ancienne syntaxes pour le ciblage du type de périphérique. ✗
- @media all { ... } @media screen { ... } @media print { ... }
Ces syntaxes correspondent à la définition initiale de la directive
@media. Elles permettent simplement de spécifier un type de périphérique (media type).all: les règles s'appliquent à tous les périphériques. C'est la valeur par défaut.screen: désigne les écrans. Les règles entre les accolades s'appliquent lorsque les pages sont visionnées sur un ordinateur de bureau, sur un téléphone, une tablette, etc.print: désigne les imprimantes. Les règles entre les accolades s'appliquent lorsque les pages sont imprimées ou affichées en aperçu avant impression.
- @media tty { ... } ✗ @media tv { ... } ✗ @media projection { ... } ✗ @media handled { ... } ✗ @media braille { ... } ✗ @media embossed { ... } ✗ @media aural { ... } ✗ @media speech { ... } ✗
Ces types de périphériques ne sont plus reconnus par les navigateurs. Ne les utilisez plus.
tty: terminaux ne pouvant imprimer que des caractères de largeur fixe.tv: téléviseurs.projection: projecteurs vidéo.handled: terminaux de petite taille, pouvant être utilisé tenu à la main.braille: terminaux permettant la restitution en braille.embossed: terminaux d'impression en braille.auralouspeech: terminaux avec restitution sonore.
Compatibilité des navigateurs avec la directive @media.
La première colonne du tableau ci-dessous concerne l'utilisation de @media pour cibler un type de périphérique
(écran, imprimante...). Cette utilisation est bien prise en charge par tous les navigateurs actuels.
C'est également le cas pour le traitement des requêtes-média complètes, avec ciblage du périphérique d'après ses caractéristiques (2ème colonne).
Les colonnes suivantes concernent des requêtes-média particulières comme resolution, pointer ou hover.
@media dans leur ancienne syntaxe : ciblage d'un périphérique à partir de son type : print par exemple. Cette méthode manque de précision et n'est plus recommandée par le W3C.@media pour cibler un périphérique à partir de ses caractéristiques : dimensions, résolution, orientation, etc.< et > au lieu de min- et max- pour exprimer une fourchette de valeurs.Exemple :
720 <= width < 1200inverted-colors pour tester si l'utilisateur a inversé les couleurs.prefers-reduced-data qui détermine si les navigateur tente de minimiser le volume de données importé.prefers-reduced-transparency qui teste si l'utilisateur a demandé le non-traitement de la transparence.Remarques :
(1) Internet Explorer ne supporte pas les requêtes media imbriquées.
(2) Internet Explorer et Opera mini ne supporte que l'unité dpi dans les media queries (ne supporte pas dppx or dpcm).
(3) Désactivé par défaut. Peut être activé avec le flag enable-experimental-web-platform-features.
requêtes media
@media'compris entre'
resolutioninteractions
inverted-colorsprefers-reduced-dataprefers-reduced-transparencyNavigateurs sur ordinateurs :
Navigateurs sur mobiles :
Navigateurs obsolètes ou marginaux :

Internet Explorer

KaiOS Browser

Samsung Internet

Androïd Brower

Chrome pour Androïd

Baidu Browser

QQ Browser

Safari

Safari sur IOS

Chrome

Edge

Firefox

Opéra

Opéra Mobile

UC Browser pour Androïd

Firefox pour Androïd

Opéra mini
Évolution de la directive @media.
La directive a beaucoup évolué avec les versions de CSS. Initialement son rôle était de cibler un périphérique par son type (imprimante, écran, vocal...).
Mais cette façon de faire manquait de précision : un écran par exemple peut être petit comme celui d'un téléphone mobile ou très grand. D'autre part
on trouve fréquemment plusieurs types sur le même terminal : un écran et une restitution vocale par exemple.
Le ciblage par type de périphérique a rapidement été abandonné pour un ciblage en fonction des caractéristiques du périphérique (taille de l'écran par exemple).
Avec le temps, le nombre de caractéristiques testables a considérablement augmenté.
-
CSS 2.1 - Spécification concernant les feuilles de styles en cascade - Révision 1
La directive@mediaest introduite dans le langage CSS pour cibler un périphérique particulier. Il est alors possible d'écrire des styles spécifiques pour chaque type de périphérique.
Les périphériques reconnus sont :all,braille,embossed,handled,print,projection,screen,speech,ttyandtv.04 Novembre 1997Document de travail.24 Mars 1998Proposé à la recommandation.11 Mai 1998Recommandation. -
Requêtes média - Niveau 3
La directive@mediapeut maintenant cibler un périphérique en fonction de ses possibilités : taille d'écran, résolution, etc.04 Avril 2001Document de travail.08 Juillet 2002Candidat à la recommandation.26 Avril 2012Proposé à la recommandation.19 Juin 2012Recommandation. -
Requêtes-média - Niveau 4
Simplification de la syntaxe de la directive. En particulier la possibilité de spécifier une fourchette de valeurs.
Ajout de nouvelles caractéristiques testables.05 Juin 2014Document de travail.05 Septembre 2017Candidat à la recommandation. -
Requêtes-média - Niveau 5
Ajout de nouvelles fonctionnalités testables par une requête média.03 Mars 2020Document de travail.
Voir aussi, à propos des media queries.
La spécification Media Queries regroupe tout ce qui concerne les requêtes média (media queries).



