Listes, marqueurs et compteurs CSS
Les listes en CSS ont des propriétés particulières qui nous donnent le style de liste standard que nous attendons. Une liste non ordonnée gagne une puce de liste, du type disque
et les listes ordonnées sont numérotées. Mon intérêt pour l'exploration des listes plus en détail est issu d'un travail que j'ai réalisé pour documenter le pseudo-élément :: marker
pour MDN. Ce pseudo-élément est livré dans Firefox 68 et est publié aujourd'hui . Avec le pseudo-élément :: marker
à notre disposition, nous pouvons commencer à faire des choses intéressantes avec des listes, et dans cet article, je vais vous expliquer davantage.
Deconstructing A List
Nous n’avons pas beaucoup réfléchi aux listes, même si nous les utilisons fréquemment dans notre balisage. Beaucoup de choses peuvent être logiquement marquées comme une liste. Bien que des instructions pas à pas ou des éléments classés puissent naturellement être décrits par une liste ordonnée
- de nombreux éléments d’une conception peuvent être décrits à l’aide d’une liste non ordonnée
. Une utilisation très courante de l'élément, par exemple, est de baliser la navigation, car il s'agit d'une liste de destinations sur le site. Pour notre exploration, commençons par découvrir exactement ce qu’est une liste en CSS. Comme pour beaucoup d’autres choses en CSS, les valeurs initiales sont appliquées aux listes. Ces valeurs les font ressembler à une liste. Ces valeurs spéciales commencent par l'information qu'un élément de la liste a la propriété d'affichage
avec une valeur de l'élément de liste
. Cela crée une zone de niveau bloc, avec une zone de marqueur supplémentaire. La boîte de marqueur est l'endroit où la puce ou le numéro de liste est ajouté.
Les listes ont été définies à un stade précoce dans CSS, et une grande partie de la définition des listes telle que nous les utilisons aujourd'hui provient de CSS2. La spécification CSS2 décrit un élément de liste comme suit:
«Un élément avec
display: list-item
génère une zone de bloc principale pour le contenu de l'élément et, en fonction des valeurs destyle liste
et
list-style-image
éventuellement aussi une boîte de marqueur indiquant visuellement que l'élément est un élément de la liste. "
La zone de bloc principale est la zone principale de l'élément. et contient tous les enfants puisqu'un élément de liste peut contenir d'autres balises. La boîte de marqueur est ensuite placée par rapport à cette boîte principale. La spécification poursuit en détaillant le fait que toute couleur d'arrière-plan sera uniquement derrière cette zone principale, et non le marqueur. Le marqueur peut également être défini sur l'une des valeurs prédéfinies suivantes:
disc
circle
square
décimal
décimal [0909012] lower-roman
] haut-romain
bas-grec
bas-latin
haut-latin
arménien
géorgien
bas-alpha
haut-alpha
aucune
héritage
La spécification d'affichage de niveau 3 définit display: élément de liste
ainsi que les autres valeurs possibles pour la propriété display
. Il renvoie à CSS 2.1 – de même que de nombreuses propriétés et valeurs CSS issues de CSS2 – mais décrit le mot clé de l'élément de liste
comme suit: «L'élément génère un :: marker
. pseudo-élément ”.
La spécification de niveau 3 introduit également la possibilité de créer un élément de liste en ligne avec la syntaxe à deux valeurs utilisée . Affichage: élément de liste en ligne
. Ceci n'est pas encore implémenté par les navigateurs.
Création de zones de marqueur sur des éléments non-listés
Comme pour les autres valeurs de display
il est parfaitement correct de donner à tout élément HTML un type d'affichage de . ] liste-item
(si vous souhaitez générer un pseudo-élément :: marker
sur cet item). Cela ne fera pas que l'élément devienne un élément de liste sémantiquement, mais qu'il s'affichera uniquement sous forme d'élément de liste et pourra donc avoir un :: marker
. Lorsque nous aborderons le pseudo-élément :: marker
ci-dessous, vous découvrirez des cas où l'affichage d'autres éléments : list-item
peut être utile.
Les listes CSS de niveau 3 Spécification: :: marker
et des compteurs
La spécification display
élargit et clarifie la définition des listes que nous trouvons dans CSS2. Cependant, il existe également une spécification qui définit le comportement de liste dans détail: la spécification de listes CSS de niveau 3 . Comme le comportement de base des éléments de liste est défini dans display
cette spécification détaille la boîte de marqueur générée lorsque quelque chose a display: list-item
ainsi que les compteurs utilisés par défaut. créer une liste ordonnée. Certaines fonctionnalités potentiellement utiles sont accessibles via ces fonctionnalités.
Le pseudo-élément :: marker
Le pseudo-élément :: marker
vous permet de cibler le marqueur de liste. – séparément du contenu de l'élément de liste. Cela n’était pas possible dans les versions précédentes de CSS. Par conséquent, si vous changiez la couleur ou la taille de la police de caractères ul
ou li
cela modifierait également la couleur et la taille de police des marqueurs. . Pour faire quelque chose d'aussi simple en apparence que d'avoir des puces de liste de couleurs différentes de celles du texte, impliquerait de placer le contenu de l'élément de liste dans une plage (ou d'utiliser une image pour le marqueur).
ul {
couleur: # 00b7a8;
}
ul span {
couleur # 333;
}
Avec le pseudo-élément :: marker
la chose la plus simple à essayer est d'essayer de remplacer la couleur du texte par une autre puce, ce qui signifie qu'au lieu du code de l'exemple ci-dessus, vous pouvez utiliser: 19659036] ul {
couleur: # 333;
}
ul :: marker {
couleur: # 00b7a8;
}
Vous pouvez également utiliser une taille différente et une famille de polices
pour la numérotation sur une liste ordonnée.
ol :: marker {
taille de police: 200%;
couleur: # 00b7a8;
famille de fontes: "Comic Sans MS", cursive, sans-serif;
}
Vous pouvez voir tous ces éléments dans un navigateur prenant en charge mon exemple CodePen:
Voir le stylo [Colored bullets with and without marker] (https://codepen.io/rachelandrew/penVJQyoR) de Rachel Andrew
Vous pouvez utiliser le pseudo-élément :: marker
sur non -liste des articles. Dans le code ci-dessous, j'ai défini l'en-tête sur : list-item
. Cela lui donne une balle et donc une case :: marker
à cibler.
J'ai changé la balle pour utiliser un emoji:
h1 {.
display: liste-item;
}
h1 :: marker {
contenu: "";
}

Voir le stylo [Heading and marker] (https://codepen.io/rachelandrew/pen / wLyyMG) de Rachel Andrew .
Dans l’exemple ci-dessus, j’ai utilisé le traitement généré. contenu dans les règles pour le marqueur. Seul un petit sous-ensemble de propriétés CSS est disponible pour une utilisation sur :: marker
. Celles-ci incluent les propriétés de police et la couleur, mais elles incluent également la propriété content
pour inclure le contenu généré.
L'ajout de contenu
en tant que propriété autorisée pour : Le marqueur
est récent, mais il est inclus dans l'implémentation de Firefox. L'inclusion signifie que vous pouvez faire des choses comme inclure une chaîne de texte dans un :: marker
. Il offre également des possibilités supplémentaires de formatage des marqueurs lorsque vous combinez l'utilisation de compteurs avec :: marker
.
Prise en charge et repli du navigateur
Pour les navigateurs qui ne prennent pas en charge le :: marker
pseudo-élément, le repli est le marqueur régulier qui aurait été affiché de toute façon. Malheureusement, nous ne pouvons actuellement pas utiliser les requêtes de fonction pour détecter la prise en charge de sélecteurs tels que ce pseudo-élément pour le moment, bien que un problème ait été soulevé concernant l'ajout de cela à la spécification. Cela signifie que vous ne pouvez pas modifier votre code pour faire une chose quand vous avez du support et quelque chose d’autre si vous n’avez pas. Dans la plupart des cas, le retour au marqueur normal constitue une solution raisonnable.
Les compteurs
Les listes ordonnées sont numérotées – ce qui est obtenu au moyen d'un compteur CSS. La spécification CSS Lists décrit donc également ces compteurs. Nous pouvons accéder et créer nous-mêmes des compteurs qui, combinés au pseudo-élément :: marker
peuvent nous fournir des fonctionnalités utiles. Ces compteurs peuvent également être utilisés dans un contenu généré régulièrement (non :: marker
).
Si j'ai une liste numérotée d'étapes (et j'aimerais écrire «Étape 1», «Étape 2 ”, Etc.), je peux le faire en utilisant le contenu généré dans mon marqueur et en ajoutant le compteur de l'élément de liste
cela représente le compteur intégré:
:: marker {
content: "Step" compteur (élément de liste) ":";
}

Voir le stylo [Counters and marker] ( https://codepen.io/rachelandrew/pen/BgRaoz) de Rachel Andrew .
Si vous avez des listes imbriquées, une méthode courante pour les numéroter consiste à attribuer à l'élément de niveau supérieur un nombre entier (1), puis les éléments enfant sous forme (1.1, 1.2) et leurs enfants (1.1. 1, 1.1.2), et ainsi de suite. Vous pouvez y parvenir en utilisant davantage de fonctionnalités de compteurs.
Lorsque vous imbriquez des listes HTML, vous vous retrouvez avec plusieurs compteurs du même nom, imbriqués les uns dans les autres. Le nid de compteurs est accessible à l'aide de la fonction de compteurs ()
.
Dans le code ci-dessous, j'utilise des compteurs ()
pour formater mes marqueurs de liste comme décrit ci-dessus. Le premier argument de counters ()
est le nom du compteur à utiliser. J'utilise le compteur intégré list-item
. Le deuxième argument est une chaîne – c’est ce qui sera concaténé entre les compteurs de sortie (j’utilise un .
). Enfin, j'ajoute un :
à l'extérieur de la fonction de compteur, mais à l'intérieur de la valeur de content
de sorte que ma contre-sortie sera séparée du contenu par un signe deux-points.
:: marker {
contenu: compteurs (élément de liste, '.') ':';
couleur: # 00b7a8;
poids de police: gras;
}
Cela me donne la sortie comme dans l'image. Si vous utilisez un navigateur qui prend en charge :: marker
et ses compteurs, vous pouvez le voir fonctionner dans l'exemple CodePen – essayez de changer la chaîne d'un .

Voir le stylo [Nested counters] (https: // codepen .io / rachelandrew / pen / VJbwxL) de Rachel Andrew .
counter ()
Et des compteurs ()
? La fonction counter ()
utilisée dans le premier exemple pour écrire nos étapes utilise uniquement le compteur le plus à l'intérieur . Par conséquent, dans le cas où vous avez un ensemble de listes imbriquées, vous écrivez le compteur correspondant au niveau actuel.
La fonction counters () [)
écrit essentiellement toute cette branche. et vous donne la possibilité de concaténer une chaîne entre les compteurs de la branche. Donc, si vous avez un élément de liste avec un compteur de 2
(qui fait partie d'une liste imbriquée dans un élément de liste avec un compteur de 4
), alors la branche contient: [19659007] Vous pouvez afficher ceci sous la forme 4.2
dans le marqueur en utilisant:
:: marker {
contenu: compteurs (élément de liste, '.');
}
Compteurs sur d'autres éléments
Les compteurs peuvent être utilisés sur des choses qui ne sont pas des listes – soit pour produire un marqueur – dans ce cas, l'élément devra afficher : list-item
– ou pour afficher le contenu généré régulièrement. Les compteurs sont largement utilisés dans la production de livres afin de permettre la numérotation des chapitres et des figures. Il n'y a aucune raison de ne pas adopter une approche similaire sur le Web, en particulier pour les articles plus longs.
Les propriétés CSS définies dans la spécification des listes CSS qui traitent de ces compteurs sont les suivantes:
counter-set
. reset
counter-increment
Pour voir comment cela fonctionne en dehors des listes, examinons un exemple d'utilisation de compteurs pour numéroter les en-têtes d'un document.
La première chose à faire est de créer un compteur. pour en-têtes sur l'élément body – prêt à l'emploi. J'utilise la propriété counter-reset
pour cela. Les propriétés counter-reset
et counter-set
sont très similaires. La propriété counter-reset
créera un nouveau compteur si un compteur du nom spécifié n'existe pas déjà, mais créera également des compteurs imbriqués comme décrit ci-dessus si un compteur de ce nom existe. La propriété counter-set
ne créera un nouveau compteur que s'il n'y a pas de compteur portant ce nom. Pour cela, utiliser l’une ou l’autre des propriétés fonctionnerait très bien, cependant, le sous-ensemble
n’est pas aussi bien supporté par le navigateur que le counter-reset
aussi je prends la voie pratique: [19659036] corps {
counter-reset: compteur de cap;
}
Maintenant que j'ai un compteur, je peux alors utiliser la propriété de contrer-incrémenter
sur le sélecteur pour les en-têtes; cela devrait incrémenter le compteur chaque fois que le sélecteur correspond.
h2 {
contre-incrémentation: en-tête-compteur;
}
Pour voir la valeur, je dois la sortir dans le document. Je peux le faire en utilisant Generated Content et en l'ajoutant avant
l'en-tête comme indiqué dans l'exemple suivant de CodePen:
h2 :: before {
contenu: compteur (en-tête-compteur) ":";
couleur: # 00b7a8;
poids de police: gras;
}
Voir le stylo [Headings and counters] (https://codepen.io/rachelandrew/pen/gNGjxq) de Rachel Andrew .
Sinon, je pourrais transformer l'élément h2
en élément de liste
puis utiliser :: marqueur
comme démontré ci-dessous. Comme déjà détaillé, l'utilisation de l'élément :: marker
prend en charge de manière limitée le navigateur. Dans Firefox, vous devriez voir le compteur utilisé comme marqueur pour l'en-tête, tandis que d'autres navigateurs afficheront la puce par défaut.
h2 {
display: liste-item;
}
h2 :: marker {
contenu: compteur (en-tête-compteur) ":";
couleur: # 00b7a8;
poids de police: gras;
}
Voir le stylo [Headings, markers, and counters] (https://codepen.io/rachelandrew/pen/pXWZay) de Rachel Andrew .
Compteurs sur les éléments de formulaire
Il existe également un peu d’interactivité que vous pouvez obtenir avec les compteurs CSS, ce que vous pensez peut-être avoir besoin de JavaScript. 19659007] J'ai un formulaire comportant un certain nombre de champs obligatoires. Le statut requis peut être sélectionné dans CSS avec une pseudo-classe : required
et le fait qu'un champ n'a pas été renseigné peut être détecté via la pseudo-classe : invalid
. Cela signifie que nous pouvons vérifier les champs obligatoires et non valides, et incrémenter un compteur. Ensuite, indiquez le contenu généré.
Voir le stylo [Counting required form fields] (https://codepen.io/rachelandrew/pen/vqpJdM) de Rachel Andrew .
Il est discutable de savoir si cela est utile dans la réalité – étant donné que nous ne pouvons vraiment rien faire avec cette valeur si ce n'est de le coller dans un contenu généré. Il existe également des préoccupations quant à l'inaccessibilité du contenu généré à certains lecteurs d'écran. Par conséquent, tout usage non seulement décoratif aurait pour but de garantir d'autres moyens d'accéder à ces informations. Lisez « Prise en charge de l'accessibilité pour le contenu généré par CSS » et les informations plus récentes, « Compatibilité des lecteurs d'écran des propriétés du contenu CSS » pour plus de détails sur l'accessibilité et le contenu généré.
Toutefois, cela montre que les compteurs peuvent réaliser plus de choses utiles que la simple numérotation des listes. Il se peut qu'un jour, ces connaissances vous soient utiles pour résoudre un problème sur lequel vous travaillez.
En savoir plus
Cet article s'est avéré bien éloigné des listes de mise en forme, malgré le fait que tout ce que j'ai décrit se trouve dans la spécification des listes CSS. Vous pouvez trouver plus d'informations sur les choses décrites dans les liens ci-dessous. Si vous avez trouvé une utilisation intéressante des compteurs CSS ou si vous avez des idées en rapport avec l'utilisation de :: marker
ajoutez une note dans les commentaires.

Source link