¿Cómo hacer que un elemento posicionado en absoluto honre el relleno de su padre? Quiero que un div interno se extienda a lo ancho de su padre y se coloque en la parte inferior de ese padre, básicamente un pie de página. Pero el niño tiene que honrar el relleno del padre y no está haciendo eso. El niño se presiona contra el borde del padre.
Entonces quiero esto:
pero estoy obteniendo esto:
<html>
<body>
<div style="background-color: blue; padding: 10px; position: relative; height: 100px;">
<div style="background-color: gray; position: absolute; left: 0px; right: 0px; bottom: 0px;">css sux</div>
</div>
</body>
</html>
Puedo hacer que suceda con un margen alrededor del div interno, pero preferiría no tener que agregar eso.
css
padding
css-position
d512
fuente
fuente
style="background-color: gray; position: absolute; left: 10px; right: 10px; bottom: 10px;"
?left:
yright:
en el niño (en posición absoluta), su problema está resuelto. Estoy agregando este b / c que es la respuesta que otros con el mismo problema probablemente estén buscando.Respuestas:
Primero, veamos por qué sucede esto.
La razón es que, sorprendentemente, cuando un cuadro tiene
position: absolute
su cuadro contenedor es el cuadro de relleno del padre (es decir, el cuadro alrededor de su relleno). Esto es sorprendente porque generalmente (es decir, cuando se usa un posicionamiento estático o relativo) el cuadro contenedor es el cuadro de contenido principal .Aquí está la parte relevante de la especificación CSS :
El enfoque más simple, como se sugiere en la respuesta de Winter, es utilizarlo
padding: inherit
en la posición absolutadiv
. Sin embargo, solo funciona si no desea que las personas absolutamente posicionadasdiv
tengan su propio relleno adicional. Creo que las soluciones más generales (en que ambos elementos pueden tener su propio relleno independiente) son:Agregue una posición adicional relativamente
div
(sin relleno) alrededor de la posición absolutadiv
. Esa nuevadiv
respetará el relleno de su padre, y la posición absolutadiv
lo llenará.La desventaja, por supuesto, es que estás jugando con el HTML simplemente con fines de presentación.
Repita el relleno (o agréguelo) en el elemento en posición absoluta.
La desventaja aquí es que tienes que repetir los valores en tu CSS, lo cual es frágil si estás escribiendo el CSS directamente. Sin embargo, si está utilizando una herramienta de preprocesamiento como
SASS
oLESS
puede evitar ese problema utilizando una variable. Este es el método que uso personalmente.fuente
position: absolute
? Es sorprendente que el cuadro que contiene es el cuadro de relleno, pero debe haber una razón para ello, al igual que estoy seguro de que hay una razón por la cual (sinbox-sizing
) elwidth
&height
no incluye el relleno o el borde.box-sizing
propiedad, en el padre o hijo. Esto se debe a que afecta el tamaño , como en ancho / alto, pero no en el cuadro que lo contiene, aunque admito que tendría más sentido si afectara a ambos.padding: inherit
funciona bien si el absolutamente posicionadodiv
no necesita ningún relleno propio, y he agregado una mención de esa técnica. Sin embargo, es menos flexible porque no se puede agregar ningún relleno adicional a la posición absolutadiv
(es decir, no se puede decirpadding: inherit + 5px
). Por eso prefiero las técnicas que menciono aquí.position:absolute
elemento hijo de hecho funciona si solo está buscando que el hijo respete el relleno del padre. Sin embargo, si está buscando agregar relleno adicional al niño, tendrá que mantener la proporción de rellenos bajo control en su código. No hay una forma limpia de hacerlo con solo CSS.Una cosa que puedes probar es usar el siguiente CSS:
Permite que el elemento secundario herede el relleno del elemento primario, luego el elemento secundario se puede colocar para que coincida con el ancho y el relleno de los elementos principales.
Además, estoy usando
box-sizing: border-box;
los elementos involucrados.No he probado esto en todos los navegadores, pero parece estar funcionando en Chrome, Firefox e IE10.
fuente
Bueno, esta puede no ser la solución más elegante (semánticamente), pero en algunos casos funcionará sin inconvenientes: en lugar de relleno, use un borde transparente en el elemento principal. Los elementos secundarios en posición absoluta respetarán el borde y se representarán exactamente de la misma manera (excepto que está usando el borde del elemento principal para el estilo).
fuente
Use el margen en lugar del relleno en el div principal: http://blog.vjeux.com/2012/css/css-absolute-position-taking-into-account-padding.html
fuente
Aquí está mi mejor oportunidad. Agregué otro Div y lo hice rojo y cambié la altura de tus padres a 200 px solo para probarlo. La idea es que el niño ahora se convierte en nieto y el padre se convierte en abuelo. Entonces el padre respeta a su padre. Espero que entiendas mi idea.
Editar:
Creo que lo que estás tratando de hacer no se puede hacer. La posición absoluta significa que le va a dar las coordenadas que debe cumplir. ¿Qué pasa si el padre tiene un relleno de 5px? Y absolutamente coloca al niño en la parte superior: -5px; izquierda: -5px . ¿Cómo se supone honrar a los padres y a ti al mismo tiempo?
Mi solución
Si quiere que honre al padre, no lo posicione absolutamente entonces.
fuente
1.) no puede usar un borde grande en el padre - en caso de que quiera tener un borde específico
2.) no puede agregar margen - en caso de que su padre sea parte de otro contenedor y quiera que su padre tome el control completo ancho de ese abuelo.
La única solución que debería ser aplicable es envolver a sus hijos en otro contenedor para que sus padres se conviertan en abuelos y luego aplicar relleno al nuevo envoltorio / padre para niños nuevos. O puede aplicar directamente el relleno a los niños.
En tu caso:
fuente
Podría haberlo hecho fácilmente usando un nivel extra de Div.
Demostración: https://jsfiddle.net/soxv3vr0/
fuente
agregar relleno: herede en su posición absoluta
fuente