2011-09-28 22 views
18

Sto lavorando ad un progetto di Asp.Net MVC 3 e ho imbattuto in un muro di mattoni sul perché questo non funziona come penso che dovrebbe.Perché non funziona questo selettore CSS: first-child?

mio markup è:

<fieldset> 
    <input type="hidden" value="2"> 
    <div class="editor-label"> 
     <label for="Name"> Name</label> 
    </div> 
    ... 
</fieldset> 

mio CSS è:

.display-label, .editor-label 
{ 
    margin: 0.8em 0 0 0; 
    font-weight: bold; 
    display: inline; 
} 

fieldset > div:first-child 
{ 
    margin: 0; 
} 

Tutto quello che voglio fare è fare il primo div nel fieldset hanno un margine pari a 0. Ho pensato che il selettore fieldset > div:first-child applicherebbe lo stile a "il primo figlio di un fieldset, il cui tipo è un div", ma a quanto pare qualcosa mi sfugge.

Ho provato questo in IE9/FF/Chrome, quindi non è un vecchio browser a fare casino con i miei selettori.

Grazie.

+0

try fieldset> div.editor-label: first-child {margin-top: 0} – albert

+0

sembra funzionare qui http://jsfiddle.net/VcRyL/ controlla il tuo css vedi se non c'è una regola di proprietà che sovrascrive questa regola –

+0

@AndreDublin che non funziona: http://jsfiddle.net/5dAKL/1 –

risposta

44

fieldset > div:first-child significa "selezionare il primo elemento figlio di un fieldsetse si tratta di un div".

Non significa "selezionare il primo div nel fieldset".

Il primo figlio in questo caso è <input type="hidden" value="2">.

Per selezionare quello div senza modificare l'HTML, è necessario utilizzare fieldset > div:first-of-type.

Sfortunatamente, mentre il :first-child è ampiamente supportato, :first-of-type funziona solo con IE9 + e altri browser moderni.

Quindi, in questo caso, la soluzione migliore è continuare a utilizzare fieldset > div:first-child e spostare semplicemente <input type="hidden" value="2"> in modo che non sia il primo figlio.

+2

Ah, questo ha più senso. Non sapevo che "> div: first-child" significava anche "_IF_ è una div", ho solo pensato che selezionasse sempre il primo bambino corrispondente. Dovrò riorganizzare il markup perché il mio cliente è bloccato su IE8 per ora. Grazie! –