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:absolute
pero 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 .layer2
debe 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: absolute
no es el estilo correcto para usar entonces.position:absolute
no se siente bien. ¿Cuál sería el estilo correcto?.layer1
y.layer2
tienen 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: 0
al CSS para ambos elementos absolutamente posicionados. También querrá tenerposition: relative
activado.container_row
si desea que los elementos absolutamente posicionados se coloquen con respecto a su padre en lugar del cuerpo del documento :Tu problema es que
position: absolute
elimina 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_row
y todo se alineará; también puede poner unmargin-top
en el segundo.container_row
para dejar espacio para los elementos absolutamente posicionados. Por ejemplo:fuente
position: absolute
necesario. Consulte: stackoverflow.com/a/51949049/1736186En realidad, esto es posible sin posición
absolute
y sin especificar ninguna altura. Todo lo que necesita hacer es usardisplay: grid
el 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-index
cada uno de los elementos descendientes para manipular su visibilidad (cuál debería estar en la parte superior).fuente
display: grid
no 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: aboslute
el 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
stack
es 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
div
al 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_row
debe tenerposition: relative;
position: absolute; left:0;
container_row
deben tener un estilo adicional:height:x; line-height:x; vertical-align:middle;
text-align:center;
también podría ayudar.fuente