État du CSS 2022

Fonctionnalités de personnalisation du Web d'aujourd'hui et de demain, telles que présentées lors de Google IO 2022, et quelques extras.

L'année 2022 devrait être l'une des plus belles années des CSS, aussi bien en termes de fonctionnalités que de lancements de fonctionnalités coopératives pour les navigateurs, avec un objectif collaboratif : implémenter 14 fonctionnalités.

Présentation

Ce post est l'article de la présentation de Google IO 2022. Il ne s'agit pas d'un guide détaillé sur chaque fonctionnalité, mais d'une introduction et d'une brève présentation visant à susciter l'intérêt de votre audience, ce qui vous apportera une étendue plutôt que de la profondeur. Si cela suscite votre intérêt, consultez la fin d'une section pour obtenir des liens vers des ressources supplémentaires.

Table des matières

Utilisez la liste ci-dessous pour accéder directement aux sujets qui vous intéressent:

Compatibilité du navigateur

L'une des principales raisons pour lesquelles de nombreuses fonctionnalités CSS sont configurées pour être publiées coopérativement est due aux efforts d'Interop 2022. Avant d'étudier les initiatives liées à l'interopérabilité, il est important de connaître les efforts de Compat 2021.

Compat 2021

Les objectifs pour 2021, basés sur les commentaires des développeurs via des enquêtes, étaient de stabiliser les fonctionnalités actuelles, d'améliorer la suite de tests et d'augmenter les taux de réussite des navigateurs pour cinq fonctionnalités:

  1. Positionnement de sticky
  2. aspect-ratio taille
  3. Mise en page flex
  4. Mise en page grid
  5. Positionnement et animation de transform

Les notes des tests ont été améliorées à tous les niveaux, démontrant ainsi une stabilité et une fiabilité accrues. Toutes nos félicitations à toutes ces équipes !

Interopérabilité 2022

Cette année, les navigateurs se sont réunis pour discuter des fonctionnalités et des priorités sur lesquelles ils avaient l'intention de travailler, unissant leurs efforts. Elle prévoyait de proposer les fonctionnalités Web suivantes aux développeurs:

  1. @layer
  2. Espaces colorimétriques et fonctions
  3. Confinement
  4. <dialog>
  5. Compatibilité des formulaires
  6. Utilisez le défilement
  7. Sous-réseau
  8. Typographie
  9. Unités de la fenêtre d'affichage
  10. Compatibilité Web

C'est une liste passionnante et ambitieuse que j'ai hâte de voir se dérouler.

Nouveautés pour 2022

Sans surprise, l'état de CSS 2022 est considérablement affecté par le travail d'interopérabilité en 2022.

Couches en cascade

Navigateurs pris en charge

  • 99
  • 99
  • 97
  • 15,4

Source

Avant @layer, l'ordre découvert des feuilles de style chargées était très important, car les styles chargés en dernier peuvent remplacer les styles chargés précédemment. Cela a permis de gérer des feuilles de style d'entrée de manière méticuleuse, où les développeurs devaient charger d'abord les styles moins importants, puis les styles plus importants. Des méthodologies complètes existent pour aider les développeurs à gérer cette importance, telles que ITCSS.

Avec @layer, le fichier d'entrée peut prédéfinir les couches et leur ordre. Ensuite, lorsque les styles sont chargés ou définis, ils peuvent être placés dans une couche, ce qui permet de préserver le style et de remplacer l'importance, mais sans l'orchestration de chargement gérée méticuleusement.

La vidéo montre comment les couches de cascade définies permettent un processus de création et de chargement plus libre et libre, tout en conservant la cascade au besoin.

Les outils pour les développeurs Chrome vous permettent de visualiser quels styles proviennent de quels calques:

Capture d&#39;écran de la barre latérale &quot;Styles&quot; des outils pour les développeurs Chrome, mettant en évidence la façon dont les styles apparaissent dans les nouveaux groupes de calques.

Ressources

Sous-réseau

Navigateurs pris en charge

  • 117
  • 117
  • 71
  • 16

Source

Avant subgrid, une grille à l'intérieur d'une autre grille ne pouvait pas s'aligner sur ses cellules parentes ou ses lignes de grille. Chaque mise en page en grille était unique. De nombreux concepteurs placent une seule grille sur l'ensemble de leur conception et y alignent constamment les éléments, ce qui ne peut pas être fait en CSS.

Après subgrid, un enfant d'une grille peut adopter les colonnes ou lignes de ses parents, et s'aligner sur eux ou aligner les enfants.

Dans la démonstration suivante, l'élément du corps crée une grille classique à trois colonnes : la colonne du milieu s'appelle main, et les colonnes de gauche et de droite attribuent un nom à leurs lignes fullbleed. Ensuite, chaque élément du corps, <nav> et <main>, adopte les lignes nommées du corps en définissant grid-template-columns: subgrid.

​​body {
  display: grid;
  grid-template-columns:
    [fullbleed-start]
    auto [main-start] min(90%, 60ch) [main-end] auto
    [fullbleed-end]
  ;
}

body > * {
  display: grid;
  grid-template-columns: subgrid;
}

Enfin, les enfants de <nav> ou <main> peuvent s'aligner ou se dimensionner à l'aide des colonnes et des lignes fullbleed et main.

.main-content {
  grid-column: main;
}

.fullbleed {
  grid-column: fullbleed;
}

Les outils de développement vous permettent de voir les lignes et les sous-grilles (Firefox uniquement pour le moment). Dans l'image suivante, la grille et les sous-grilles parentes ont été superposées. Cela ressemble maintenant à la façon dont les concepteurs pensaient la mise en page.

Capture d&#39;écran d&#39;une démo de sous-grille utilisant les outils de superposition de grille des outils pour les développeurs Chrome pour afficher les lignes définies par CSS.

Dans le panneau "Éléments" des outils de développement, vous pouvez voir quels éléments sont des grilles et des sous-grilles, ce qui est très utile pour déboguer ou valider la mise en page.

Capture d&#39;écran du panneau &quot;Éléments des outils pour les développeurs Chrome&quot; indiquant les éléments ayant une mise en page sous forme de grille ou de sous-grille.
Capture d'écran des outils pour les développeurs Firefox

Ressources

Requêtes de conteneur

Navigateurs pris en charge

  • 105
  • 105
  • 110
  • 16

Source

Avant @container, les éléments d'une page Web ne pouvaient répondre qu'à la taille de la fenêtre d'affichage complète. C'est idéal pour les mises en page avec des macros, mais pour les mises en page micro, où leur conteneur externe ne correspond pas à l'ensemble de la fenêtre d'affichage, il est impossible que la mise en page s'adapte en conséquence.

Après @container, les éléments peuvent répondre à une taille ou à un style de conteneur parent. La seule mise en garde : les conteneurs doivent se déclarer comme des cibles de requête possibles, ce qui constitue une petite exigence pour un grand avantage.

