Esiste un selettore CSS solo per il primo figlio diretto?


315

Ho il seguente HTML

<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 il "colpo di testa" <div> .

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


Risposte:


519

Quello che hai pubblicato significa letteralmente "Trova tutti i div che si trovano all'interno dei div della sezione e sono il primo figlio del loro genitore". Il sottotitolo contiene un tag che corrisponde a quella descrizione.

Non mi è chiaro se desideri o meno entrambi i figli del div principale. In tal caso, utilizzare questo:

div.section > div

Se vuoi solo l'intestazione, usa questo:

div.section > div:first-child

Usando le >modifiche la descrizione diventa: "Trova eventuali div che sono i discendenti diretti dei div di sezione" che è quello che vuoi.

Tutti i principali browser supportano questo metodo, ad eccezione di IE6. Se il supporto IE6 è di importanza critica, dovrai aggiungere classi ai div figlio e usarlo, invece. Altrimenti, non vale la pena preoccuparsene.


8
: il primo figlio non è richiesto, in questo caso.
eozzy,

3
sembra che l'OP non stia chiedendo del selettore tanto quanto il motivo per cui la regola viene applicata a tutti i sub figlio.
Doug Neiner,

La mia interpretazione è che ottiene il concetto di eredità CSS, e ho pensato che il primo figlio avrebbe l'effetto che> ha. È una formulazione piuttosto poco chiara.
Matchu,

3
Ah, le gioie dell'essere abbastanza grandi da ricordare quando il selettore "diretto discendente" avrebbe risolto tutti i tuoi problemi ma non potevi usarlo perché non funzionava in IE . Ne conseguirebbe molta frustrazione inutile.
aroth,

Si applica anche al primo figlio del primo bambino. Se è davvero necessario applicare le modifiche solo sul primo figlio, è necessario annullare le modifiche sui figli del bambino. Qualcosa del genere:div.section > div:first-child > div { /* Cancel Changes*/}
Mahdi J.Ansari

51

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

.container > *:first-child
{
}

44

Il 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 saranno ereditate da quel divbambino 's divs:

div.section > div { color: red }

Ora, sia quello div che i suoi figli lo saranno red. Devi annullare tutto ciò che hai impostato sul genitore se non vuoi che erediti:

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

Ora solo quel singolo divche è un figlio diretto di div.sectionsarà rosso, ma i suoi figli divssaranno ancora neri.



6

Usa div.section > div.

Meglio ancora, usa un <h1>tag per l'intestazione e div.section h1nel tuo CSS, in modo da supportare i browser più vecchi (che non conoscono il >) e mantenere il markup semantico.


Buona idea, sfortunatamente ho anche bisogno di supportare IE6, e se uso h1, dovrò impostare la dimensione del carattere per ereditare in modo che il carattere corrisponda a quello del corpo e ie7 e sotto non supportano l'ereditarietà. arg!
Jeremy,

Inoltre, ho div bambini e inserendo div bambini in un h1 infrange le regole, anche se IE lo rende, non sono sicuro di cosa facciano altri browser
Jeremy,

3

Il selettore CSS per il primo figlio diretto nel tuo caso è:

.section > :first-child

Il selettore diretto è> e il primo selettore figlio è: primo figlio

Non è necessario un asterisco prima di: come suggeriscono altri. Puoi velocizzare la ricerca DOM modificando questa soluzione anteponendo il tag:

div.section > :first-child
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.