Come aggiungere semanticamente un'intestazione a un elenco


120

Questo mi ha infastidito per un po 'e mi chiedo se ci sia consenso su come farlo correttamente. Quando utilizzo un elenco HTML, come faccio a includere semanticamente un'intestazione per l'elenco?

Un'opzione è questa:

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

ma semanticamente il <h3>titolo non è esplicitamente associato al<ul>

Un'altra opzione è questa:

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

ma questo sembra un po 'sporco, poiché l'intestazione non è proprio uno degli elementi dell'elenco.

Questa opzione non è consentita dal W3C:

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

come <ul>'s possono contenere solo una o più <li>' s

La vecchia "intestazione della lista" <lh>ha più senso

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

ma ovviamente non fa ufficialmente parte dell'HTML

Ho sentito suggerire che usiamo <label>proprio come un modulo:

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

ma questo è un po 'strano e non sarà comunque valido.

È facile vedere i problemi semantici quando provo a modellare le intestazioni della mia lista, dove finisco per aver bisogno di inserire i miei <h3>tag nei primi <li>e indirizzarli per lo stile con qualcosa come:

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

orrori! Ma almeno in questo modo posso controllare l'intero <ul>, titolo e tutto, applicando uno stile al ultag.

Qual è il modo corretto per farlo? Qualche idea?


5
Alcune persone stanno usando LH, ma potrebbero non rendersi conto che in realtà non stanno usando un tag HTML "reale", ma stanno semplicemente creando un nome di tag casuale. I browser trattano un tag di questo tipo come un elemento in linea. Alcuni ti permetteranno di inserire una classe e css su di essa.
Glen Little


Risposte:


81

Come ha già detto Felipe Alsacreations, la prima opzione va bene.

Se vuoi assicurarti che nulla sotto l'elenco venga interpretato come appartenente all'intestazione, è esattamente a questo che servono gli elementi di contenuto di sezionamento HTML5. Quindi, per esempio, potresti farlo

<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. -->

6
Questo ha molto senso; Grazie. Ovviamente, se utilizzeremo HTML5, l'intestazione dovrebbe essere <h1>all'interno di <section>poiché è l'intestazione di livello superiore all'interno di quei tag.
Tomas Mulder,

6
Puoi usarlo <h1>lì, certo. Ma <h3>va bene anche così. Finché non utilizzi un'intestazione di livello superiore all'interno della stessa sezione.
Alohci

4
Dovremmo attenerci alle intestazioni h1..h6 (qui h2 e h3) fintanto che browser, lettori di schermo e altre tecnologie assistive non delineano correttamente le intestazioni come indicato in HTML5 (vedi coding.smashingmagazine.com/2011/08/16/ ... - cerca "sopracciglia" ...). Non sono sicuro di quanto si sia evoluto in pochi mesi, ma probabilmente non così velocemente per quanto riguarda l'accessibilità API dei browser: /
FelipeAls

3
@davidjb - fai attenzione, non è esattamente quello che dice quel consiglio. Dice che h1-h6 dovrebbe essere usato per fornire i livelli di prua. cioè che gli elementi h1 dovrebbero essere usati solo per il livello più alto di intestazione sulla pagina. Non dice che ci può essere solo un'intestazione a quel livello più alto. Per inciso, i produttori di browser hanno chiarito che non hanno intenzione di implementare l'algoritmo di struttura, quindi ci sono poche speranze che la situazione possa migliorare rapidamente.
Alohci

2
@Michele - Dipende se intendi visivamente al centro o semanticamente al centro. Se visivamente, allora questo è un problema da risolvere per i CSS e idealmente non cambierebbe il tuo mark-up. Se semanticamente, non sono sicuro del tipo di elenco che hai. Potrebbe essere che tu abbia due elenchi, non uno.
Alohci

53

In questo caso, utilizzerei un elenco di definizioni in questo modo:

<dl>
  <dt>Fruits I like:</dt>
  <dd>Apples</dd>
  <dd>Bananas</dd>
  <dd>Oranges</dd>
</dl>