/* establish a container */
.day {
  container-type: inline-size;
  container-name: calendar-day;
}

C'est grâce à ces styles que les colonnes Lun, Mar, Mer, Jeudi et Ven de la vidéo suivante peuvent être interrogées par les éléments d'événement.

Démonstration de Una Kravets

Voici le code CSS permettant d'interroger le conteneur calendar-day pour connaître sa taille, puis d'ajuster sa mise en page et les tailles de police:

@container calendar-day (max-width: 200px) {
  .date {
    display: block;
  }

  .date-num {
    font-size: 2.5rem;
    display: block;
  }
}

Voici un autre exemple: un composant Book s'adapte à l'espace disponible dans la colonne vers laquelle il est glissé:

Démonstration de Max Böck

Una a raison d'évaluer la situation en tant que nouveau responsive. Lorsque vous utilisez @container, vous devez prendre de nombreuses décisions de conception intéressantes et significatives.

Ressources

accent-color

Navigateurs pris en charge

  • 93
  • 93
  • 92
  • 15,4

Source

Avant le accent-color, lorsque vous souhaitiez obtenir un formulaire avec des couleurs assorties à votre marque, vous pouviez vous retrouver avec des bibliothèques ou des solutions CSS complexes, devenues difficiles à gérer au fil du temps. Bien qu'elles vous donnent toutes les options et, espérons-le, incluses l'accessibilité, il est fastidieux de continuer à choisir les composants intégrés ou les vôtres.

Après accent-color, une ligne de CSS apporte une couleur de marque aux composants intégrés. En plus de la teinte, le navigateur choisit intelligemment les couleurs contrastées qui conviennent pour les parties annexes du composant et s'adapte aux jeux de couleurs du système (clair ou sombre).

/* tint everything */
:root {
  accent-color: hotpink;
}

/* tint one element */
progress {
  accent-color: indigo;
}

Éléments HTML accentués de clair et foncé côte à côte à des fins de comparaison.

Pour en savoir plus sur accent-color, consultez mon article sur web.dev, où j'explore de nombreux autres aspects de cette propriété CSS utile.

Ressources

Niveau de couleur 4 et 5

Le Web a été dominé par le format sRVB depuis des décennies, mais dans un monde numérique en pleine expansion, constitué d'écrans haute définition et d'appareils mobiles équipés d'écrans OLED ou QLED, le sRVB ne suffit pas. De plus, les pages dynamiques qui s'adaptent aux préférences des utilisateurs sont attendues, et la gestion des couleurs est une préoccupation croissante des concepteurs, des systèmes de conception et des responsables de code.

Mais ce n'est pas le cas en 2022. CSS propose un certain nombre de nouvelles fonctions de couleur et de nouveaux espaces : - Les couleurs des écrans reflètent les capacités de couleur HD des écrans. - Espaces de couleur correspondant à un intent, comme l'uniformité perceptuelle - Espaces de couleur pour les dégradés qui modifient radicalement les résultats d'interpolation. - Des fonctions de couleur pour vous aider à mélanger et à contraster, et à choisir l'espace dans lequel vous travaillez.

Avant toutes ces caractéristiques de couleur, les systèmes de conception devaient précalculer les couleurs contrastées appropriées et garantir des palettes de couleurs appropriées, le tout tandis que les préprocesseurs ou JavaScript effectuaient le plus gros du travail.

Après toutes ces fonctionnalités de couleur, le navigateur et le CSS peuvent effectuer tout le travail, de manière dynamique et juste à temps. Au lieu d'envoyer de nombreux ko de CSS et de JavaScript aux utilisateurs pour activer les couleurs de thématisation et de visualisation des données, CSS peut se charger de l'orchestration et des calculs. Le CSS est également mieux équipé pour vérifier la prise en charge avant utilisation ou pour gérer les remplacements de manière optimale.

@media (dynamic-range: high) {
  .neon-pink {
    --neon-glow: color(display-p3 1 0 1);
  }
}

@supports (color: lab(0% 0 0)) {
  .neon-pink {
    --neon-glow: lab(150% 160 0);
  }
}

hwb()

Navigateurs pris en charge

  • 101
  • 101
  • 96
  • 15

Source

HWB signifie teinte, blanc et noir. Elle se présente comme un moyen convivial d'articuler la couleur, car il s'agit simplement d'une teinte et d'une quantité de blanc ou de noir à éclaircir ou assombrir. Les artistes qui mélangent des couleurs avec du blanc ou du noir apprécieront peut-être cet ajout de syntaxe de couleur.

L'utilisation de cette fonction de couleur donne les couleurs de l'espace colorimétrique sRVB, identique à HSL et RVB. En ce qui concerne la nouveauté de 2022, cela ne vous donne pas de nouvelles couleurs, mais cela peut faciliter certaines tâches pour les fans de syntaxe et de modèle mental.

Ressources

Espaces colorimétriques

La façon dont les couleurs sont représentées est faite avec un espace colorimétrique. Chaque espace de couleur offre des fonctionnalités et des compromis variés pour travailler avec la couleur. Certains peuvent combiner toutes les couleurs vives, d'autres les aligner en premier en fonction de leur luminosité.

Le CSS 2022 devrait proposer 10 nouveaux espaces de couleur, chacun offrant des fonctionnalités uniques pour aider les concepteurs et les développeurs à afficher, choisir et mélanger des couleurs. Auparavant, sRVB était la seule option permettant de travailler avec des couleurs, mais le CSS offre désormais un nouveau potentiel et un nouvel espace colorimétrique par défaut, LCH.

color-mix()

Navigateurs pris en charge

  • 111
  • 111
  • 113
  • 16,2

Source

Avant color-mix(), les développeurs et les concepteurs avaient besoin de préprocesseurs tels que Sass pour mélanger les couleurs avant que le navigateur ne les détecte. La plupart des fonctions de mélange de couleurs n'offraient pas non plus la possibilité de spécifier l'espace de couleurs dans lequel effectuer le mélange, ce qui pouvait entraîner des résultats déroutants.

Après color-mix(), les développeurs et les concepteurs peuvent mélanger des couleurs dans le navigateur, avec tous leurs autres styles, sans exécuter de processus de compilation ni inclure de JavaScript. Ils peuvent également spécifier l'espace colorimétrique dans lequel effectuer le mélange ou utiliser l'espace colorimétrique par défaut de LCH.

Souvent, la couleur de la marque est utilisée comme base à partir de laquelle des variantes sont créées, telles que des couleurs plus claires ou plus sombres pour les styles de pointage. Voici comment cela se présente avec color-mix():

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(var(--brand) 25%, black);
  --lighter: color-mix(var(--brand) 25%, white);
}

Pour mélanger ces couleurs dans un autre espace colorimétrique, comme srgb, modifiez-le:

.color-mix-example {
  --brand: #0af;

  --darker: color-mix(in srgb, var(--brand) 25%, black);
  --lighter: color-mix(in srgb, var(--brand) 25%, white);
}

