TODO: multicolumn est bien supporté maintenant TODO: parler de span pour grid pour les L1 ?
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
@media (width <= 800px) {
p {
background: black;
color: yellow;
}
}
@media contient des règles CSS !Les propriétés sont de la forme critère: valeur
color, color-index, monochromedevice-height, device-width, device-aspect-ratio, resolutionheight, width, orientation, aspect-ratioLa 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)
En pratique, le plus souvent on se contente d'utiliser max-width
et min-width
on cherche principalement à s'adapter à la taille de la fenêtre, que l'internaute soit sur un PC ou sur un téléphone
on ne s'intéresse qu'à la largeur car cette dimension est « fixée »
(on ne veut surtout pas d'ascenseur horizontal, alors que les ascenseurs verticaux ne posent aucun problème)
Par ailleurs, une syntaxe plus simple et lisible a été introduite en 2022 : on peut maintenant utiliser des opérateurs
de comparaison < <= >= > avec width (et les autres propriétés où c'est pertinent).
On peut ainsi écrire :
@media (width <= 800px) {
p { background-color: gold; }
}
@media (width > 300px) {
p { color: forestgreen; }
}
/* On peut même donner un intervalle : */
@media (600px <= width < 1200px) {
p { text-transform: uppercase; }
}
Par souci de clarté on utilisera cette nouvelle syntaxe dans le cours, mais vous risquez de voir encore souvent l'ancienne.
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
/* version par défaut: sur grand écran */
.menu { width: 30em; /* etc. */ }
/* écran plus petit: on passe le menu en horizontal */
@media (width <= 100em) {
.menu { width: 100%; }
.menu li { display: inline-block; }
/* etc. */
}
/* écran encore plus petit: on cache le menu */
@media (width <= 50em) {
.menu { display: none; }
}
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 (width <= 600px)"
href="small_screens.css"
/>
meta :
<meta name="viewport" content="initial-scale=1" />
<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é !
@viewport en CSS a été abandonné (pb de performances pour le chargement des images)pt : point, utilisé pour les médias destinés à l'impressionin : pouce (2,54cm, 1/72in = 1pt)px : pixel = 1/96 in (un pixel CSS peut recouvrir plusieurs pixels de l'écran)mm, cmem : 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)rem, correspond à la valeur font-size de l'élément racinevw: 1% de la largeur courante de la fenêtre (viewport width)vh: 1% de la hauteur courante de la fenêtre (viewport height)vw vaut 12 pixelsvw et des vh partout à la place des px ou des em