Tengo un div
( padre ) que contiene otro div
( hijo ). Parent es el primer elemento body
sin un estilo CSS particular. Cuando configuro
.child
{
margin-top: 10px;
}
El resultado final es que la parte superior de mi hijo todavía está alineada con el padre. En lugar de que el niño se mueva 10px hacia abajo, mi padre se mueve 10px hacia abajo.
Mi DOCTYPE
está configurado para XHTML Transitional
.
¿Que me estoy perdiendo aqui?
edit 1
Mi padre necesita tener dimensiones estrictamente definidas porque tiene un fondo que se debe mostrar debajo de arriba a abajo (píxel perfecto). Por lo tanto, establecer márgenes verticales es imposible .
edit 2
Este comportamiento es el mismo en FF, IE y CR.
Respuestas:
Encontró una alternativa en elementos secundarios con márgenes dentro de DIV También puede agregar:
o:
Esto evita que los márgenes colapsen . El borde y el relleno hacen lo mismo. Por lo tanto, también puede usar lo siguiente para evitar un colapso del margen superior:
Actualización por solicitud popular: el objetivo de contraer los márgenes es manejar el contenido textual. Por ejemplo:
Debido a que el navegador contrae los márgenes, el texto aparecería como era de esperar, y las
<div>
etiquetas del contenedor no influyen en los márgenes. Cada elemento asegura que tiene espacio alrededor, pero el espacio no se duplicará. Los márgenes de<h2>
y<p>
no se suman, pero se deslizan entre sí (colapsan). Lo mismo sucede para el elemento<p>
y<ul>
.Lamentablemente, con diseños modernos, esta idea puede morderte cuando quieres explícitamente un contenedor. Esto se llama un nuevo contexto de formato de bloque en CSS speak. El
overflow
truco o margen te dará eso.fuente
<h2>
,<p>
,<ul>
no obtendrá lagunas extrañas o márgenes "doble" de esta manera.margin: 5px 10px;
id, espere 2 divs 5 px desde la parte superior y 20 px entre ellos, no 5 px desde la parte superior y 10 px entre ellos. si quisiera 10 px entre ellos, la id lo habría especificadomargin: 5px 5px;
. Sinceramente, desearía que hubiera una regla raíz que pudiera colocar que detuviera todo colapso de margen Odio tener que duplicar el tamaño de los márgenes en papel para hacer que realmente hagan lo que quiero en la pantalla. y lo mejor ... qué desastreEste es un comportamiento normal (al menos entre las implementaciones del navegador). El margen no afecta la posición del niño en relación con su padre, a menos que el padre tenga relleno, en cuyo caso la mayoría de los navegadores agregarán el margen del niño al relleno del padre.
Para obtener el comportamiento que desea, necesita:
fuente
.parent {border: solid 1px;}
Aunque todas las respuestas solucionan el problema, vienen con compensaciones / ajustes / compromisos como
floats
, Usted tiene que flotar elementosborder-top
, Esto empuja al padre al menos 1px hacia abajo, que luego debe ajustarse introduciendo-1px
margen al elemento padre en sí. Esto puede crear problemas cuando el padre ya tienemargin-top
unidades relativas.padding-top
, el mismo efecto que usarborder-top
overflow: hidden
, No se puede usar cuando el padre debe mostrar contenido desbordado, como un menú desplegableoverflow: auto
, Presenta barras de desplazamiento para el elemento principal que tiene (intencionalmente) contenido desbordado (como sombras o triángulo de información sobre herramientas)El problema se puede resolver utilizando pseudo elementos CSS3 de la siguiente manera
https://jsfiddle.net/hLgbyax5/1/
fuente
margin-top: -1px
Parece ser innecesario. Pero me gusta esto.margin-top: -1px
yheight: 0
parece innecesario. Probado en cromo. Pero la mejor solución..parent:after...
agregar estilo
display:inline-block
al elemento hijofuente
el elemento padre no debe estar vacío al menos
antes del elemento hijo.fuente
Esto es lo que funcionó para mí.
http://jsfiddle.net/97fzwuxh/
fuente
Descubro que, dentro de su .css> si configura la propiedad de visualización de un elemento div para bloquear en línea , soluciona el problema. y el margen funcionará como se espera.
fuente
Solución ordenada solo para CSS
Use el siguiente código para anteponer un primer hijo sin contenido al div que se mueve involuntariamente:
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:
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.Donde
position: relative;
asegura el correcto posicionamiento de la solución. Ywhite-space: pre;
hace que no tenga que agregar ningún contenido, como un espacio en blanco, a la solución. Yheight: 0px;width: 0px;overflow: hidden;
se asegura de que nunca verás la solución.Es posible que deba agregar
line-height: 0px;
omax-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):
fuente
overflow: hidden;
para el padre.Para evitar "Div parent" use el margen de "div child":
En parent use estos css:
fuente
La
margin
mayoría de los elementos contenidos dentro.child
están colapsando.En este ejemplo,
p
recibe unmargin
estilo predeterminado del navegador. El valor predeterminado del navegadorfont-size
suele ser de 16 píxeles. Al tenermargin-top
más de 16px#child
, comienzas a notar su movimiento de posición.fuente
También tuve este problema, pero preferí evitar hacks de márgenes negativos, así que puse un
<div class="supercontainer"></div>
a su alrededor todo lo que tiene rellenos en lugar de márgenes. Por supuesto, esto significa más divitis, pero probablemente sea la forma más limpia de hacerlo correctamente.
fuente
Curiosamente, mi solución favorita para este problema aún no se menciona aquí: usar flotadores.
html:
css:
Véalo aquí: http://codepen.io/anon/pen/Iphol
tenga en cuenta que en caso de que necesite altura dinámica en el padre, también tiene que flotar, así que simplemente reemplácelo
height:100px;
porfloat:left;
fuente
Una solución alternativa que encontré antes de saber la respuesta correcta era agregar un borde transparente al elemento padre.
Sin embargo, su caja utilizará píxeles adicionales ...
fuente
Usar en
top
lugar demargin-top
es otra posible solución, si corresponde.fuente