Comment ajouter sémantiquement un titre à une liste

120

Cela me dérange depuis un certain temps, et je me demande s'il existe un consensus sur la manière de procéder correctement. Lorsque j'utilise une liste HTML, comment puis-je inclure sémantiquement un en-tête pour la liste?

Une option est la suivante:

<h3>Fruits I Like:</h3>
<ul>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

mais sémantiquement l'en- <h3>tête n'est pas explicitement associé au<ul>

Une autre option est la suivante:

<ul>
    <li><h3>Fruits I Like:</h3></li>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

mais cela semble un peu sale, car l'en-tête n'est pas vraiment l'un des éléments de la liste.

Cette option n'est pas autorisée par le W3C:

<ul>
    <h3>Fruits I Like:</h3>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

comme <ul>« s ne peuvent contenir un ou plusieurs <li>s »

L'ancien "en-tête de liste" <lh>est le plus logique

<ul>
    <lh>Fruits I Like:</lh>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

mais bien sûr, cela ne fait pas officiellement partie du HTML

J'ai entendu dire que nous <label>utilisions comme un formulaire:

<ul>
    <label>Fruits I Like:</label>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

mais c'est un peu étrange et ne validera pas de toute façon.

Il est facile de voir les problèmes sémantiques en essayant de styliser les en- têtes de ma liste, où je finis par avoir besoin de mettre mes <h3>balises dans le premier <li>et de les cibler pour le style avec quelque chose comme:

ul li:first-of-type {
    list-style: none;
    margin-left: -1em;
    /*some other header styles*/
}

horreurs! Mais au moins de cette façon, je peux contrôler l'ensemble <ul>, l'en-tête et tout, en stylisant l' ulétiquette.

Quelle est la bonne façon de procéder? Des idées?

Tomas Mulder
la source
5
Certaines personnes utilisent LH, mais ne réalisent pas qu'elles n'utilisent pas réellement une "vraie" balise HTML, mais créent simplement un nom de balise aléatoire. Les navigateurs traitent une telle balise comme un élément en ligne. Certains vous permettront de mettre une classe et des css dessus.
Glen Little le
1
Copie

Réponses:

81

Comme Felipe Alsacreations l'a déjà dit, la première option est bonne.

Si vous voulez vous assurer que rien en dessous de la liste n'est interprété comme appartenant à l'en-tête, c'est exactement à quoi servent les éléments de contenu de coupe HTML5. Donc, par exemple, vous pouvez faire

<h2>About Fruits</h2>
<section>
  <h3>Fruits I Like:</h3>
  <ul>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
  </ul>
</section>
<!-- anything here is part of the "About Fruits" section but does not 
     belong to the "Fruits I Like" section. -->
Alohci
la source
6
Cela a beaucoup de sens; Merci. Bien sûr, si nous allons utiliser HTML5, l'en-tête doit être <h1>à l'intérieur du <section>car c'est l'en-tête de niveau supérieur dans ces balises.
Tomas Mulder
6
Vous pouvez l'utiliser <h1>là-bas, bien sûr. Mais <h3>ça va aussi. Tant que vous n'utilisez pas un titre de niveau supérieur dans la même section.
Alohci
4
Nous devrions nous en tenir aux en-têtes h1..h6 (ici h2 et h3) tant que les navigateurs, lecteurs d'écran et autres technologies d'assistance ne décrivent pas correctement les en-têtes comme indiqué dans HTML5 (voir coding.smashingmagazine.com/2011/08/16/ … - recherchez "sourcils" ...). Je ne sais pas à quel point cela a évolué en quelques mois, mais probablement pas aussi vite en ce qui concerne l'API d'accessibilité des navigateurs: /
FelipeAls
3
@davidjb - faites attention, ce n'est pas exactement ce que dit ce conseil. Il dit que h1-h6 devrait être utilisé pour fournir les niveaux de cap. c'est-à-dire que les éléments h1 ne doivent être utilisés que pour le niveau de titre le plus élevé de la page. Il ne dit pas qu'il ne peut y avoir qu'une seule rubrique à ce niveau le plus élevé. Incidemment, les fabricants de navigateurs ont clairement indiqué qu'ils n'avaient pas l'intention de mettre en œuvre l'algorithme de contour, il y a donc peu d'espoir que la situation s'améliore rapidement.
Alohci
2
@Michele - Cela dépend si vous voulez dire visuellement au milieu ou sémantiquement au milieu. Si visuellement, c'est un problème pour CSS à régler et, idéalement, ne changerait pas votre balisage. Si sémantiquement, alors je ne sais pas quel genre de liste vous avez. Il se peut que vous ayez deux listes, pas une.
Alohci
53