Voici une démo de thématisation utilisant color-mix(). Essayez de changer la couleur de la marque et regardez la mise à jour du thème:

Amusez-vous à mélanger les couleurs dans différents espaces de couleurs dans vos feuilles de style en 2022 !

Ressources

color-contrast()

Navigateurs pris en charge

  • x
  • x
  • x

Source

Avant le color-contrast(), les auteurs de feuilles de style devaient connaître les couleurs accessibles à l'avance. Souvent, une palette affiche du texte en noir ou blanc sur un échantillon de couleur pour indiquer à un utilisateur du système de couleurs quelle couleur de texte est nécessaire pour bien contraster avec cet échantillon.

Capture d&#39;écran de 3 palettes Material, montrant 14 couleurs et leurs couleurs de contraste blanche ou noire appropriées pour le texte.
Exemple tiré des palettes de couleurs Material Design de 2014

Après color-contrast(), les auteurs de feuilles de style peuvent décharger entièrement la tâche du navigateur. Vous pouvez non seulement utiliser le navigateur pour choisir automatiquement une couleur noire ou blanche, mais aussi lui fournir une liste de couleurs appropriées du système de conception et lui demander de choisir la première pour obtenir le rapport de contraste souhaité.

Voici une capture d'écran d'une démonstration de la palette de couleurs HWB, dans laquelle les couleurs de texte sont automatiquement choisies par le navigateur en fonction de la couleur de l'échantillon:

Capture d&#39;écran de la démo HWB où chaque palette présente une combinaison différente de texte clair ou sombre, selon le navigateur.
Essayer la démonstration

Les bases de la syntaxe ressemblent à ceci, où le gris est transmis à la fonction et le navigateur détermine si le noir ou le blanc présente le plus de contraste:

color: color-contrast(gray);

La fonction peut également être personnalisée avec une liste de couleurs, dans laquelle elle sélectionne la couleur contrastée la plus élevée de la sélection:

color: color-contrast(gray vs indigo, rebeccapurple, hotpink);

Enfin, si il est préférable de ne pas choisir la couleur contrastée la plus élevée dans la liste, un rapport de contraste cible peut être fourni, et la première couleur à transmettre est choisie:

color: color-contrast(
  var(--bg-blue-1)
  vs
  var(--text-lightest), var(--text-light), var(--text-subdued)
  to AA /* 4.5 could also be passed */
);

Cette fonction peut être utilisée pour autre chose que la couleur du texte, même si j'estime que ce sera son cas d'utilisation principal. Pensez à la facilité avec laquelle vous pourrez fournir des interfaces accessibles et lisibles une fois que le choix de couleurs contrastées appropriées sera intégré au langage CSS lui-même.

Ressources

Syntaxe des couleurs relatives

Navigateurs pris en charge

  • 111
  • 111
  • 113
  • 15

Source

Avant la syntaxe de couleur relative, pour calculer la couleur et effectuer des ajustements, il fallait placer les canaux de couleur individuellement dans des propriétés personnalisées. Cette limitation a également fait de HSL la fonction de couleur primaire pour manipuler les couleurs, car la teinte, la saturation ou la luminosité pouvaient toutes être ajustées de manière simple avec calc().

Après la syntaxe de couleur relative, n'importe quelle couleur dans n'importe quel espace peut être décomposée, modifiée et renvoyée en tant que couleur, le tout sur une seule ligne de CSS. Il n'y a plus de limites à la syntaxe TSL. Vous pouvez effectuer des manipulations dans n'importe quel espace colorimétrique souhaité, et de nombreuses propriétés moins personnalisées doivent être créées pour faciliter le processus.

Dans l'exemple de syntaxe suivant, un code hexadécimal de base est fourni et deux nouvelles couleurs sont créées par rapport à celui-ci. La première couleur --absolute-change crée une nouvelle couleur dans LCH à partir de la couleur de base, puis remplace la luminosité de la couleur de base par 75%, en conservant la chrominance (c) et la teinte (h). La deuxième couleur --relative-change crée une nouvelle couleur dans LCH à partir de la couleur de base, mais cette fois, la chrominance (c) est réduite de 20%.

.relative-color-syntax {
  --color: #0af;
  --absolute-change: lch(from var(--color) 75% c h);
  --relative-change: lch(from var(--color) l calc(c-20%) h);
}

Cela revient à mélanger des couleurs, mais c'est plus semblable à des retouches qu'à un mélange. Vous pouvez caster une couleur à partir d'une autre couleur, ce qui vous permet d'accéder aux trois valeurs de canal nommées par la fonction color utilisée, ainsi que d'ajuster ces canaux. Dans l'ensemble, il s'agit d'une syntaxe de couleur très cool et puissante.

Dans la démonstration suivante, j'ai utilisé une syntaxe de couleur relative pour créer des variantes plus claires et plus sombres d'une couleur de base, et utilisé color-contrast() pour s'assurer que le contraste des étiquettes est correct:

Capture d&#39;écran avec 3 colonnes, chaque colonne est plus sombre ou plus claire que la colonne centrale.
Essayer la démonstration

Cette fonction peut également être utilisée pour générer une palette de couleurs. Dans cette démonstration, des palettes entières sont générées à partir d'une couleur de base fournie. Toutes les différentes palettes reposent sur cet ensemble unique de CSS, et chaque palette fournit simplement une base différente. En prime, depuis que j'ai utilisé le LCH, regardez à quel point les palettes sont perceptives : aucune zone chaude ou morte n'est visible grâce à cet espace colorimétrique.

:root {
  --_color-base: #339af0;

  --color-0:  lch(from var(--_color-base) 98% 10 h);
  --color-1:  lch(from var(--_color-base) 93% 20 h);
  --color-2:  lch(from var(--_color-base) 85% 40 h);
  --color-3:  lch(from var(--_color-base) 75% 46 h);
  --color-4:  lch(from var(--_color-base) 66% 51 h);
  --color-5:  lch(from var(--_color-base) 61% 52 h);
  --color-6:  lch(from var(--_color-base) 55% 57 h);
  --color-7:  lch(from var(--_color-base) 49% 58 h);
  --color-8:  lch(from var(--_color-base) 43% 55 h);
  --color-9:  lch(from var(--_color-base) 39% 52 h);
  --color-10: lch(from var(--_color-base) 32% 48 h);
  --color-11: lch(from var(--_color-base) 25% 45 h);
  --color-12: lch(from var(--_color-base) 17% 40 h);
  --color-13: lch(from var(--_color-base) 10% 30 h);
  --color-14: lch(from var(--_color-base) 5% 20 h);
  --color-15: lch(from var(--_color-base) 1% 5 h);
}
Capture d&#39;écran de 15 palettes, toutes générées dynamiquement par CSS.
Essayer la démonstration

