Utilizzando il selettore dell'ultimo figlio


106

Il mio obiettivo è applicare il CSS sull'ultimo li, ma non lo fa.

#refundReasonMenu #nav li:last-child {
    border-bottom: 1px solid #b5b5b5;
}
<div id="refundReasonMenu">
    	<ul id="nav">
    		<li><a id="abc" href="#">abcde</a></li>
    		<li><a id="def" href="#">xyz</a></li>
    	</ul>
    </div>

Come posso selezionare solo l'ultimo bambino?

Risposte:


171

La :last-childpseudoclasse non può ancora essere utilizzata in modo affidabile nei browser. In particolare, le versioni di Internet Explorer <9 e Safari <3.2 sicuramente non lo supportano , sebbene Internet Explorer 7 e Safari 3.2 lo supportino:first-child , curiosamente.

La soluzione migliore è aggiungere esplicitamente una last-childclasse (o simile) a quell'elemento e applicare li.last-childinvece.


46
Anche IE8 non supporta :last-child. E non è così curioso. :first-childè una pseudo-classe CSS2, :last-childuna pseudo-classe CSS3.
mercator

92
last-child funziona in tutti i browser moderni, il che significa, ovviamente, che non funziona in nessuna versione di IE.
Rob l'

25
Cordiali saluti, IE 9 supporta:last-child .
Jari Keinänen

6
@mercator È curioso che: first-child sia stato implementato in CSS2 ma: last-child è stato lasciato fino a CSS3 ... sembra abbastanza ovvio aggiungerli contemporaneamente.
Cobby

21
IE7 si rifiuta di riconoscere altri bambini bastardi
Dewayne

76

Un'altra soluzione che potrebbe funzionare per te è invertire la relazione. Quindi imposterai il bordo per tutti gli elementi dell'elenco. Dovresti quindi utilizzare first-child per eliminare il bordo per il primo elemento. Il first-child è staticamente supportato in tutti i browser (il che significa che non può essere aggiunto dinamicamente tramite altro codice, ma first-child è un selettore CSS2, mentre last-child è stato aggiunto nella specifica CSS3)

Nota: funziona nel modo desiderato solo se nell'elenco sono presenti solo 2 elementi come il tuo esempio. Ogni terzo oggetto in poi avrà dei bordi applicati.


2
+1 per il pensiero fuori dagli schemi :-) Ho appena convertito i miei elementi dell'ultimo figlio in primo figlio e cambiato da bordo destro a bordo sinistro per i separatori di menu. Ora a IE8 piace il mio css.
Scott B

43

Se pensi di poter usare Javascript, allora poiché supporta jQuery last-child, puoi usare il metodo css di jQuery e la cosa buona che supporterà quasi tutti i browser

Codice di esempio:

$(function(){
   $("#nav li:last-child").css("border-bottom","1px solid #b5b5b5")
})

Puoi trovare maggiori informazioni qui: http://api.jquery.com/css/#css2


8
Parla di sporco.
md1337

95
Wayyy è meglio che faccia qualcosa del genere, $("#nav li:last-child").addClass('last-child')così puoi mantenere il tuo stile nei fogli di stile.
jason,

Questa è più pulita della prima soluzione poiché viene gestita automaticamente. Ma sono d'accordo anche con Jason.
Josh M.

1
In realtà, IE7 non carica una classe che ha sia div:last-childe div.last-child. Sembra che consideri la :last-childsintassi non valida e qualsiasi classe con quello pseudo-selettore non verrà applicata.
Josh M.

@ Josh M .: Questo è un comportamento corretto e previsto. Piuttosto sfortunato, dovrei dire. Dovresti duplicare la regola.
BoltClock

19

Se il numero di elementi della lista è fisso puoi usare il selettore adiacente, ad esempio se hai solo tre <li>elementi, puoi selezionare l'ultimo <li>con:

#nav li+li+li {
    border-bottom: 1px solid #b5b5b5;
}

