Solución ordenada solo para CSS
Use el siguiente código para anteponer un primer hijo sin contenido al div que se mueve involuntariamente:
.parent:before
{content: '';position: relative;height: 0px;width: 0px;overflow: hidden;white-space: pre;}
La ventaja de este método es que no necesita cambiar el CSS de ningún elemento existente y, por lo tanto, tiene un impacto mínimo en el diseño. Junto a esto, el elemento que se agrega es un pseudo-elemento, que no está en el árbol DOM.
El soporte para pseudo-elementos está muy extendido: Firefox 3+, Safari 3+, Chrome 3+, Opera 10+ e IE 8+. Esto funcionará en cualquier navegador moderno (tenga cuidado con el más nuevo ::before
, que no es compatible con IE8).
Contexto
Si el primer hijo de un elemento tiene un margin-top
, el padre ajustará su posición como una forma de contraer márgenes redundantes. ¿Por qué? Es así como así.
Dado el siguiente 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>
Puede solucionarlo agregando un elemento secundario con contenido, como un espacio simple. Pero todos odiamos agregar espacios para lo que es un problema de solo diseño. Por lo tanto, use la white-space
propiedad para falsificar contenido.
<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>
Donde position: relative;
asegura el correcto posicionamiento de la solución. Y white-space: pre;
hace que no tenga que agregar ningún contenido, como un espacio en blanco, a la solución. Y height: 0px;width: 0px;overflow: hidden;
se asegura de que nunca verás la solución.
Es posible que deba agregar line-height: 0px;
o max-height: 0px;
asegurarse de que la altura sea realmente cero en los navegadores IE antiguos (no estoy seguro). Y, opcionalmente, puede agregarlo <!--dummy-->
en los antiguos navegadores IE, si no funciona.
En resumen, puede hacer todo esto solo con CSS (lo que elimina la necesidad de agregar un elemento secundario real al árbol DOM de 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>