Comment un attribut HTML pilote toute la géométrie CSS sans JavaScript
Pour qui ? À toute personne qui a lu l'article du concept de base sur la Matrice 4×4 (et qui se demande comment le navigateur sait quelle lettre dessiner sans une seule ligne de JavaScript).
Prérequis : comprendre le principe de
clip-path: polygon() et des variables CSS
--A-x1 à --D-x4.
Si ces notions sont floues, commence par
la page du concept de la matrice.
Ce qu'on revoit :
utiliser un attribut data-* comme signal CSS pour
sélectionner, configurer et afficher un composant entier,
une lettre.
Dans la Matrice, chaque lettre est un polygone différent. Le L est fait de 6 points, le N de 10 points, le O de 16 points avec une fente invisible. Comment dire au navigateur lequel afficher ?
Les solutions naïves ont toutes un défaut :
.lettre-L, .lettre-N, etc.
Ça fonctionne, mais la classe ne porte aucune sémantique.
On ne sait pas pourquoi ce style est appliqué.L'objectif est d'avoir un seul type d'élément, un seul attribut, 26 formes possibles.
RAPPEL : En HTML, un attribut data-* est une donnée
attachée à un élément. Le navigateur l'ignore pour le rendu,
mais CSS peut le lire avec le
sélecteur d'attribut [attr="valeur"].
C'est exactement ce dont on a besoin : stocker la lettre voulue dans le HTML, et laisser CSS décider de la forme à afficher en fonction de cette valeur.
L'élément <div> est une coquille vide.
Sa seule responsabilité est de porter l'attribut
data-matrice-char. CSS fait le reste : il choisit
le bon clip-path, définit les variables de la
grille, et affiche la lettre via un pseudo-élément
::after.
C'est le principe data-driven : la donnée (le caractère) pilote le rendu (la géométrie), sans couche logique intermédiaire.
Je me suis rendu compte que je n'ai pas vraiment expliqué le [data-*]. Le sélecteur d'attribut CSS s'écrit entre crochets.
La valeur doit correspondre exactement à l'attribut HTML :
On utilise data-matrice-char dès qu'un élément
HTML doit afficher une lettre de la Matrice. Une règle par
valeur possible, une seule source de vérité par lettre.
Le composant se construit en trois couches CSS :
Tous les éléments [data-matrice-char]
partagent les mêmes variables de grille et le même
pseudo-élément ::after qui porte
la forme :
Chaque valeur d'attribut déclenche son propre
clip-path. Le sélecteur
[data-matrice-char="X"]::after
ne s'applique qu'à cette lettre précise.
Exemple avec le T :
Aucune coordonnée n'est codée en dur. Tous les points
sont des variables CSS calculées depuis
--offset. Modifier une seule valeur
suffit à redessiner la lettre entière.
La forme est figée par l'attribut. La matière est libre : on la change avec une classe CSS additionnelle sans toucher au polygone :
Un attribut data-* est une métadonnée
sémantique. Il décrit ce qu'est l'élément, pas comment
il doit s'afficher. CSS lit cette métadonnée et décide du rendu.
C'est une séparation nette des responsabilités :
data-matrice-char="A".
Porte l'accessibilité : role="img",
aria-label="Lettre A".Le même élément HTML, le même attribut, des valeurs
différentes. Chaque lettre ci-dessous n'est qu'un
<div data-matrice-char="X"> :
Forme par défaut
Classe .accent
Classe .inverted
Classe .texture
Le HTML de chaque démo est identique à une lettre près :
Changer "L" en "O" change la forme.
Ajouter class="inverted" change la matière.
Les deux dimensions sont indépendantes et orthogonales.
La valeur de data-matrice-char est
exactement le caractère affiché.
Pas d'abréviation, pas de code arbitraire.
data-matrice-char="A" affiche un A.
Un élément vide sans texte est invisible pour les
lecteurs d'écran. On ajoute systématiquement
role="img" et
aria-label="Lettre X"
Il serait temps que TOUT le monde le fasse (ptn).
Chaque point du clip-path est une
variable CSS. Les valeurs brutes en pixels n'ont
pas leur place dans les polygones.
Si --offset change, tout se recalcule.
L'attribut contrôle la forme via
[data-matrice-char="X"]::after.
La matière est contrôlée par une classe modificatrice
indépendante (.accent, .inverted,
.texture). Ces deux couches ne se mélangent
pas.
La sélection de la forme, le calcul des coordonnées
et l'application des variantes sont entièrement réalisés
en CSS. Aucun script ne lit ou ne modifie l'attribut.
je vais le répéter et le répéter encore.
Aucun JavaScript ne lit ou ne modifie l'attribut
data-matrice-char. Le navigateur gère tout
nativement. C'est la définition même du pattern
data-driven.
Si une animation est nécessaire sur le composant
(changement de couleur, apparition), elle utilise
Les même valeurs que n'importe quelle animation dans le CSS
il faut ajouter une règle steps() comme timing function.
C'est expliqué et documenté à la fin, dans
l'article typographie réactive.
L'attribut data-matrice-char est une interface
entre le HTML et le CSS. Il dit quoi afficher.
CSS décide comment.
Ce pattern data-driven a trois avantages concrets :
data-matrice-char="N" dans le HTML suffit
pour savoir ce que l'élément représente, sans ouvrir
la feuille de style.data-* et les sélecteurs CSS font partie
du standard HTML depuis 2014. Ce code fonctionnera
dans 20 ans.Un attribut. Un sélecteur. Une lettre.
Ce pattern data-driven est la base sur laquelle reposent les expériences suivantes :
--offset pour faire muter
la graisse de chaque lettre en temps réel, avec
@property et zéro JavaScript.
Les prochaines explorations possibles à partir de ce système :
data-matrice-char avec
@counter-style pour générer automatiquement
des titres en alphabet brutaliste.@property sur chaque coordonnée.