Nous espérons que vous savez maintenant comment les espaces de couleur et les différentes fonctions de couleur peuvent tous être utilisés à des fins différentes, en fonction de leurs forces et de leurs faiblesses.

Ressources

Espaces de couleurs en dégradé

Avant les espaces de couleurs en dégradé, l'espace colorimétrique sRVB était utilisé par défaut. Il est généralement fiable, mais présente des points faibles, comme la zone morte grise.

Quatre dégradés dans une grille, tous du cyan au rose profond. LCH et LAB présentent une intensité plus constante, le sRVB étant un peu désaturé au milieu.

Après les espaces de couleur en dégradé, indiquez au navigateur l'espace colorimétrique à utiliser pour l'interpolation des couleurs. Cela permet aux développeurs et aux concepteurs de choisir le gradient qu'ils préfèrent. L'espace colorimétrique par défaut passe également à LCH au lieu de sRVB.

L'ajout de syntaxe est effectué après la direction du dégradé et utilise la nouvelle syntaxe in. Il est facultatif:

background-image: linear-gradient(
  to right in hsl,
  black, white
);

background-image: linear-gradient(
  to right in lch,
  black, white
);

Voici un dégradé basique et essentiel, allant du noir au blanc. Regardez la gamme de résultats dans chaque espace de couleur. Certaines atteignent le noir foncé plus tôt que d'autres, d'autres passent au blanc trop tard.

11 espaces de couleur, comparant le noir au blanc.

Dans l'exemple suivant, le noir passe au bleu, car il s'agit d'un espace problématique connu pour les dégradés. La plupart des espaces de couleurs se glissent en violet lors de l'interpolation des couleurs ou, comme je le pense bien, lorsque les couleurs se déplacent à l'intérieur de leur espace colorimétrique d'un point A au point B. Étant donné que le dégradé suit une ligne droite du point A au point B, la forme de l'espace colorimétrique modifie considérablement les arrêts suivis par le tracé.

11 espaces de couleur, comparant le bleu au noir.

Pour obtenir des explorations détaillées, des exemples et des commentaires, consultez ce fil de discussion Twitter.

Ressources

inert

Navigateurs pris en charge

  • 102
  • 102
  • 112
  • 15.5

Source

Avant inert, il était recommandé de guider l'utilisateur vers les zones de la page ou de l'application qui nécessitaient une attention immédiate. Cette stratégie de concentration guidée est devenue connue sous le nom de piégeage de la mise au point, car les développeurs mettaient l'accent sur un espace interactif, écoutaient les événements de changement de mise au point et, si l'objectif quittait l'espace interactif, il était de nouveau intégré de force. Les utilisateurs de claviers ou de lecteurs d'écran sont redirigés vers l'espace interactif pour s'assurer que la tâche est terminée avant de continuer.

Après inert, aucun piège n'est requis, car vous pouvez figer ou protéger des sections entières de la page ou de l'application. Les clics et les tentatives de modification de sélection ne sont tout simplement pas disponibles tant que ces parties d'un document sont inertes. On pourrait également penser à cela comme des gardiens au lieu d'un piège, où inert ne cherche pas à vous faire rester quelque part, au lieu de rendre d'autres lieux indisponibles.

La fonction JavaScript alert() en est un bon exemple:

Le site Web s'affiche comme interactif, une alerte() est appelée et la page n'est plus active.

Notez dans la vidéo précédente que la page était accessible à la souris et au clavier jusqu'à ce qu'un alert() soit appelé. Lorsque le pop-up de la boîte de dialogue d'alerte s'affichait, le reste de la page était figé, soit inert. Le curseur de l'utilisateur est placé dans la boîte de dialogue d'alerte et n'a nulle part où aller. Une fois que l'utilisateur a interagi et traité la requête de la fonction d'alerte, la page est à nouveau interactive. inert permet aux développeurs d'effectuer facilement cette même expérience de concentration guidée.

Voici un petit exemple de code illustrant son fonctionnement:

<body>
  <div class="modal">
    <h2>Modal Title</h2>
    <p>...<p>
    <button>Save</button>
    <button>Discard</button>
  </div>
  <main inert>
    <!-- cannot be keyboard focused or clicked -->
  </main>
</body>

Une boîte de dialogue est un bon exemple, mais inert est également utile pour des éléments tels que l'expérience utilisateur du menu latéral coulissant. Lorsqu'un utilisateur glisse hors du menu latéral, il ne peut pas laisser la souris ou le clavier interagir avec la page qui se trouve derrière. C'est un peu délicat pour les utilisateurs. Au lieu de cela, lorsque le menu latéral s'affiche, vous pouvez rendre la page inert. Les utilisateurs doivent alors fermer ce menu ou y accéder pour qu'ils ne se retrouvent jamais perdus ailleurs sur la page avec un menu ouvert.

Ressources

Polices COLRv1

Avant les polices COLRv1, le Web proposait des polices OT-SVG, également un format ouvert pour les polices avec des dégradés ainsi que des couleurs et des effets intégrés. Celles-ci pouvaient cependant devenir très volumineuses et, bien qu'elles permettent de modifier le texte, les possibilités de personnalisation étaient limitées.

Après les polices COLRv1, le Web bénéficie d'un encombrement réduit, d'une évolutivité vectorielle, d'un repositionnement, d'un dégradé de couleurs et d'un mode de combinaison. Ces polices acceptent des paramètres permettant de personnaliser la police par cas d'utilisation ou pour correspondre à une marque.

Comparatif et graphique à barres montrant que les polices COLRv1 sont plus nettes et plus petites.
Image provenant de https://developer.chrome.com/blog/colrv1-fonts/

Voici un exemple tiré de l'article du blog des développeurs Chrome concernant les emoji. Vous avez peut-être remarqué que si vous augmentez la taille de la police d'un emoji, elle n'est pas nette. Il s'agit d'une image et non d'une œuvre d'art vectorielle. Souvent, dans les applications où un emoji est utilisé, il est remplacé par un asset de meilleure qualité. Avec les polices COLRv1, les emoji sont vectoriels et beaux:

Les polices d'icônes offrent de nombreux avantages avec ce format, avec des palettes de couleurs bicolores personnalisées, et plus encore. Le chargement d'une police COLRv1 est comme n'importe quel autre fichier de police:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

La personnalisation de la police COLRv1 s'effectue à l'aide de @font-palette-values, une règle CSS spéciale permettant de regrouper et de nommer un ensemble d'options de personnalisation dans un bundle pour référence ultérieure. Notez que vous spécifiez un nom personnalisé de la même manière qu'une propriété personnalisée, en commençant par --:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

Avec --colorized comme alias pour les personnalisations, la dernière étape consiste à appliquer la palette à un élément qui utilise la famille de polices de couleurs:

