Neat soluzione solo CSS
Usa il codice seguente per anteporre un primo figlio senza contenuto al div che si sposta involontariamente:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
Il vantaggio di questo metodo è che non è necessario modificare il CSS di alcun elemento esistente e pertanto ha un impatto minimo sulla progettazione. Accanto a questo, l'elemento che viene aggiunto è uno pseudo-elemento, che non si trova nell'albero DOM.
Il supporto per gli pseudo-elementi è molto diffuso: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ e IE 8+. Funzionerà con qualsiasi browser moderno (fai attenzione al più recente::before
, che non è supportato in IE8).
Contesto
Se il primo figlio di un elemento ha a margin-top
, il genitore regolerà la sua posizione come un modo per far collassare i margini ridondanti. Perché? È proprio così.
Dato il seguente problema:
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
</style>
<div class="parent"><!--This div moves 40px too-->
<div class="child">Hello world!</div>
</div>
Puoi risolverlo aggiungendo un bambino con contenuti, come uno spazio semplice. Ma tutti odiamo aggiungere spazi per ciò che è solo un problema di progettazione. Pertanto, utilizzare la white-space
proprietà per falsificare il contenuto.
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.fix {position: relative;white-space: pre;height: 0px;width: 0px;overflow: hidden;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="fix"></div>
<div class="child">Hello world!</div>
</div>
Dove position: relative;
garantisce il corretto posizionamento della correzione. E white-space: pre;
ti fa non dover aggiungere alcun contenuto - come uno spazio bianco - alla correzione. E height: 0px;width: 0px;overflow: hidden;
assicurati che non vedrai mai la correzione.
Potrebbe essere necessario aggiungere line-height: 0px;
o max-height: 0px;
assicurarsi che l'altezza sia effettivamente zero nei browser IE antichi (non sono sicuro). E facoltativamente puoi aggiungerlo <!--dummy-->
nei vecchi browser IE, se non funziona.
In breve, puoi fare tutto questo solo con CSS (il che elimina la necessità di aggiungere un figlio effettivo all'albero DOM HTML):
<style type="text/css">
div {position: relative;}
.parent {background-color: #ccc;}
.child {margin-top: 40px;}
.parent:before {content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
</style>
<div class="parent"><!--This div won't move anymore-->
<div class="child">Hello world!</div>
</div>