[Easy] 🏷️ Box Model
Default
Box Model es un término utilizado en CSS para discutir el diseño de layout. Se puede entender como una caja que envuelve un elemento HTML, con cuatro propiedades principales:
- content: Se utiliza principalmente para mostrar el contenido del elemento, como texto.
- padding: La distancia entre el contenido del elemento y el borde del elemento
- margin: La distancia entre el elemento y otros elementos externos
- border: La línea del borde del propio elemento
box-sizing
La propiedad box-sizing determina el tipo de Box Model que se utiliza.
Significa que, al calcular el ancho y alto de un elemento, si las propiedades padding y border se rellenan hacia adentro o se expanden hacia afuera.
Su valor predeterminado es content-box, que adopta la expansión hacia afuera. Bajo esta condición, además del ancho y alto propios del elemento, también se deben incluir padding y border adicionales en el cálculo. Como se muestra:
div {
width: 100px;
padding: 10px;
border: 1px solid #000;
}
El cálculo del ancho de este div es 100px(width) + 20px(padding izquierdo y derecho) + 2px(border izquierdo y derecho) = 122px.
border-box
Obviamente, el método anterior no es confiable, ya que obliga al desarrollador frontend a calcular constantemente el ancho y alto de los elementos. Para mejorar la experiencia de desarrollo, se debe adoptar otro modo: border-box.
Como en el siguiente ejemplo, al inicializar estilos se establece el valor de box-sizing de todos los elementos en border-box:
* {
box-sizing: border-box; // global style
}
De esta manera, se cambia a la forma de relleno hacia adentro, el diseño del ancho y alto del elemento es más intuitivo, sin necesidad de sumar o restar números por padding o border.
Ejemplo comparativo
Supongamos la siguiente configuración de estilos idéntica:
.box {
width: 100px;
height: 100px;
padding: 10px;
border: 5px solid #000;
margin: 20px;
}
content-box (valor predeterminado)
- Ancho real ocupado =
100px(width)+20px(padding izquierdo y derecho)+10px(border izquierdo y derecho)=130px - Alto real ocupado =
100px(height)+20px(padding superior e inferior)+10px(border superior e inferior)=130px - Área de content =
100px x 100px - Nota:
marginno se incluye en el ancho del elemento, pero afecta la distancia con otros elementos
border-box
- Ancho real ocupado =
100px(padding y border se comprimen hacia adentro) - Alto real ocupado =
100px - Área de content =
100px-20px(padding izquierdo y derecho)-10px(border izquierdo y derecho)=70px x 70px - Nota:
marginigualmente no se incluye en el ancho del elemento
Comparación visual
content-box:
┌─────────── margin (20px) ───────────┐
│ ┌──────── border (5px) ──────────┐ │
│ │ ┌──── padding (10px) ──────┐ │ │
│ │ │ │ │ │
│ │ │ content (100×100) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
└──────────────────────────── ─────────┘
Ancho total: 130px (sin incluir margin)
border-box:
┌─────────── margin (20px) ───────────┐
│ ┌──────── border (5px) ──────────┐ │
│ │ ┌──── padding (10px) ──────┐ │ │
│ │ │ │ │ │
│ │ │ content (70×70) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────┘ │ │
│ └─────────────────────────────────┘ │
└─────────────────────────────────────┘
Ancho total: 100px (sin incluir margin)
Trampas comunes
1. Manejo de margin
Ya sea content-box o border-box, margin nunca se incluye en el ancho y alto del elemento. Ambos modos solo afectan la forma de calcular padding y border.
.box {
box-sizing: border-box;
width: 100px;
padding: 10px;
border: 5px solid;
margin: 20px; /* No se incluye en width */
}
/* El ancho real ocupado del elemento sigue siendo 100px, pero la distancia con otros elementos será 20px más */
2. Ancho en porcentaje
Al usar ancho en porcentaje, la forma de cálculo también se ve afectada por box-sizing:
.parent {
width: 200px;
}
.child {
width: 50%; /* Hereda el 50% del padre = 100px */
padding: 10px;
border: 5px solid;
}
/* content-box: Ocupa realmente 130px (puede exceder el padre) */
/* border-box: Ocupa realmente 100px (exactamente el 50% del padre) */
3. Elementos inline
box-sizing no funciona con elementos inline, porque las configuraciones de width y height de los elementos inline son inválidas por sí mismas.
span {
display: inline;
width: 100px; /* Inválido */
box-sizing: border-box; /* También inválido */
}
4. min-width / max-width
min-width y max-width también se ven afectados por box-sizing:
.box {
box-sizing: border-box;
min-width: 100px; /* Incluye padding y border */
padding: 10px;
border: 5px solid;
}
/* Ancho mínimo de content = 100 - 20 - 10 = 70px */