5
Per un elenco non ordinato di cose descritte da un'etichetta, come l'esempio sopra, penso che questa sia la scelta migliore. La semantica corrisponde esattamente: ecco un termine o un'etichetta (frutti che mi piacciono) e qui ci sono elementi che corrispondono a quell'etichetta (ogni frutto).
Andrew

1
È letteralmente un elenco di descrizioni . Questa è la migliore soluzione imo.
Derek 朕 會 功夫

display: list-item ... CSS per visualizzare i punti elenco. Buona risposta.
Mycah

9

La tua prima opzione è quella buona. È il meno problematico e hai già trovato i motivi corretti per cui non puoi utilizzare le altre opzioni.

A proposito, la tua intestazione È esplicitamente associata a <ul>: è proprio prima dell'elenco! ;)

modifica: Steve Faulkner, uno degli editori di W3C HTML5 e 5.1 ha abbozzato una definizione di un ltelemento . Questa è una bozza non ufficiale che discuterà per HTML 5.2, niente di più ancora.


1
Sono d'accordo, le altre soluzioni non hanno affatto senso

È vero, è un po 'come usare un'intestazione su un file <p>. Ma vorrei ancora qualcosa di un po 'più esplicito, qualcosa come l' forattributo per un <label>' or the <th> `per le tabelle. Penso che l' <lh>opzione avrebbe più senso se fosse effettivamente supportata dal W3C.
Tomas Mulder,

5

un <div> è una divisione logica nel tuo contenuto, semanticamente questa sarebbe la mia prima scelta se volessi raggruppare l'intestazione con l'elenco:

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

quindi puoi usare il seguente CSS per modellare tutto insieme come un'unica unità

.mydiv{}
.mydiv h3{}
.mydiv ul{}
.mydiv ul li{}
etc...

Buona scelta, almeno per motivi di styling.
Tomas Mulder,

Il div semantico non significa nulla, non capisco perché sarebbe la tua prima scelta (per problemi di stile)? : x
Rambobafet

@Rambobafet, grande negromanzia! Quella risposta era del 2012, prima che html5 introducesse sezioni e altre opzioni semanticamente corrette. Alcuni browser supportano già la sezione, ma altri no. "div" è l'abbreviazione di "divisione logica" nei tuoi contenuti, quindi all'epoca questo era il modo migliore per dividere i tuoi contenuti per lo styling.
Evert

Hai perfettamente ragione, non ho visto la parte "'12" :)
Rambobafet


0

Prova a definire una nuova classe, ulheader, in css. p.ulheader ~ ul seleziona tutto ciò che segue immediatamente My Header

p.ulheader ~ ul {
   margin-top:0;
{
p.ulheader {
   margin-bottom;0;
}

-2

Secondo w3.org (nota che questo link si trova nella bozza delle specifiche HTML 3.0 scaduta da tempo ):

Un elenco non ordinato in genere è un elenco puntato di elementi. HTML 3.0 ti dà la possibilità di personalizzare i punti elenco, di fare a meno dei punti elenco e di disporre gli elementi dell'elenco orizzontalmente o verticalmente per gli elenchi a più colonne.

Il tag dell'elenco di apertura deve essere <UL>. È seguito da un'intestazione di elenco opzionale ( <LH>didascalia </LH>) e quindi dalla prima voce di elenco ( <LI>). Per esempio:

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

che potrebbe essere reso come:

Frutta da tavola

  • mele
  • arance
  • banane

Nota: alcuni documenti precedenti possono includere intestazioni o testo normale prima del primo elemento LI. Si consiglia agli implementatori di programmi utente HTML 3.0 di provvedere a questa possibilità al fine di gestire documenti legacy formati male.


8
Downvoting perché questo collegamento "secondo" punta alla bozza di specifica 3.0 del 1995, che non è mai uscita dalla bozza. Il tag "lh" non è mai diventato una specifica HTML non in bozza.
Brooks Moses

HTML 3.0Whoa, questo è davvero un vecchio documento.
Derek 朕 會 功夫

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.