@import url(https://fonts.googleapis.com/css2?family=Bungee+Spice);

@font-palette-values --colorized {
  font-family: "Bungee Spice";
  base-palette: 0;
  override-colors: 0 hotpink, 1 cyan, 2 white;
}

.spicy {
  font-family: "Bungee Spice";
  font-palette: --colorized;
}
Capture d&#39;écran de la police Bungee Spice avec le mot DUNE.
Police Bungee Spice affichée avec des couleurs personnalisées, source sur https://developer.chrome.com/blog/colrv1-fonts/

Avec des polices de plus en plus variables et des polices de couleurs toujours plus disponibles, la typographie Web est sur la voie d'une personnalisation et d'une expression créatives avancées.

Ressources

Unités de la fenêtre d'affichage

Illustration montrant comment l&#39;écran de l&#39;appareil, la fenêtre du navigateur et un iFrame ont tous des fenêtres d&#39;affichage différentes.

Avant l'introduction des nouvelles variantes de fenêtres d'affichage, le Web proposait des unités physiques pour permettre l'ajustement des fenêtres d'affichage. Il y avait une taille pour la hauteur, la largeur, la plus petite taille (vmin) et le côté le plus grand (vmax). Ils fonctionnaient bien pour de nombreuses choses, mais les navigateurs mobiles ont introduit une complexité.

Sur mobile, lors du chargement d'une page, la barre d'état contenant l'URL s'affiche, et cette barre utilise une partie de l'espace de la fenêtre d'affichage. Après quelques secondes et un certain temps d'interactivité, la barre d'état peut disparaître pour offrir à l'utilisateur une fenêtre d'affichage plus grande. Toutefois, lorsque cette barre glisse, la hauteur de la fenêtre d'affichage a changé, et toutes les unités vh se déplacent et se redimensionnent à mesure que la taille cible change. Plus tard, l'unité vh avait spécifiquement besoin de décider laquelle des deux tailles de fenêtre d'affichage elle allait être utilisée, car elle provoquait des problèmes de mise en page visuelle gênants sur les appareils mobiles. Il a été déterminé que vh représentait toujours la plus grande fenêtre d'affichage.

.original-viewport-units {
  height: 100vh;
  width: 100vw;
  --size: 100vmin;
  --size: 100vmax;
}

Une fois les nouvelles variantes de fenêtre d'affichage disponibles, les unités de fenêtre d'affichage petites, grandes et dynamiques sont disponibles, avec l'ajout d'équivalents logiques aux unités physiques. L'idée est de donner aux développeurs et aux concepteurs la possibilité de choisir l'unité qu'ils souhaitent utiliser pour leur scénario donné. Peut-être est-il acceptable d'avoir un petit décalage de mise en page inopiné lorsque la barre d'état disparaît. Ainsi, dvh (hauteur de la fenêtre d'affichage dynamique) peut être utilisé sans crainte.

Illustration montrant trois téléphones pour illustrer DVH, LVH et SVH L&#39;exemple de téléphone DVH comporte deux lignes verticales : l&#39;une entre le bas de la barre de recherche et le bas de la fenêtre d&#39;affichage, et l&#39;autre entre le haut de la barre de recherche (sous la barre d&#39;état système) et le bas de la fenêtre d&#39;affichage. Cela montre que DVH peut être l&#39;une de ces deux longueurs. LVH est affiché au milieu, avec une ligne entre le bas de la barre d&#39;état de l&#39;appareil et le bouton de la fenêtre d&#39;affichage du téléphone. Le dernier est l&#39;exemple d&#39;unité SVH, qui affiche une ligne allant du bas de la barre de recherche du navigateur au bas de la fenêtre d&#39;affichage.

Voici la liste complète de toutes les nouvelles options de bloc de fenêtre d'affichage disponibles dans les nouvelles variantes de fenêtre d'affichage:

Hauteur des unités de la fenêtre d'affichage
​​.new-height-viewport-units {
  height: 100vh;
  height: 100dvh;
  height: 100svh;
  height: 100lvh;
  block-size: 100vb;
  block-size: 100dvb;
  block-size: 100svb;
  block-size: 100lvb;
}
Largeur des unités de la fenêtre d'affichage
.new-width-viewport-units {
  width: 100vw;
  width: 100dvw;
  width: 100svw;
  width: 100lvw;
  inline-size: 100vi;
  inline-size: 100dvi;
  inline-size: 100svi;
  inline-size: 100lvi;
}
Plus petites unités latérales de fenêtre d'affichage
.new-min-viewport-units {
  --size: 100vmin;
  --size: 100dvmin;
  --size: 100svmin;
  --size: 100lvmin;
}
Unités latérales de fenêtre d'affichage les plus grandes
.new-max-viewport-units {
  --size: 100vmax;
  --size: 100dvmax;
  --size: 100svmax;
  --size: 100lvmax;
}

Nous espérons qu'elles offriront aux développeurs et aux concepteurs la flexibilité nécessaire pour obtenir des conceptions de fenêtre d'affichage responsives.

Ressources

:has()

Navigateurs pris en charge

  • 105
  • 105
  • 121
  • 15,4

Source

Avant :has(), l'objet d'un sélecteur se trouvait toujours à la fin. Par exemple, l'objet de ce sélecteur est un élément de liste: ul > li. Les pseudo-sélecteurs peuvent modifier le sélecteur, mais ils ne changent pas de sujet: ul > li:hover ou ul > li:not(.selected).

Après :has(), un sujet situé plus haut dans l'arborescence des éléments peut le rester tout en fournissant une requête sur les enfants: ul:has(> li). Il est facile de comprendre comment :has() a obtenu le nom commun "sélecteur parent", car le sujet du sélecteur est désormais le parent dans ce cas.

Voici un exemple de syntaxe de base dans lequel la classe .parent reste l'objet, mais n'est sélectionnée que si un élément enfant comporte la classe .child:

.parent:has(.child) {...}

Voici un exemple dans lequel un élément <section> est l'objet, mais le sélecteur ne correspond que si l'un des enfants comporte :focus-visible:

section:has(*:focus-visible) {...}

Le sélecteur :has() commence à devenir un utilitaire fantastique lorsque de nouveaux cas d'utilisation pratiques deviennent évidents. Par exemple, il n'est actuellement pas possible de sélectionner des tags <a> lorsqu'ils encapsulent des images. Il est donc difficile d'apprendre au tag d'ancrage à modifier ses styles dans ce cas d'utilisation. Cela est possible avec :has(), mais:

a:has(> img) {...}

Voici quelques exemples où :has() ne ressemble qu'à un sélecteur parent. Considérons le cas d'utilisation d'images dans des éléments <figure> et l'ajustement des styles sur les images si la figure possède un élément <figcaption>. Dans l'exemple suivant, des figures avec figcaptions sont sélectionnées, puis des images dans ce contexte. :has() est utilisé et ne modifie pas de sujet, car nous ciblons les images et non les figures:

figure:has(figcaption) img {...}

Les combinaisons semblent infinies. Combinez :has() avec des requêtes de quantité et ajustez les mises en page de grille CSS en fonction du nombre d'enfants. Combinez :has() avec des états de pseudo-classe interactifs et créez des applications qui répondent de nouvelles manières créatives.

