Sé que este es un problema antiguo, lo he encontrado muchas veces. El problema es que todas las soluciones aquí son hacks que podrían tener consecuencias no deseadas.
En primer lugar, hay una explicación fácil para el problema raíz. Debido a la forma en que funciona el colapso del margen, si el primer elemento dentro de un contenedor tiene un margen superior, ese margen superior se aplica efectivamente al contenedor principal. Puede probar esto por su cuenta haciendo lo siguiente:
<div>
<h1>Test</h1>
</div>
En un depurador, abra esto y desplace el div. Notarás que el div en sí se coloca donde se detiene el margen superior del elemento H1 . Este comportamiento está previsto por el navegador.
Entonces, hay una solución fácil para esto sin tener que recurrir a hacks extraños, como lo hacen la mayoría de las publicaciones aquí (sin insultos, es solo la verdad) - simplemente regrese a la explicación original - ...if the first element inside a container has a top margin...
- Después de eso, necesitaría El primer elemento en un contenedor que NO tiene un margen superior. De acuerdo, pero ¿cómo lo haces sin agregar elementos que no interfieran semánticamente con tu documento?
¡Fácil! Pseudo-elementos! Puede hacerlo a través de una clase o un mixin predefinido. Añadir un :before
pseudo-elemento:
CSS a través de una clase:
.top-margin-fix:before {
content: ' ';
display: block;
width: 100%;
height: .0000001em;
}
Con esto, siguiendo el ejemplo de marcado anterior, modificaría su div como tal:
<div class="top-margin-fix">
<h1>Test</h1>
</div>
¿Por qué funciona esto?
El primer elemento en un contenedor, si no tiene margen superior, establece la posición del inicio del margen superior del siguiente elemento. Al agregar un :before
pseudo-elemento, el navegador agrega un elemento no semántico (en otras palabras, bueno para SEO) en el contenedor principal antes de su primer elemento.
P. ¿Por qué la altura: .0000001em?
A. Se requiere una altura para que el navegador empuje el elemento de margen hacia abajo. Esta altura es efectivamente cero, pero aún le permitirá agregar relleno al contenedor principal. Como es efectivamente cero, tampoco tendrá un efecto en el diseño del contenedor. Hermoso.
Ahora puede agregar una clase (¡o mejor, en SASS / LESS, un mixin!) Para solucionar este problema en lugar de agregar estilos de visualización extraños que causarán consecuencias inesperadas cuando desee hacer otras cosas con sus elementos, eliminando deliberadamente los márgenes en los elementos y / o reemplazarlo con relleno, o estilos extraños de posición / flotación que realmente no están destinados a resolver este problema.
overflow:hidden
es mejor para el 90% de los casos.