Tengo dos DIV que necesito colocar exactamente uno encima del otro. Sin embargo, cuando hago eso, el formato se estropea porque el DIV que lo contiene actúa como si no hubiera altura. Creo que este es el comportamiento esperado, position:absolutepero necesito encontrar una manera de colocar estos dos elementos uno encima del otro y hacer que el contenedor se estire a medida que el contenido se estira:
El borde superior izquierdo de .layer2debe estar exactamente alineado con el borde superior izquierdo delayer1
<!-- HTML -->
<div class="container_row">
<div class="layer1">
Lorem ipsum...
</div>
<div class="layer2">
More lorem ipsum...
</div>
</div>
<div class="container_row">
...same HTML as above. This one should never overlap the .container_row above.
</div>
/* CSS */
.container_row {}
.layer1 {
position:absolute;
z-index: 1;
}
.layer2 {
position:absolute;
z-index: 2;
}

position: absoluteno es el estilo correcto para usar entonces.position:absoluteno se siente bien. ¿Cuál sería el estilo correcto?.layer1y.layer2tienen un tamaño conocido?Respuestas:
En primer lugar, debería incluir la posición en elementos absolutamente posicionados o se encontrará con un comportamiento extraño y confuso; probablemente desee agregar
top: 0; left: 0al CSS para ambos elementos absolutamente posicionados. También querrá tenerposition: relativeactivado.container_rowsi desea que los elementos absolutamente posicionados se coloquen con respecto a su padre en lugar del cuerpo del documento :Tu problema es que
position: absoluteelimina elementos del flujo normal :Esto significa que los elementos absolutamente posicionados no tienen ningún efecto en el tamaño de su elemento padre y el primero
<div class="container_row">tendrá una altura de cero.Por lo tanto, no puede hacer lo que está tratando de hacer con elementos absolutamente posicionados a menos que sepa qué tan altos serán (o, de manera equivalente, puede especificar su altura). Si puede especificar las alturas, puede poner las mismas alturas en el
.container_rowy todo se alineará; también puede poner unmargin-topen el segundo.container_rowpara dejar espacio para los elementos absolutamente posicionados. Por ejemplo:fuente
position: absolutenecesario. Consulte: stackoverflow.com/a/51949049/1736186En realidad, esto es posible sin posición
absolutey sin especificar ninguna altura. Todo lo que necesita hacer es usardisplay: gridel elemento principal y colocar los descendientes en la misma fila y columna.Por favor, consulte el siguiente ejemplo, basado en su HTML. Agregué solo
<span>y algunos colores, para que puedas ver el resultado.También puede cambiar fácilmente
z-indexcada uno de los elementos descendientes para manipular su visibilidad (cuál debería estar en la parte superior).fuente
display: gridno existía hace siete años :)flex, que tiene un soporte de navegador mucho mejor en la actualidad.Gran respuesta, "mu es demasiado corto". Estaba buscando exactamente lo mismo, y después de leer tu publicación encontré una solución que se ajustaba a mi problema.
Tenía dos elementos del mismo tamaño exacto y quería apilarlos. Como todos tienen el mismo tamaño, lo que pude hacer fue hacer
sólo en el último elemento. De esta forma se inserta correctamente el primer elemento, "empujando" la altura de los padres, y el segundo elemento se coloca en la parte superior.
Espera que esto ayude a otras personas que intentan apilar más de 2 elementos con la misma altura (desconocida).
fuente
position: abosluteel otro .Aquí hay otra solución que usa display: flex en lugar de position: absolute o display: grid.
fuente
Tuve que establecer
Container_height = Element1_height = Element2_height
Use puede usar el índice z para establecer cuál debe estar en la parte superior.
fuente
Aquí hay algunos CSS reutilizables que preservarán la altura de cada elemento sin usar
position: absolute:El primer elemento de tu
stackes el fondo y el segundo es el primer plano.fuente
Debido al posicionamiento absoluto que quita los elementos de la posición del flujo de documentos: el absoluto no es la herramienta adecuada para el trabajo. Dependiendo del diseño exacto que desee crear, tendrá éxito utilizando márgenes negativos, posición: relativa o incluso transformar: traducir. Muéstranos una muestra de lo que quieres hacer, podemos ayudarte mejor.
fuente
Por supuesto, el problema es recuperar la altura. Pero, ¿cómo puedes hacer eso si no sabes la altura de antemano? Bueno, si sabe qué relación de aspecto desea darle al contenedor (y mantenerlo receptivo), puede recuperar su altura agregando relleno a otro elemento secundario del contenedor, expresado como un porcentaje.
Incluso puede agregar un muñeco
dival contenedor y configurar algo comopadding-top: 56.25%para darle al elemento simulado una altura que sea una proporción del ancho del contenedor. Esto empujará el contenedor y le dará una relación de aspecto, en este caso 16: 9 (56,25%).El relleno y el margen usan el porcentaje del ancho, ese es realmente el truco aquí.
fuente
Después de muchas pruebas, he verificado que la pregunta original ya es correcta; faltan solo un par de configuraciones:
container_rowdebe tenerposition: relative;position: absolute; left:0;container_rowdeben tener un estilo adicional:height:x; line-height:x; vertical-align:middle;text-align:center;también podría ayudar.fuente