2009-10-04 10 views
48

Sto cercando un modo per stilare una lista non ordinata in XHTML con CSS tale da renderla in linea e gli elementi della lista separati da virgole.Come stile liste non ordinate in CSS come testo separato da virgola

Ad esempio, il seguente elenco deve essere visualizzato come apple, orange, banana (notare la virgola mancante alla fine dell'elenco).

<ul id="taglist"> 
    <li>apple</li> 
    <li>orange</li> 
    <li>banana</li> 
</ul> 

Attualmente, sto usando il seguente CSS per lo styling questa lista, che quasi fa quello che voglio, ma rende l'elenco come apple, orange, banana, (nota la virgola finale dopo banana).

C'è un modo per risolvere questo problema con puro CSS?

+2

Mi piace dove stai andando con questo. Più puoi mantenere intatta la struttura dati rappresentata dal tuo documento, più sfrutti la potenza del CSS. Come sempre, però, devi essere consapevole del fatto che i vecchi browser non capiranno la proprietà 'content'. – Jakob

+0

Ho trovato una soluzione senza regole aggiuntive e supporto IE8 –

risposta

54

Per rimuovere la virgola finale, utilizzare il :last-child pseudo-classe, in questo modo:

#taglist li:last-child:after { 
    content: ""; 
} 
+0

Questo è sicuramente il modo più semplice, ma 'last-child' è anche meno implementato di' first-child', anche se dipende dall'utilizzo del sito e può essere compensato per JS/jQuery, commenti condizionali per IE ecc. (riferimento: http://www.quirksmode.org/css/contents.html) –

+3

Non ho dati su questo, ma avevo l'impressione che i browser che non implementare 'first-child' e' last-child' non implementare 'before',' after' e 'content' per cominciare. – Jakob

+0

Fantastico. Molte grazie. Questa soluzione funziona bene su Mac OS X in Safari 4.0.3 e FireFox 3.5.2. – SwedishChef

6

Dipende implementazione del browser, ma questo dovrebbe funzionare. Anche se si basa su first-child, che può limitare il suo uso, ma in sostanza mette lo spazio virgola ", " prima dell'elemento di elenco, piuttosto che dopo. Non sono sicuro di come il valore di padding/margin influirà su questo, ma se usi `display: inline; con margini e padding impostati su zero, dovrebbe essere a posto.

#taglist li:before {content: ", ";} 
#taglist first-child {content: ""; } /* empty string */ 

Modificato: di rispondere alle correzioni offerti nei commenti da Jakob.

Le seguenti opere (pagina demo qui: http://davidrhysthomas.co.uk/so/liststyles.html:

#taglist {width: 50%; 
     margin: 1em auto; 
     padding: 0; 
     } 

li  {display: inline; 
     margin: 0; 
     padding: 0; 
     } 

li:before {content: ", "; 
     } 

#taglist li:first-child:before 
     {content: ""; 
     } 

Anche se le virgole sono stranamente floating-in-the-middle-of-nulla, e, onestamente, preferisco la risposta accettata in ogni caso. ma solo in modo di non stava lasciando una risposta orribilmente rotto in giro, ho pensato di risolvere il problema.

grazie, Jakob.

+1

In realtà, questo ha vinto ' lavoro. 'first-child' è una pseudo-classe, quindi deve seguire un elemento (' li' in questo caso), e per ottenere il risultato desiderato deve anche essere seguito da ': before', in questo modo:' #taglist li: first-child: before {content: ""} '. – Jakob

+0

@Jakob Ho fatto lo stesso con una sola regola con '+' selector =) La soluzione –

0

non c'è modo puro CSS per farlo che è compatibile cross-browser (grazie a Microsoft). Io su credi di farlo solo con la logica lato server.

Probabilmente ci si avvicina all'utilizzo di una classe last sull'ultimo li e utilizzando le immagini di sfondo per tutte le lis ma l'ultima, ma non sarà possibile fare: last-child e contenuto: in IEs.

+1

è diventata compatibile con più browser a partire da IE8, se userete il selettore '+' invece di ': last-child' e' prima 'invece': after' –

1

questo è il modo che i ragazzi di A List Apart raccomandano nel loro articolo “Taming Lists ":

#taglist ul li:after { 
    content: ","; 
} 

#taglist ul li.last:after { 
    content: ""; 
} 

Ciò richiede avere l'ultima voce nella lista contrassegnati con un valore di attributo class di ‘ultimo’:

<ul id="taglist"> 
    <li>apple</li> 
    <li>orange</li> 
    <li class="last">banana</li> 
</ul> 
19

Sostituire uno la regola

#taglist li:after { 
    content: ", "; 
} 

con solo un altro

#taglist li + li:before { 
    content: ", "; 
} 

Pro:

  • Una regola fare tutto il lavoro.
  • regole per cancellare la regola precedente,
  • IE8 supporto
+0

Questo è abbastanza intelligente, ma per quanto posso dire richiede logica aggiuntiva o HTML alterato per rimuovere gli spazi che appaiono prima di ogni elemento della lista perché c'è spazio tra i nodi 'li'. – Jakob

+0

@Jakob OH yeas. Mi vergogno. C'è solo un requisito per avere 'float: left' per gli elementi di elenco. –

+6

Intelligente, ma non mi piace. Questo si comporta male se la tua linea si avvolge. –

3

È facile con CSS3 è possibile utilizzare il selettore pseudo last-child e not in una volta:

ul#taglist li:not(:last-child):after { 
    content: ", "; 
} 

Controlla i risultati qui https://jsfiddle.net/vpd4bnq1/

Problemi correlati