¿Por qué el relleno CSS aumenta el tamaño del elemento?
81
Estoy tratando de darle algo de relleno a mi div y textarea. Cuando hago esto, aumenta el tamaño del elemento, en lugar de reducir el área de contenido dentro de él. ¿Hay alguna forma de lograr lo que estoy tratando de hacer?
Agregue * {box-sizing: border-box;}a su hoja de estilo y el tamaño actuará como espera. Paul Irish confirmó que es seguro para todos los navegadores modernos: paulirish.com/2012/box-sizing-border-box-ftw
Ross Allen
Respuestas:
72
Puede agregar box-sizing:border-boxal elemento contenedor, para poder especificar un ancho y alto que no varíen cuando agregue relleno y / o borde al elemento.
Consulte aquí (MDN) para conocer las especificaciones.
Actualizar (comentario copiado para responder)
En este momento, el valor border-boxes compatible con todos los navegadores principales, según MDN Specs
Algunos navegadores de curso requiere adecuada prefijo es decir, -webkity -mozcomo se puede ver claramente aquí
En este momento, el valor border-boxes compatible con todos los navegadores, de acuerdo con MDN Especificaciones - algunos navegadores de curso requiere adecuada prefijo es decir, -webkity -mozcomo se puede ver claramente aquí
Erenor Paz
¡Eso es todo! ¡Por fin una solución!
71GA
20
De acuerdo con las especificaciones de CSS2 , el ancho renderizado de un elemento de tipo cuadro es igual a la suma de su ancho, borde izquierdo / derecho y relleno izquierdo / derecho (el margen izquierdo / derecho también entra en juego). Si su caja tiene un ancho de '100%' y también tiene margen, borde y relleno, afectarán (aumentarán) el ancho ocupado por el objeto.
Por lo tanto, si su área de texto necesita ser 100% de ancho, asigne valores a ancho, margen izquierdo / derecho, borde izquierdo / derecho y relleno izquierdo / derecho de tal manera que su suma sea igual al 100%.
El ancho y alto especificados (y las propiedades mínimas / máximas respectivas) en este elemento determinan el cuadro de borde del elemento. Es decir, cualquier relleno o borde especificado en el elemento se coloca y dibuja dentro de este ancho y alto especificado. El ancho y la altura del contenido se calculan restando el borde y los anchos de relleno de los lados respectivos de las propiedades especificadas de 'ancho' y 'alto'.
Esto fue un desastre en la parte del W3C y varios navegadores solo agregaron a esta complejidad con sus propias versiones de modelos de caja. Personalmente, en lugar de pensar en qué navegador o configuración CSS hará el truco, simplemente envuelvo el contenido del cuadro en otra declaración DIV y uso márgenes en ese DIV, en lugar de usar relleno, como este:
"Incorrecto" es diferente de lo que se le ocurrió al W3C, pero correcto en cuanto a lo que es más intuitivo / fácil de trabajar.
pbz
8
@pbz: Probablemente tengas razón. Pero se deben seguir las especificaciones para evitar el caos, que es exactamente lo que provocó IE.
Cherouvim
1
@cherouvim No, el W3C es la única causa del caos en torno al modelo de caja CSS. Se debe agradecer a IE por mantenerse firmes en este punto, o aún estaríamos atrapados con el modelo de caja W3C ridículamente absurdo.
Self Evident
0
Para una solución más entre navegadores, puede evitar este comportamiento, ajustando cualquier etiqueta que necesite relleno en otra etiqueta con ancho fijo y dándole ancho: auto. De esta manera, si el padre tiene un ancho de x, y le agrega relleno al niño, el niño heredará el ancho completo de x, aplicando el relleno correctamente sin modificar el ancho del padre o el suyo.
Un div por defecto toma el ancho de su contenedor principal, por lo que para evitar problemas de compatibilidad con el navegador, puede agregar un div secundario en el div especificado y luego agregar el relleno requerido al div secundario .
NB : no especifique el ancho para el div secundario porque aumentaría si agrega relleno
* {box-sizing: border-box;}
a su hoja de estilo y el tamaño actuará como espera. Paul Irish confirmó que es seguro para todos los navegadores modernos: paulirish.com/2012/box-sizing-border-box-ftwRespuestas:
Puede agregar
box-sizing:border-box
al elemento contenedor, para poder especificar un ancho y alto que no varíen cuando agregue relleno y / o borde al elemento.Consulte aquí (MDN) para conocer las especificaciones.
Actualizar (comentario copiado para responder)
En este momento, el valor
border-box
es compatible con todos los navegadores principales, según MDN SpecsAlgunos navegadores de curso requiere adecuada prefijo es decir,
-webkit
y-moz
como se puede ver claramente aquífuente
border-box
es compatible con todos los navegadores, de acuerdo con MDN Especificaciones - algunos navegadores de curso requiere adecuada prefijo es decir,-webkit
y-moz
como se puede ver claramente aquíDe acuerdo con las especificaciones de CSS2 , el ancho renderizado de un elemento de tipo cuadro es igual a la suma de su ancho, borde izquierdo / derecho y relleno izquierdo / derecho (el margen izquierdo / derecho también entra en juego). Si su caja tiene un ancho de '100%' y también tiene margen, borde y relleno, afectarán (aumentarán) el ancho ocupado por el objeto.
Por lo tanto, si su área de texto necesita ser 100% de ancho, asigne valores a ancho, margen izquierdo / derecho, borde izquierdo / derecho y relleno izquierdo / derecho de tal manera que su suma sea igual al 100%.
En CSS3 tenemos tres modelos de tamaño de caja . Puedes usar el
border-box
modelo:fuente
Esto fue un desastre en la parte del W3C y varios navegadores solo agregaron a esta complejidad con sus propias versiones de modelos de caja. Personalmente, en lugar de pensar en qué navegador o configuración CSS hará el truco, simplemente envuelvo el contenido del cuadro en otra declaración DIV y uso márgenes en ese DIV, en lugar de usar relleno, como este:
<div id="container" style="width: 300px; border: 10px solid red;"> <div id="content" style="width: 250px; margin: 25px;"> Some content </div> </div>
Aunque esto solo funciona para contenedores de tamaño fijo
fuente
Depende del navegador y su implementación del modelo de caja . Lo que está experimentando es el comportamiento correcto.
IE tradicionalmente se equivocó: http://en.wikipedia.org/wiki/Internet_Explorer_box_model_bug
fuente
Para una solución más entre navegadores, puede evitar este comportamiento, ajustando cualquier etiqueta que necesite relleno en otra etiqueta con ancho fijo y dándole ancho: auto. De esta manera, si el padre tiene un ancho de x, y le agrega relleno al niño, el niño heredará el ancho completo de x, aplicando el relleno correctamente sin modificar el ancho del padre o el suyo.
fuente
Un div por defecto toma el ancho de su contenedor principal, por lo que para evitar problemas de compatibilidad con el navegador, puede agregar un div secundario en el div especificado y luego agregar el relleno requerido al div secundario .
NB : no especifique el ancho para el div secundario porque aumentaría si agrega relleno
fuente