Con HTML / CSS, ¿cómo puedo hacer un elemento que tenga un ancho y / o alto que sea el 100% de su elemento padre y que todavía tenga los márgenes o el relleno adecuado?
Por "apropiado" quiero decir que si mi elemento padre es 200px
alto y especifico height = 100%
conpadding = 5px
, esperaría que obtuviera un 190px
elemento alto con border = 5px
todos los lados, bien centrado en el elemento padre.
Ahora, sé que no es así como el modelo de caja estándar especifica que debería funcionar (aunque me gustaría saber por qué, exactamente ...), por lo que la respuesta obvia no funciona:
#myDiv {
width: 100%
height: 100%;
padding: 5px;
}
Pero me parece que debe haber ALGUNA forma de producir de manera confiable este efecto para un padre de tamaño arbitrario. ¿Alguien sabe de una manera de lograr esta tarea (aparentemente simple)?
Ah, y para que conste, no estoy terriblemente interesado en la compatibilidad con IE, por lo que (con suerte) debería facilitar las cosas un poco.
EDITAR: dado que se solicitó un ejemplo, aquí está el más simple que se me ocurre:
<html style="height: 100%">
<body style="height: 100%">
<div style="background-color: black; height: 100%; padding: 25px"></div>
</body>
</html>
El desafío es entonces que aparezca el cuadro negro con un relleno de 25 píxeles en todos los bordes sin que la página crezca lo suficiente como para requerir barras de desplazamiento.
Respuestas:
Aprendí a hacer este tipo de cosas leyendo " Patrones de diseño PRO HTML y CSS ". El
display:block
es el valor de visualización predeterminado para eldiv
, pero me gusta hacerlo explícito. El contenedor debe ser del tipo correcto;position
atributo esfixed
,relative
oabsolute
.El violín por el comentario de Nooshu
fuente
top:0
,bottom:0
esencialmente "estira" el elemento. Sólo puedo conseguir que funcione conposition:absolute
pesartop:20px;bottom:20px;left:20px;right:20px;
lugar de usar márgenes?Hay una nueva propiedad en CSS3 que puede usar para cambiar la forma en que el modelo de caja calcula el ancho / alto, se llama dimensionamiento de caja.
Al establecer esta propiedad con el valor "border-box", el elemento que aplique no se estirará al agregar un relleno o borde. Si define algo con un ancho de 100 píxeles y un relleno de 10 píxeles, seguirá siendo de 100 píxeles de ancho.
Ver aquí para soporte del navegador . No funciona para IE7 y versiones anteriores , sin embargo, creo que el IE7.js de Dean Edward agrega soporte para ello. Disfruta :)
fuente
border-box
es el héroe de todos :)¡La solución es NO usar la altura y el ancho en absoluto! Adjunte la caja interna usando arriba, izquierda, derecha, abajo y luego agregue margen.
fuente
La mejor manera es con la propiedad calc (). Entonces su caso se vería así:
Simple, limpio, sin soluciones. Solo asegúrese de no olvidar el espacio entre los valores y el operador (por ejemplo,
(100%-5px)
eso romperá la sintaxis. ¡Disfrute!fuente
Según la especificación w3c, la altura se refiere a la altura del área visible, por ejemplo, en un monitor con resolución de 1280x1024 píxeles, 100% de altura = 1024 píxeles.
min-height se refiere a la altura total de la página, incluido el contenido, por lo que en una página donde el contenido es mayor que 1024px min-height: 100% se extenderá para incluir todo el contenido.
El otro problema es que el relleno y el borde se agregan a la altura y al ancho en la mayoría de los navegadores modernos, excepto ie6 (ie6 es bastante lógico pero no se ajusta a las especificaciones). Esto se llama el modelo de caja. Entonces si especificas
Realmente te dará 100% + 5px + 5px para la altura. Para evitar esto, necesita un contenedor de envoltura.
fuente
1. Altura completa con
padding
2. Altura completa con
margin
3. Altura completa con
border
fuente
Esta es una de las idioteces de CSS: todavía tengo que entender el razonamiento (si alguien lo sabe, por favor explique).
100% significa el 100% de la altura del contenedor, a lo que se agrega cualquier margen, borde y relleno. Por lo tanto, es efectivamente imposible obtener un contenedor que llene a su padre y que tenga un margen, borde o relleno.
Tenga en cuenta también que la altura de configuración también es notoriamente inconsistente entre los navegadores.
Otra cosa que he aprendido desde que publiqué esto es que el porcentaje es relativo a la longitud del contenedor , es decir, su ancho, lo que hace que un porcentaje sea aún más inútil para la altura.
Hoy en día, las unidades de ventana vh y vw son más útiles, pero aún no son especialmente útiles para otra cosa que no sean los contenedores de nivel superior.
fuente
Otra solución es usar display: table que tiene un comportamiento de modelo de caja diferente.
Puede establecer un alto y ancho para el padre y agregar relleno sin expandirlo. El niño tiene 100% de altura y ancho menos los rellenos.
JSBIN
Otra opción sería utilizar la propiedad de tamaño de caja. El único problema con ambos sería que no funcionan en IE7.
fuente
Otra solución: puede usar unidades de porcentaje para márgenes y tamaños. Por ejemplo:
El problema principal aquí es que los márgenes aumentarán / disminuirán ligeramente con el tamaño del elemento padre. Presumiblemente, la funcionalidad que preferiría es que los márgenes permanezcan constantes y que el elemento secundario crezca / se reduzca para completar los cambios en el espaciado. Entonces, dependiendo de qué tan apretada necesite que sea su pantalla, eso podría ser problemático. (También elegiría un margen más pequeño, como 0.3%).
fuente
Una solución con flexbox (trabajando en IE11): ( o ver en jsfiddle )
(El restablecimiento CSS no es necesariamente importante para el problema real).
La parte importante es
flex: 1
(en combinación condisplay: flex
en el padre). Curiosamente, la explicación más plausible que conozco sobre cómo funciona la propiedad Flex proviene de una documentación nativa de reacción, así que me refiero a ella de todos modos :fuente
El ejemplo de Frank me confundió un poco: no funcionó en mi caso porque todavía no entendía el posicionamiento lo suficientemente bien. Es importante tener en cuenta que el elemento contenedor primario debe tener una posición no estática (mencionó esto pero lo pasé por alto y no estaba en su ejemplo).
Aquí hay un ejemplo en el que el niño, dado el relleno y un borde, usa una posición absoluta para llenar al padre al 100%. El padre utiliza el posicionamiento relativo para proporcionar un punto de referencia para la posición del niño mientras permanece en el flujo normal; el siguiente elemento "más contenido" no se ve afectado:
Un enlace útil para aprender rápidamente el posicionamiento CSS
fuente
Borde alrededor de div, en lugar del margen del cuerpo de la página
Otra solución: solo quería un borde simple alrededor del borde de mi página, y quería un 100% de altura cuando el contenido era más pequeño que eso.
Border-box no funcionó, y el posicionamiento fijo parecía incorrecto para una necesidad tan simple.
Terminé agregando un borde a mi contenedor, en lugar de depender del margen del cuerpo de la página, se ve así:
fuente
Este es el comportamiento predeterminado de
display: block
La forma más rápida de solucionarlo en 2020 es establecer undisplay: 'flex'
elemento primario y un relleno, por ejemplo, 20 px, entonces todos sus elementos secundarios tendrán una altura del 100% en relación con su altura.fuente
Para agregar -webkit y -moz sería más apropiado
fuente
fuente