La vérification de la compatibilité est simplifiée avec @supports et sa fonction selector(), qui vérifie si le navigateur comprend la syntaxe avant de l'utiliser:

@supports (selector(:has(works))) {
  /* safe to use :has() */
}

Ressources

2022 et au-delà

Il y aura encore un certain nombre de choses qui seront difficiles à faire après l'arrivée de toutes ces fonctionnalités étonnantes en 2022. La section suivante examine certains des problèmes restants et les solutions en cours de développement pour les résoudre. Ces solutions sont expérimentales, même si elles peuvent être spécifiées ou disponibles derrière des indicateurs dans les navigateurs.

Le résultat des sections suivantes doit être rassurant : de nombreuses personnes de nombreuses entreprises cherchent une solution aux problèmes listés, et non pas que ces solutions seront lancées en 2023.

Propriétés personnalisées peu typées

Navigateurs pris en charge

  • 85
  • 85
  • 16.4

Source

Les propriétés personnalisées CSS sont incroyables. Ils permettent de stocker toutes sortes d'éléments dans une variable nommée, qui peut ensuite être étendue, calculée, partagée, etc. En fait, ils sont si flexibles qu'il serait intéressant d'en avoir moins.

Prenons l'exemple d'un box-shadow qui utilise des propriétés personnalisées pour ses valeurs:

box-shadow: var(--x) var(--y) var(--blur) var(--spread) var(--color);

Tout fonctionne correctement jusqu'à ce que l'une des propriétés soit remplacée par une valeur non acceptée par CSS, comme --x: red. L'ombre entière se rompt si l'une des variables imbriquées est manquante ou est définie sur un type de valeur non valide.

C'est là qu'intervient @property: --x peut devenir une propriété personnalisée typée, qui n'est plus lâche et flexible, mais sûre avec certaines limites définies:

@property --x {
  syntax: '<length>';
  initial-value: 0px;
  inherits: false;
}

Désormais, lorsque box-shadow utilise var(--x) et qu'une --x: red ultérieure est tentée, red est ignoré, car il ne s'agit pas d'une <length>. Cela signifie que l'ombre continue de fonctionner même si une valeur non valide a été attribuée à l'une de ses propriétés personnalisées. Au lieu d'échouer, il rétablit sa initial-value de 0px.

Animation

En plus de la sûreté du typage, cela ouvre également de nombreuses portes pour l'animation. La flexibilité de la syntaxe CSS rend impossible l'animation de certaines choses, comme les dégradés. @property est utile ici, car la propriété CSS typée peut informer le navigateur de l'intention d'un développeur dans une interpolation autrement trop complexe. Cela limite essentiellement les possibilités qu'un navigateur pourrait animer pour des aspects d'un style qu'il ne pouvait pas auparavant.

Prenons cet exemple de démonstration dans lequel un dégradé radial est utilisé pour créer une partie d'une superposition, créant ainsi un effet de mise au point de type "effet de projecteur". JavaScript définit les valeurs x et y de la souris lorsque l'utilisateur appuie sur la touche alt/opt. Il définit ensuite la taille focale sur une valeur inférieure (25%, par exemple), ce qui crée le cercle de mise en surbrillance du focus à la position de la souris:

Essayer la démonstration
.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );
}

En revanche, les dégradés ne peuvent pas être animés. Ils sont trop flexibles et trop complexes pour que le navigateur puisse "dériver" simplement la façon dont vous souhaitez qu'ils s'animent. Avec @property, cependant, une propriété peut être saisie et animée de manière isolée, ce qui permet au navigateur de comprendre facilement l'intent.

Dans les jeux vidéo qui utilisent cet effet de focalisation, le cercle est toujours animé, passant d'un grand cercle à un petit cercle. Voici comment utiliser @property avec notre démonstration afin que le navigateur anime le masque de dégradé:

@property --focal-size {
  syntax: '<length-percentage>';
  initial-value: 100%;
  inherits: false;
}

.focus-effect {
  --focal-size: 100%;
  --mouse-x: center;
  --mouse-y: center;

  mask-image: radial-gradient(
    circle at var(--mouse-x) var(--mouse-y),
    transparent 0%,
    transparent var(--focal-size),
    black 0%
  );

  transition: --focal-size .3s ease;
}
Essayer la démonstration

Le navigateur est désormais en mesure d'animer la taille du dégradé, car nous avons réduit la surface de la modification à une seule propriété et saisi la valeur pour que le navigateur puisse interpoler intelligemment les longueurs.

@property offre beaucoup d'autres fonctionnalités, mais ces petites activations peuvent être très efficaces.

Ressources

Se trouvait en min-width ou max-width

Avant les plages de requêtes média, une requête média CSS utilise min-width et max-width pour s'exprimer sur et sous certaines conditions. Cela peut se présenter comme suit :

@media (min-width: 320px) {
  …
}

Après la plage de requêtes média, la même requête média pourrait se présenter comme suit:

@media (width >= 320px) {
  …
}

Une requête média CSS qui utilise à la fois min-width et max-width peut se présenter comme suit:

@media (min-width: 320px) and (max-width: 1280px) {
  …
}

Après la plage de requêtes média, la même requête média pourrait se présenter comme suit:

@media (320px <= width <= 1280px) {
  …
}

Selon vos compétences en codage, l'une d'elles paraîtra beaucoup plus lisible que l'autre. Grâce aux ajouts de spécifications, les développeurs peuvent choisir celui qu'ils préfèrent, ou même les utiliser de manière interchangeable.

Ressources

Aucune variable de requête média

Avant @custom-media, les requêtes média devaient se répéter encore et encore, ou utiliser des préprocesseurs pour générer la sortie appropriée à partir de variables statiques au moment de la compilation.

Après @custom-media, le CSS permet la création d'alias pour les requêtes multimédias et leur référencement, comme pour une propriété personnalisée.

Il est très important de nommer les éléments: cela peut aligner l'objectif avec la syntaxe, ce qui facilite le partage et l'utilisation en équipe. Voici quelques requêtes média personnalisées qui me suivent entre les projets:

@custom-media --OSdark  (prefers-color-scheme: dark);
@custom-media --OSlight (prefers-color-scheme: light);

@custom-media --pointer (hover) and (pointer: coarse);
@custom-media --mouse   (hover) and (pointer: fine);

@custom-media --xxs-and-above (width >= 240px);
@custom-media --xxs-and-below (width <= 240px);

Maintenant qu'ils sont définis, je peux utiliser l'un d'eux comme ceci:

@media (--OSdark) {
  :root {
    …
  }
}

La liste complète des requêtes médias personnalisées que j'utilise dans ma bibliothèque de propriétés personnalisées CSS Open Props

Ressources

L'imbrication de sélecteurs est pratique

