2010-01-19 13 views
214

Ho il seguente htmlEsiste un selettore CSS solo per il primo bambino diretto?

<div class="section"> 
    <div>header</div> 
    <div> 
      contents 
      <div>sub contents 1</div>    
      <div>sub contents 2</div> 
    </div> 
</div> 

E il seguente stile:

DIV.section DIV:first-child 
{ 
    ... 
} 

Per qualche ragione che non capisco lo stile è sempre applicata ai "contenuti sub 1" <div> così come l'"intestazione"<div>.

Ho pensato che il selettore sullo stile si sarebbe applicato solo al primo figlio diretto di un div con una classe chiamata "sezione". Come posso cambiare il selettore per ottenere quello che voglio?

+3

http://jsfiddle.net/joelpurra/7t5CK/ –

risposta

370

Quello che hai postato significa letteralmente "Trova tutti i div che si trovano all'interno delle sezioni div e sono il primo figlio del loro genitore". Il sub contiene un tag che corrisponde a quella descrizione.

Non è chiaro per me se si desiderano entrambi i figli del div principale o meno. In tal caso, utilizzare questo:

div.section > div 

Se si desidera solo l'intestazione, utilizzare questo:

div.section > div:first-child 

Utilizzando la > cambia la descrizione di: "trovare qualsiasi div che sono i discendenti diretti di sezione div "che è quello che vuoi

Si prega di notare che tutti i principali browser supportano questo metodo, tranne IE6. Se il supporto IE6 è mission-critical, dovrai invece aggiungere delle classi alle div del bambino e usarlo, invece. Altrimenti, non vale la pena prendersene cura.

+4

: il primo figlio non è necessario, in questo caso. – 3zzy

+2

sembra che l'OP non stia chiedendo del selettore tanto quanto il motivo per cui la regola viene applicata a tutte le div child. –

+0

La mia interpretazione è che ottiene il concetto di ereditarietà CSS e pensava che il primo figlio avrebbe l'effetto che ha. È una formulazione piuttosto poco chiara. – Matchu

6
div.section > div 
33

CSS si chiama Cascading Style Sheets perché le regole sono ereditate. Utilizzando il seguente selettore, sarà selezionare solo il figlio diretto del genitore, ma le sue regole sarà ereditato da quel div 's figli divs:

div.section > div { color: red } 

Ora, sia che dive suoi bambini sarà red. È necessario annullare tutto ciò si imposta sul genitore, se non si vuole che ereditare:

div.section > div { color: red } 
div.section > div div { color: black } 

Ora solo quel singolo div che è figlio diretto di div.section sarà rosso, ma i suoi figli divs sarà ancora essere nero

+4

+1 Questo è stato qualcosa che mi ha frustrato fino alla fine diversi anni fa :) – Sampson

+0

+1 un punto utile da notare – Evildonald

5

Utilizzare div.section > div.

Meglio ancora, utilizzare un tag <h1> per l'intestazione e div.section h1 nel CSS, in modo da sostenere i vecchi browser (che non conoscono la >) e mantenere il markup semantico.

+0

Buona idea, purtroppo ho anche bisogno di supportare IE6, e se uso h1, avrò bisogno di impostare font-size da ereditare in modo che il font corrisponda a quello del corpo, e ie7 e sotto non supportano inherit. arg! – Jeremy

+0

Inoltre, ho divs figlio e mettere div bambino in un h1 infrange le regole, anche se IE lo rende, non sono sicuro di quello che fanno gli altri browser – Jeremy

5

Trovato questa domanda cercando su Google. Ciò restituirà il primo figlio di un elemento con la classe container, indipendentemente dal tipo di figlio.

.container > *:first-child 
{ 
} 
Problemi correlati