Dans ce cas, j'utiliserais une liste de définitions comme suit:

<dl>
  <dt>Fruits I like:</dt>
  <dd>Apples</dd>
  <dd>Bananas</dd>
  <dd>Oranges</dd>
</dl>
Duncan Tidd
la source
5
Pour une liste non ordonnée de choses décrites par une étiquette, comme l'exemple ci-dessus, je pense que c'est le meilleur choix. La sémantique correspond exactement: Voici un terme ou une étiquette (Fruits que j'aime), et voici les éléments qui correspondent à cette étiquette (chaque fruit).
Andrew
1
C'est littéralement une liste de description . C'est la meilleure solution imo.
Derek 朕 會 功夫
display: list-item ... CSS pour afficher les puces. Bonne réponse.
Mycah
9

Votre première option est la bonne. C'est la moins problématique et vous avez déjà trouvé les bonnes raisons pour lesquelles vous ne pouvez pas utiliser les autres options.

Au fait, votre rubrique EST explicitement associée au <ul>: il est juste avant la liste! ;)

edit: Steve Faulkner, l'un des éditeurs de W3C HTML5 et 5.1 a esquissé une définition d'un ltélément . C'est un brouillon non officiel dont il discutera pour HTML 5.2, rien de plus pour le moment.

FelipeAls
la source
1
Je suis d'accord, les autres solutions n'ont aucun sens
C'est vrai, un peu comme utiliser un en-tête sur un <p>. Mais j'aimerais encore quelque chose d'un peu plus explicite, quelque chose comme l' forattribut pour un <label>' or the <th> `pour les tables. Je pense que l' <lh>option aurait le plus de sens si elle était réellement prise en charge par le W3C.
Tomas Mulder
5

un <div> est une division logique dans votre contenu, sémantiquement ce serait mon premier choix si je voulais grouper l'en-tête avec la liste:

<div class="mydiv">
    <h3>The heading</h3>
    <ul>
       <li>item</li>
       <li>item</li>
       <li>item</li>
    </ul>
</div>

alors vous pouvez utiliser le css suivant pour tout styliser ensemble comme une seule unité

.mydiv{}
.mydiv h3{}
.mydiv ul{}
.mydiv ul li{}
etc...
Evert
la source
Bon choix, au moins à des fins de style.
Tomas Mulder
Parler sémantiquement div ne signifie rien, je ne comprends pas pourquoi ce serait votre premier choix (problème de style)? : x
Rambobafet
@Rambobafet, grande nécromancie! Cette réponse remonte à 2012, avant que html5 n'introduise des sections et d'autres options plus sémantiquement correctes. Certains navigateurs ont déjà pris en charge la section, mais certains ne l'ont pas fait. «div» est l'abréviation de «division logique» dans votre contenu, donc à l'époque c'était la meilleure façon de diviser votre contenu pour le style.
Evert le
Vous avez parfaitement raison, vous n'avez pas vu la partie "'12" :)
Rambobafet
0

Essayez de définir une nouvelle classe, ulheader, en css. p.ulheader ~ ul sélectionne tout ce qui suit immédiatement Mon en-tête

p.ulheader ~ ul {
   margin-top:0;
{
p.ulheader {
   margin-bottom;0;
}
jpenkethman
la source
-2

Selon w3.org (notez que ce lien se trouve dans le brouillon de spécification HTML 3.0 expiré depuis longtemps ):

Une liste non ordonnée est généralement une liste à puces d'éléments. HTML 3.0 vous donne la possibilité de personnaliser les puces, de se passer de puces et d'encapsuler les éléments de liste horizontalement ou verticalement pour les listes à plusieurs colonnes.

La balise de la liste d'ouverture doit être <UL>. Il est suivi d'un en-tête de liste optionnel ( <LH>légende </LH>), puis du premier élément de liste ( <LI>). Par exemple:

<UL>
  <LH>Table Fruit</LH>
  <LI>apples
  <LI>oranges
  <LI>bananas
</UL>

qui pourrait être rendu comme:

Fruits de table

  • pommes
  • des oranges
  • bananes

Remarque: certains documents hérités peuvent inclure des en-têtes ou du texte brut avant le premier élément LI. Il est conseillé aux développeurs d'agents utilisateurs HTML 3.0 de prendre en compte cette possibilité afin de gérer les documents hérités mal formés.

Jfields
la source
8
Vote contre le vote parce que ce lien "selon" pointe vers le projet de spécification 3.0 de 1995, qui ne l'a jamais fait à partir du projet. La balise "lh" n'est jamais devenue une spécification HTML non préliminaire.
Brooks Moses
HTML 3.0Whoa c'est un très vieux document.
Derek 朕 會 功夫