2009-12-10 8 views
20

Ho bisogno di due consecutivi div s (con sfondi) da toccare senza problemi, uno sotto l'altro. Tuttavia, questo layout si interrompe quando inserisco un elemento figlio p nella parte inferiore div. I margini dell'elemento p impongono uno spazio vuoto tra i due div s. Questo è uno strano comportamento, poiché mi aspetto che il margine dello p rimanga all'interno dell'area di contenuto e di sfondo dello div. Rende allo stesso modo su Firefox, Chrome e IE 8.Elementi figlio con margini all'interno dei DIV

<div style="background: #ccccff">Top Div</div> 
<div style="background: #ffcccc"><p>Bottom Div</p></div> 

Ecco come si presenta.

Image showing the top div (in blue), then a white gap, then the bottom div (in pink). The white gap should not be present.

ho potuto risolvere questo cambiando i margini per imbottiture per l'elemento p, ma poi vorrei anche avere a che fare questo con elementi di intestazione, elementi della lista, e ogni altro elemento che voglio utilizzare al inizio di un div. Questo non è desiderabile.

Qualcuno potrebbe illuminarmi: quale caveat del modello di box mi manca? C'è un modo semplice per risolvere questo problema, preferibilmente modificando lo stile di div?

risposta

11

Questo è il expected behavior *. Ci sono alcuni modi per aggirarlo. Se si fanno fluttuare i div, questi conterranno i margini degli elementi figlio e impediranno il collasso dei margini. Un altro approccio consiste nell'aggiungere un bordo o riempimento ai div.

* I margini di div e p "si combinano per formare un margine singolo", anche se sono nidificati, perché hanno margini adiacenti senza riempimento o bordo tra di essi.

+0

Yup, che assomiglia a bordi che si comprimono.To lo trovo ancora un po 'strano però. Grazie per l'heads-up. – myffical

+14

Il comportamento previsto nei browser è troppo spesso inaspettato –

23

Aggiungi overflow: hidden o overflow: auto al div

+0

Funziona perfettamente. Grazie! – myffical

+0

Non funziona quando genitore ha un altro dropdown div, come nel mio caso ( – ruruskyi

1

Impostazione di un'imbottitura positiva, e un corrispondente margine negativo sull'elemento div sembra risolvere il problema, anche se non so perché.

<div style="background: #ccccff">Top Div</div> 
<div style="background: #ffcccc; padding: 1px; margin: -1px"><p>Bottom Div</p></div> 
8

Soluzione 1

Add overflow: hidden/auto al div contenente per evitare che il margine di collasso.

Soluzione 2

Aggiungere imbottitura positivo al div contenente e margine negativo uguale all'elemento interno

nuova soluzione

Aggiungere imbottitura 0.01px al div contenente, questo impedirà il collasso del margine ma non avrà bisogno di alcun margine negativo sull'elemento interno.

+0

Su Chrome il lavoro più denso di 0.01px per me, ma 0.1px fa. Riesco a vedere l'attrattiva di questa soluzione rispetto all'overflow, ma qualcuno l'ha testato estensivamente su browser diversi? – Evans

+0

Per Chrome utilizzare: padding-top: 0.02px; –

Problemi correlati