Fermer

juillet 9, 2019

Listes, marqueurs et compteurs CSS


Le style des listes de styles en CSS est plus vaste que vous ne le pensez. Dans cet article, Rachel commence par examiner les listes en CSS et se penche sur certaines fonctionnalités intéressantes définies dans la spécification des listes CSS – marqueurs et compteurs.

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 de style 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

    Voir le stylo Balles de couleur avec et sans marqueur 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: "";
    }
    
     En-tête avec un chat emoji à sa gauche
    Dans Firefox, vous pouvez voir le mot emoji utilisé comme marqueur.

    Voir le stylo [Heading and marker] (https://codepen.io/rachelandrew/pen / wLyyMG) de Rachel Andrew .

    Voir le stylo En-tête et marqueur 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) ":";
    }
    
     Une liste ordonnée avec les étapes 1, 2, etc., avant chaque élément de liste
    Dans Firefox, le compteur est précédé du mot «Step».

    Voir le stylo [Counters and marker] ( https://codepen.io/rachelandrew/pen/BgRaoz) de Rachel Andrew .

    Voir le stylo Les compteurs et les marqueurs de Rachel Andrew . 19659063] Compteurs imbriqués

    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 .

     Un ensemble de listes imbriquées
    Dans Firefox, la numérotation des listes imbriquées est séparée par des points.

    Voir le stylo [Nested counters] (https: // codepen .io / rachelandrew / pen / VJbwxL) de Rachel Andrew .

    Voir le stylo Les compteurs imbriqués de Rachel Andrew . Quelle est la différence entre 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 .

    Voir le stylo Les titres et les compteurs 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 .

    Voir le stylo Titres, marqueurs et compteurs 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 .

    Voir le stylo Compter les champs de formulaire obligatoires 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.