Avant le @nest, les feuilles de style étaient très répétitives. Cela devenait particulièrement difficile à gérer lorsque les sélecteurs étaient longs et que chacun ciblait de petites différences. La commodité de l'imbrication est l'une des raisons les plus courantes d'adopter un préprocesseur.

Après @nest, la répétition a disparu. Presque toutes les fonctionnalités de l'imbrication compatible avec le prétraitement seront disponibles dans CSS.

article {
  color: darkgray;
}

article > a {
  color: var(--link-color);
}

/* with @nest becomes */

article {
  color: darkgray;

  & > a {
    color: var(--link-color);
  }
}

Pour moi, ce qui importe le plus avec l'imbrication, en plus de ne pas répéter article dans le sélecteur imbriqué, c'est que le contexte de style reste dans un bloc de style. Au lieu de passer d'un sélecteur et de ses styles à un autre sélecteur avec des styles (exemple 1), le lecteur peut rester dans le contexte d'un article et voir que l'article possède les liens qu'il contient. La relation et l'intent de style sont regroupés. article peut donc sembler posséder ses propres styles.

La propriété pourrait également être considérée comme une centralisation. Au lieu de chercher les styles pertinents autour d'une feuille de style, ils peuvent tous être imbriqués dans un contexte. Cela fonctionne avec les relations parent-enfant, mais également avec les relations enfant-parent.

Prenons l'exemple d'un composant enfant qui souhaite s'adapter dans un contexte parent différent, par opposition au parent qui possède le style et modifie un enfant:

/* parent owns this, adjusting children */
section:focus-within > article {
  border: 1px solid hotpink;
}

/* with @nest becomes */

/* article owns this, adjusting itself when inside a section:focus-within */
article {
  @nest section:focus-within > & {
     border: 1px solid hotpink;
  }
}

@nest aide globalement à une organisation, une centralisation et une appropriation plus saines. Les composants peuvent regrouper et posséder leurs propres styles, au lieu de les répartir entre d'autres blocs de style. Cette métrique peut sembler minime dans ces exemples, mais peut avoir de très grands impacts, pour des raisons de commodité et de lisibilité.

Ressources

Il est très difficile de définir la portée des styles

Navigateurs pris en charge

  • 118
  • 118
  • x
  • 17,4

Avant @scope, de nombreuses stratégies existaient, car les styles CSS sont appliqués en cascade, héritent par défaut et s'appliquent à l'ensemble des stratégies par défaut. Ces fonctionnalités CSS sont très pratiques pour beaucoup de choses, mais pour les sites et les applications complexes, avec potentiellement de nombreux styles de composants différents, l'espace global et la nature de la cascade peuvent donner l'impression que les styles fuient.

Après @scope, non seulement les styles peuvent être limités à un contexte, comme une classe, mais ils peuvent également indiquer où les styles se terminent et ne continuent plus à être en cascade ou à hériter.

Dans l'exemple suivant, la portée de la convention d'attribution de noms BEM peut être inversée pour l'intent réel. Le sélecteur BEM tente de limiter la couleur d'un élément header à un conteneur .card avec des conventions de nommage. Pour cela, l'en-tête doit comporter ce nom de classe, ce qui permet d'atteindre l'objectif. Avec @scope, aucune convention d'attribution de noms n'est requise pour atteindre le même objectif sans baliser l'élément d'en-tête:

.card__header {
  color: var(--text);
}

/* with @scope becomes */

@scope (.card) {
  header {
    color: var(--text);
  }
}

Voici un autre exemple, moins spécifique au composant, mais plus sur le champ d'application global du CSS. Les thèmes sombre et clair doivent coexister dans une feuille de style, où l'ordre est important pour déterminer un style gagnant. En général, cela signifie que les styles du thème sombre viennent après le thème clair. Cela définit la lumière comme le thème par défaut et le style sombre comme style facultatif. Évitez les conflits d'ordre et de portée avec @scope:

​​@scope (.light-theme) {
  a { color: purple; }
}

@scope (.dark-theme) {
  a { color: plum; }
}

Pour compléter l'histoire, @scope permet également de déterminer où se termine le champ d'application du style. Cette opération est impossible avec une convention d'attribution de noms ou un préprocesseur. Cette opération est spéciale et n'est possible que si le CSS intégré au navigateur le permet. Dans l'exemple suivant, les styles img et .content sont appliqués exclusivement lorsqu'un enfant d'un .media-block est un parent de .content ou un frère ou une sœur:

@scope (.media-block) to (.content) {
  img {
    border-radius: 50%;
  }

  .content {
    padding: 1em;
  }
}

Ressources

Pas de méthode CSS pour une mise en page en maçonnerie

Avant la maçonnerie CSS avec grille, JavaScript était le meilleur moyen d'obtenir une mise en page en maçonnerie, car toutes les méthodes CSS avec des colonnes ou Flexbox représenteraient de manière inexacte l'ordre du contenu.

Après la maçonnerie CSS avec grille, aucune bibliothèque JavaScript n'est requise et l'ordre du contenu est correct.

Capture d&#39;écran de la mise en page en maçonnerie qui montre les chiffres qui se déplacent le long du haut, puis qui descendent.
Image et démo de Smashing Magazine
https://www.smashingmagazine.com/native-css-masonry-layout-css-grid/

La démo précédente est réalisée avec le CSS suivant:

.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: masonry;
}

Il est rassurant de savoir qu'il s'agit d'une stratégie de mise en page manquante. Vous pouvez également l'essayer dès aujourd'hui dans Firefox.

Ressources

Le CSS ne peut pas aider les utilisateurs à réduire la consommation de données

Navigateurs pris en charge

  • x
  • x

Source

Avant la requête média prefers-reduced-data, JavaScript et un serveur pouvaient modifier leur comportement en fonction du système d'exploitation ou de l'option "Économiseur de données" de l'utilisateur, ce qui n'était pas le cas avec CSS.

Après la requête média prefers-reduced-data, le CSS peut participer à l'amélioration de l'expérience utilisateur et jouer son rôle dans l'enregistrement des données.

@media (prefers-reduced-data: reduce) {
  picture, video {
    display: none;
  }
}

Le CSS précédent est utilisé dans ce composant de défilement multimédia, ce qui peut faire des économies considérables. Selon la taille de la fenêtre d'affichage de visite, plus il est possible de réaliser des économies sur le chargement de la page. L'enregistrement se poursuit alors que les utilisateurs interagissent avec les défilements multimédias. Toutes les images comportent des attributs loading="lazy". Par conséquent, lorsque vous utilisez du code CSS qui masque entièrement l'élément, aucune requête réseau n'est envoyée pour l'image.

Capture d&#39;écran d&#39;une interface de carrousel d&#39;émissions TV avec de nombreuses miniatures et des titres affichés.

