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.