3
Il tuo selettore è sbagliato. li + #nav liseleziona l' liinterno #navche viene dopo li. Il tuo selettore dovrebbe semplicemente essere #nav li + li + li.
BoltClock

1
È carino. Funziona bene in IE8, ma non in IE7.
Mateng

13

Se ti ritrovi a desiderare spesso i selettori CSS3, puoi sempre utilizzare la libreria selectivizr sul tuo sito:

http://selectivizr.com/

È uno script JS che aggiunge il supporto per quasi tutti i selettori CSS3 ai browser che altrimenti non li supporterebbero.

Inseriscilo nel tuo <head>tag con una condizione IE:

<!--[if (gte IE 6)&(lte IE 8)]>
  <script src="/js/selectivizr-min.js" type="text/javascript"></script>
<![endif]-->


0

In alternativa all'utilizzo di una classe è possibile utilizzare un elenco dettagliato, impostando gli elementi figlio dt per avere uno stile e gli elementi figlio dd per averne un altro. Il tuo esempio diventerebbe:

#refundReasonMenu #nav li:dd
{
  border-bottom: 1px solid #b5b5b5;
}

html:

<div id="refundReasonMenu">
  <dl id="nav">
        <dt><a id="abc" href="#">abcde</a></dt>
        <dd><a id="def" href="#">xyz</a></dd>
  </dl>
</div>

Nessuno dei due metodi è migliore dell'altro ed è solo una questione di preferenze personali.


0

Un altro modo per farlo è utilizzare il selettore last-child in jQuery e quindi utilizzare il metodo .css (). Sii stanco però perché alcune persone sono ancora nell'età della pietra utilizzando browser disabilitati JavaScript.


0

Perché non applicare il bordo alla parte inferiore dell'UL?

#refundReasonMenu #nav ul
{
    border-bottom: 1px solid #b5b5b5;
}

1
Se si dispone padding-bottomsul <ul>elemento o margin-bottoml'ultimo <li>elemento, questo non avrà il posizionamento desiderato di sotto a destra l'ultimo <li>elemento. Altrimenti, questa è una buona soluzione.
Wex

0

Se stai facendo fluttuare gli elementi, puoi invertire l'ordine

vale a dire float: right; invece difloat: left;

Quindi usa questo metodo per selezionare il primo figlio di una classe.

/* 1: Apply style to ALL instances */
#header .some-class {
  padding-right: 0;
}
/* 2: Remove style from ALL instances except FIRST instance */
#header .some-class~.some-class {
  padding-right: 20px;
}

Questo in realtà sta applicando la classe all'istanza LAST solo perché ora è in ordine inverso.

Ecco un esempio funzionante per te:

<!doctype html>
<head><title>CSS Test</title>
<style type="text/css">
.some-class { margin: 0; padding: 0 20px; list-style-type: square; }
.lfloat { float: left; display: block; }
.rfloat { float: right; display: block; }
/* apply style to last instance only */
#header .some-class {
  border: 1px solid red;
  padding-right: 0;
}
#header .some-class~.some-class {
  border: 0;
  padding-right: 20px;
}
</style>
</head>
<body>
<div id="header">
  <img src="some_image" title="Logo" class="lfloat no-border"/>
  <ul class="some-class rfloat">
    <li>List 1-1</li>
    <li>List 1-2</li>
    <li>List 1-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 2-1</li>
    <li>List 2-2</li>
    <li>List 2-3</li>
  </ul>
  <ul class="some-class rfloat">
    <li>List 3-1</li>
    <li>List 3-2</li>
    <li>List 3-3</li>
  </ul>
  <img src="some_other_img" title="Icon" class="rfloat no-border"/>
</div>
</body>
</html>

-2

È difficile da dire senza vedere il resto del tuo CSS, ma prova ad aggiungere !importantdavanti al colore del bordo, per farlo così:

#refundReasonMenu #nav li:last-child
{
  border-bottom: 1px solid #b5b5b5 !important;
}
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.