Lors de mes tests, dans une fenêtre d'affichage de taille moyenne, 40 requêtes et 700 Ko de ressources ont été initialement chargés. Lorsqu'un utilisateur fait défiler la sélection de fichiers multimédias, davantage de requêtes et de ressources sont chargées. Avec CSS et la requête média de données réduite, 10 requêtes et 172 ko de ressources sont chargés. Cela représente un demi-mégaoctet d'économies et l'utilisateur n'a même fait défiler aucun des contenus multimédias. À ce stade, aucune requête supplémentaire n'est effectuée.

Capture d&#39;écran d&#39;une interface de carrousel d&#39;émissions TV sans miniature et de nombreux titres affichés

Cette expérience réduite présente bien d'autres avantages que les économies de données. Davantage de titres sont visibles et aucune image de couverture ne détourne l'attention. De nombreux utilisateurs naviguent en mode Économiseur de données, car ils paient par mégaoctet de données. C'est très agréable de voir que CSS peut vous aider.

Ressources

Les fonctionnalités d'ancrage de défilement sont trop limitées

Avant ces propositions d'ancrage du défilement, écrire votre propre code JavaScript pour gérer un carrousel, un curseur ou une galerie pouvait rapidement devenir complexe avec tous les observateurs et la gestion de l'état. De plus, si ce n'est pas fait, les vitesses de défilement naturelles pourraient être normalisées par le script, ce qui rendrait l'interaction utilisateur un peu artificielle et potentiellement gênante.

Nouvelles API

snapChanging()

Dès que le navigateur a publié un élément enfant Snap, cet événement se déclenche. Cela permet à l'UI de refléter l'absence d'élément enfant d'ancrage et l'état d'ancrage indéterminé du conteneur de défilement, car il est désormais utilisé et arrivera ailleurs.

document.querySelector('.snap-carousel').addEventListener('snapchanging', event => {
  console.log('Snap is changing', event.snappedTargetsList);
});
snapChanged()

Dès que le navigateur s'est connecté à un nouvel enfant et que le conteneur de défilement est reposé, cet événement se déclenche. Cela permet à toute interface utilisateur qui dépend de l'élément enfant ancré de mettre à jour et de refléter la connexion.

document.querySelector('.snap-carousel').addEventListener('snapchanged', event => {
  console.log('Snap changed', event.snappedTargetsList);
});
scroll-start

Le défilement ne commence pas toujours au début. Prenons l'exemple de composants à faire glisser, où le balayage vers la gauche ou vers la droite déclenche différents événements, ou une barre de recherche qui, lors du chargement de la page, est initialement masquée jusqu'à ce que vous fassiez défiler la page jusqu'en haut. Cette propriété CSS permet aux développeurs de spécifier qu'un conteneur de défilement doit commencer à un point spécifique.

:root { --nav-height: 100px }

.snap-scroll-y {
  scroll-start-y: var(--nav-height);
}
:snap-target

Ce sélecteur CSS mettra en correspondance les éléments d'un conteneur d'ancrage de défilement qui sont actuellement ancrés par le navigateur.

.card {
  --shadow-distance: 5px;
  box-shadow: 0 var(--shadow-distance) 5px hsl(0 0% 0% / 25%);
  transition: box-shadow 350ms ease;
}

.card:snapped {
  --shadow-distance: 30px;
}

Après ces propositions d'ancrage du défilement, il est beaucoup plus facile de créer un curseur, un carrousel ou une galerie, car le navigateur offre désormais des fonctionnalités pratiques pour la tâche, éliminant les observateurs et le code d'orchestration du défilement au profit d'API intégrées.

Ces fonctionnalités CSS et JavaScript n'en sont encore qu'à leurs débuts, mais soyez à l'affût des polyfills qui pourront bientôt faciliter leur adoption et leur test.

Ressources

Passage d'un état connu à un autre

Avant toggle(), seuls les états intégrés au navigateur pouvaient être exploités pour le style et l'interaction. L'entrée de la case à cocher, par exemple, contient :checked, un état de navigateur géré en interne pour l'entrée que CSS peut utiliser pour modifier visuellement l'élément.

Après toggle(), il est possible de créer des états personnalisés sur n'importe quel élément afin que le CSS puisse modifier et utiliser le style. Elle autorise les groupes, le vélo, le basculement dirigé, etc.

Dans l'exemple suivant, le même effet d'un élément de liste barré sur la lecture complète est obtenu, mais sans aucun élément de case à cocher:

<ul class='ingredients'>
   <li>1 banana
   <li>1 cup blueberries
  ...
</ul>

Et les styles CSS toggle() pertinents:

li {
  toggle-root: check self;
}

li:toggle(check) {
  text-decoration: line-through;
}

Si vous connaissez les machines à états, vous remarquerez peut-être l'ampleur du crossover associé à toggle(). Cette fonctionnalité permettra aux développeurs d'intégrer une plus grande partie de leur état dans CSS, ce qui devrait permettre d'orchestrer l'interaction et l'état de manière plus claire et plus sémantique.

Ressources

Personnaliser les éléments sélectionnés

Avant <selectmenu>, le CSS ne permettait pas de personnaliser les éléments <option> avec du code HTML enrichi ni de modifier beaucoup l'affichage d'une liste d'options. Cela a conduit les développeurs à charger des bibliothèques externes recréant une grande partie des fonctionnalités d'un <select>, ce qui représentait beaucoup de travail.

Après <selectmenu>, les développeurs peuvent fournir du code HTML enrichi pour les éléments d'options et leur appliquer un style selon leurs besoins, tout en respectant les exigences d'accessibilité et en fournissant du code HTML sémantique.

Dans l'exemple suivant, issu de la page d'explication <selectmenu>, un menu de sélection est créé avec quelques options de base:

<selectmenu>
  <option>Option 1</option>
  <option>Option 2</option>
  <option>Option 3</option>
</selectmenu>

Le CSS peut cibler les parties de l'élément et leur appliquer un style:

.my-select-menu::part(button) {
  color: white;
  background-color: red;
  padding: 5px;
  border-radius: 5px;
}

.my-select-menu::part(listbox) {
  padding: 10px;
  margin-top: 5px;
  border: 1px solid red;
  border-radius: 5px;
}

Menu d&#39;aspect raffiné avec des couleurs d&#39;accentuation rouges.

Vous pouvez essayer l'élément <selectmenu> dans Chromium dans Canary en activant l'indicateur de tests Web. En 2023 et au-delà, nous vous proposerons une sélection d'éléments de menu personnalisables.

Ressources

Ancrer un élément à un autre

Avant anchor(), les stratégies de position absolue et relative étaient fournies pour permettre aux développeurs de déplacer les éléments enfants au sein d'un élément parent.

Après anchor(), les développeurs peuvent positionner des éléments sur d'autres éléments, qu'ils soient enfants ou non. Il permet également aux développeurs de spécifier la bordure à positionner ainsi que d'autres avantages permettant de créer des relations de position entre les éléments.

Cette vidéo explicative contient quelques excellents exemples de code si vous souhaitez en savoir plus.

Ressources