5. Cajas y Modelo de Caja (Box Model)
El Box Model (Modelo de Caja) es uno de los conceptos más fundamentales de CSS. Entenderlo es esencial para controlar el diseño y espaciado de los elementos.
📦 ¿Qué es el Box Model?
Section titled “📦 ¿Qué es el Box Model?”El Box Model define cómo se calculan las dimensiones de un elemento. Cada caja tiene 4 áreas concéntricas:
┌─────────────────────────────────────┐│ MARGIN (exterior) │ ← Espacio fuera del elemento│ ┌───────────────────────────────┐ ││ │ BORDER (borde) │ │ ← Línea del borde│ │ ┌─────────────────────────┐ │ ││ │ │ PADDING (relleno) │ │ │ ← Espacio interno│ │ │ ┌───────────────────┐ │ │ ││ │ │ │ CONTENT │ │ │ │ ← Contenido (texto, imágenes)│ │ │ │ (width/height) │ │ │ ││ │ │ └───────────────────┘ │ │ ││ │ └─────────────────────────┘ │ ││ └───────────────────────────────┘ │└─────────────────────────────────────┘-
Content (Contenido) Centro
- El área donde aparece el contenido (texto, imágenes)
- Controlado por
widthyheight
-
Padding (Relleno) Interno
- Espacio transparente entre el contenido y el borde
- Aumenta el tamaño visual del elemento
- Hereda el color de fondo del elemento
-
Border (Borde) Línea
- Línea que rodea el padding y el contenido
- Puede tener color, estilo y grosor
- Aumenta el tamaño total del elemento
-
Margin (Margen) Externo
- Espacio transparente fuera del borde
- Separa el elemento de otros elementos
- No tiene color de fondo (siempre transparente)
📐 Propiedades de dimensión
Section titled “📐 Propiedades de dimensión”width y height - Ancho y alto
Section titled “width y height - Ancho y alto”Definen las dimensiones del área de contenido.
/* Valores de width y height */.elemento { width: 300px; /* Ancho fijo */ height: 200px; /* Alto fijo */
width: 50%; /* Porcentaje del padre */ height: 100vh; /* Porcentaje del viewport */
width: auto; /* Automático (default) */ height: auto; /* Automático (default) */}/* Píxeles - Tamaño fijo */.caja-fija { width: 400px; height: 300px;}
/* Porcentaje - Relativo al padre */.caja-fluida { width: 80%; height: 50%;}
/* Viewport - Relativo a la ventana */.caja-pantalla { width: 100vw; /* 100% del ancho de la ventana */ height: 100vh; /* 100% del alto de la ventana */}
/* Auto - Ajusta al contenido */.caja-auto { width: auto; /* Se ajusta al contenido o al padre */ height: auto; /* Se ajusta al contenido */}/* Contenedor centrado con ancho máximo */.contenedor { width: 90%; max-width: 1200px; margin: 0 auto;}
/* Imagen responsiva */img { width: 100%; height: auto; /* Mantiene proporción */}
/* Tarjeta de tamaño fijo */.tarjeta { width: 300px; height: 400px;}
/* Sidebar */.sidebar { width: 250px; height: 100vh;}
/* Hero full screen */.hero { width: 100%; height: 100vh;}max-width, min-width, max-height, min-height
Section titled “max-width, min-width, max-height, min-height”Establecen límites para las dimensiones.
/* Límites de ancho */.elemento { min-width: 200px; /* Ancho mínimo */ max-width: 800px; /* Ancho máximo */
min-height: 100px; /* Alto mínimo */ max-height: 500px; /* Alto máximo */}/* Contenedor responsivo con límite */.contenedor { width: 100%; max-width: 1200px; /* No más ancho que 1200px */ margin: 0 auto; padding: 0 20px;}
/* Imagen que no excede su tamaño */img { max-width: 100%; /* No más ancha que su contenedor */ height: auto;}
/* Texto con ancho máximo para legibilidad */.articulo { max-width: 65ch; /* Máximo 65 caracteres */ margin: 0 auto;}/* Botón con ancho mínimo */.boton { min-width: 120px; /* Al menos 120px de ancho */ padding: 10px 20px;}
/* Input con ancho mínimo */input[type="text"] { min-width: 200px; width: 100%;}
/* Columna que no se encoge demasiado */.columna { min-width: 250px; flex: 1;}/* Área de texto con altura limitada */.comentarios { max-height: 300px; /* Máximo 300px */ overflow-y: auto; /* Scroll si excede */}
/* Sección con altura mínima */.seccion { min-height: 400px; /* Al menos 400px */}
/* Hero con altura mínima y máxima */.hero { min-height: 400px; max-height: 80vh; height: 60vh;}
/* Sidebar con altura mínima */.sidebar { min-height: 100vh; /* Al menos la altura de la ventana */}/* Contenedor flexible con límites */.contenedor-flexible { width: 90%; min-width: 320px; /* No menos de 320px (mobile) */ max-width: 1400px; /* No más de 1400px */ margin: 0 auto;}
/* Modal con dimensiones controladas */.modal { width: 90%; max-width: 600px; min-width: 300px;
height: auto; max-height: 90vh; min-height: 200px;
overflow-y: auto;}
/* Galería de imágenes */.imagen-galeria { width: 100%; max-width: 400px; height: auto; min-height: 200px;}🎨 Padding (Relleno interno)
Section titled “🎨 Padding (Relleno interno)”El padding es el espacio entre el contenido y el borde. Aumenta el área visible del elemento.
Sintaxis de padding
Section titled “Sintaxis de padding”/* Padding individual */.elemento { padding-top: 10px; padding-right: 20px; padding-bottom: 10px; padding-left: 20px;}
/* Padding abreviado (shorthand) */.elemento { padding: 10px 20px 10px 20px; /* top right bottom left (sentido horario) */ padding: 10px 20px; /* vertical horizontal */ padding: 10px; /* todos los lados iguales */}/* 1 valor: Todos los lados */.padding-1 { padding: 20px; /* top: 20px, right: 20px, bottom: 20px, left: 20px */}
/* 2 valores: Vertical | Horizontal */.padding-2 { padding: 10px 20px; /* top: 10px, right: 20px, bottom: 10px, left: 20px */}
/* 3 valores: Top | Horizontal | Bottom */.padding-3 { padding: 10px 20px 30px; /* top: 10px, right: 20px, bottom: 30px, left: 20px */}
/* 4 valores: Top | Right | Bottom | Left (sentido horario ⏰) */.padding-4 { padding: 10px 20px 30px 40px; /* top: 10px, right: 20px, bottom: 30px, left: 40px */}/* Botón con padding uniforme */.boton { padding: 12px 24px; /* Vertical 12px, Horizontal 24px */ background: #3498db; color: white; border: none; border-radius: 6px;}
/* Tarjeta con padding */.tarjeta { padding: 20px; background: white; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);}
/* Contenedor con padding responsive */.contenedor { padding: 20px;}
@media (min-width: 768px) { .contenedor { padding: 40px; }}
/* Input con padding interno */input[type="text"] { padding: 10px 15px; border: 1px solid #ddd; border-radius: 4px;}
/* Sección con padding vertical */.seccion { padding: 60px 0; /* Solo arriba y abajo */}/* Padding con porcentaje (relativo al ANCHO del padre) */.elemento { padding: 5%; /* 5% del ancho del padre en todos los lados */}
/* Crear proporción 16:9 con padding */.video-16-9 { position: relative; width: 100%; padding-bottom: 56.25%; /* 9/16 = 0.5625 = 56.25% */ height: 0;}
.video-16-9 iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%;}
/* Crear cuadrado con padding */.cuadrado { width: 100%; padding-bottom: 100%; /* Mismo que el ancho */ height: 0; position: relative;}Características del padding
Section titled “Características del padding”/* El padding hereda el color de fondo */.caja { background-color: #3498db; padding: 30px; color: white;}/* El área de padding también será azul */
/* Con imagen de fondo */.caja-imagen { background-image: url('patron.png'); padding: 40px;}/* La imagen se extiende al área de padding *//* ❌ Incorrecto: No se permiten valores negativos */.elemento { padding: -10px; /* No funciona */}
/* ✅ Correcto: Solo valores positivos o cero */.elemento { padding: 0; padding: 10px; padding: 2rem;}/* El padding aumenta el tamaño total del elemento */.caja { width: 200px; height: 100px; padding: 20px; border: 2px solid black;}
/* Tamaño total: Ancho: 200px (content) + 20px (padding-left) + 20px (padding-right) + 2px (border-left) + 2px (border-right) = 244px Alto: 100px (content) + 20px (padding-top) + 20px (padding-bottom) + 2px (border-top) + 2px (border-bottom) = 144px*/🔲 Border (Borde)
Section titled “🔲 Border (Borde)”El border es una línea que rodea el padding y el contenido.
Propiedades de border
Section titled “Propiedades de border”/* Propiedades individuales */.elemento { border-width: 2px; /* Grosor */ border-style: solid; /* Estilo */ border-color: #3498db; /* Color */}
/* Shorthand (forma corta) */.elemento { border: 2px solid #3498db; /* grosor estilo color */}/* Estilos de borde */.solido { border: 3px solid black; } /* ──── Línea sólida */.punteado { border: 3px dotted black; } /* ···· Puntos */.discontinuo { border: 3px dashed black; } /* ---- Guiones */.doble { border: 3px double black; } /* ════ Línea doble */.ranura { border: 3px groove black; } /* Efecto 3D ranura */.cresta { border: 3px ridge black; } /* Efecto 3D cresta */.insertado { border: 3px inset black; } /* Efecto 3D insertado */.resaltado { border: 3px outset black; } /* Efecto 3D resaltado */.ninguno { border: none; } /* Sin borde */.oculto { border: hidden; } /* Oculto (para tablas) *//* Borde en un solo lado */.top { border-top: 2px solid red; }.right { border-right: 2px solid blue; }.bottom { border-bottom: 2px solid green; }.left { border-left: 2px solid yellow; }
/* Bordes diferentes en cada lado */.variado { border-top: 3px solid #e74c3c; border-right: 2px dashed #3498db; border-bottom: 4px double #2ecc71; border-left: 1px dotted #f39c12;}
/* Borde solo abajo (común en inputs) */input { border: none; border-bottom: 2px solid #3498db; padding: 8px 0;}
/* Tarjeta con borde izquierdo de acento */.tarjeta-acento { border-left: 4px solid #3498db; padding: 20px; background: #f8f9fa;}/* Bordes redondeados */.redondeado { border: 2px solid #3498db; border-radius: 8px; /* Todas las esquinas */}
/* Esquinas individuales */.esquinas-custom { border-radius: 10px 20px 30px 40px; /* top-left | top-right | bottom-right | bottom-left */}
/* Círculo perfecto */.circulo { width: 100px; height: 100px; border-radius: 50%; background: #3498db;}
/* Píldora (pill) */.pildora { border-radius: 9999px; /* Valor muy alto */ padding: 8px 20px; background: #2ecc71; color: white;}
/* Esquinas específicas */.esquina-superior { border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-left-radius: 0; border-bottom-right-radius: 0;}/* Botón con borde */.boton-outline { padding: 10px 20px; border: 2px solid #3498db; background: transparent; color: #3498db; border-radius: 6px; cursor: pointer; transition: all 0.3s;}
.boton-outline:hover { background: #3498db; color: white;}
/* Tarjeta con sombra y borde */.tarjeta { border: 1px solid #e0e0e0; border-radius: 12px; padding: 24px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);}
/* Alerta con borde de color */.alerta-exito { border: 1px solid #d4edda; border-left: 4px solid #28a745; background: #d4edda; color: #155724; padding: 15px; border-radius: 4px;}
/* Input con borde que cambia al focus */input { border: 2px solid #ddd; padding: 10px; border-radius: 4px; transition: border-color 0.3s;}
input:focus { outline: none; border-color: #3498db;}Border con imágenes
Section titled “Border con imágenes”/* border-image (avanzado) */.borde-imagen { border: 10px solid transparent; border-image: url('borde-decorativo.png') 30 round;}
/* Degradado como borde */.borde-degradado { border: 4px solid; border-image: linear-gradient(45deg, #3498db, #2ecc71) 1;}📏 Margin (Margen externo)
Section titled “📏 Margin (Margen externo)”El margin es el espacio transparente fuera del borde. Separa el elemento de otros elementos.
Sintaxis de margin
Section titled “Sintaxis de margin”/* Margin individual */.elemento { margin-top: 10px; margin-right: 20px; margin-bottom: 10px; margin-left: 20px;}
/* Margin abreviado (shorthand) */.elemento { margin: 10px 20px 10px 20px; /* top right bottom left */ margin: 10px 20px; /* vertical horizontal */ margin: 10px; /* todos los lados */}/* Centrar horizontalmente con margin auto */.contenedor-centrado { width: 800px; margin: 0 auto; /* top/bottom: 0, left/right: auto */}
/* Centrar con max-width */.contenedor-responsive { max-width: 1200px; margin-left: auto; margin-right: auto; padding: 0 20px;}
/* ❌ No funciona para centrar verticalmente */.no-funciona { height: 200px; margin: auto 0; /* No centra verticalmente */}/* Los márgenes SÍ pueden ser negativos */.superpuesto { margin-top: -20px; /* Mueve el elemento hacia arriba */}
/* Superposición de elementos */.tarjeta-superpuesta { margin-top: -50px; position: relative; z-index: 10;}
/* Expandir más allá del contenedor */.imagen-expandida { width: 100vw; margin-left: calc(-50vw + 50%);}
/* Ajustar espaciado */.lista-compacta li { margin-bottom: -5px;}/* Los márgenes verticales se colapsan (collapse) */.elemento-1 { margin-bottom: 30px;}
.elemento-2 { margin-top: 20px;}
/* Espacio entre ellos: 30px (no 50px) Se usa el margen mayor, no la suma *//* Espaciado entre secciones */.seccion { margin-bottom: 60px;}
/* Espaciado entre párrafos */p { margin-bottom: 1rem;}
p:last-child { margin-bottom: 0; /* Sin margen en el último */}
/* Espaciado en listas */ul { margin: 0; padding: 0; list-style: none;}
li { margin-bottom: 10px;}
/* Botón con margen */.boton { margin: 10px 5px;}
/* Grid con márgenes */.grid-item { width: calc(33.333% - 20px); margin: 10px; float: left;}Diferencias entre padding y margin
Section titled “Diferencias entre padding y margin”| Característica | Padding 🎨 | Margin 📏 |
|---|---|---|
| Ubicación | Dentro del borde | Fuera del borde |
| Color de fondo | Hereda el fondo del elemento | Siempre transparente |
| Valores negativos | ❌ No permitidos | ✅ Permitidos |
| Click area | ✅ Parte del elemento clickeable | ❌ No es clickeable |
| Colapso | ❌ No colapsa | ✅ Márgenes verticales colapsan |
| Uso común | Espacio interno | Separación entre elementos |
⚙️ Box-sizing: content-box vs border-box
Section titled “⚙️ Box-sizing: content-box vs border-box”La propiedad box-sizing cambia cómo se calculan las dimensiones de un elemento.
content-box (default)
Section titled “content-box (default)”/* content-box: width/height solo afectan al contenido */.content-box { box-sizing: content-box; /* Default */ width: 200px; padding: 20px; border: 5px solid black;}
/* Tamaño total: 200px (width) + 40px (padding) + 10px (border) = 250px*/border-box ⭐ (recomendado)
Section titled “border-box ⭐ (recomendado)”/* border-box: width/height incluyen padding y border */.border-box { box-sizing: border-box; width: 200px; padding: 20px; border: 5px solid black;}
/* Tamaño total: 200px El contenido se ajusta: 200px - 40px (padding) - 10px (border) = 150px*//* CONTENT-BOX (default) */.caja-content { box-sizing: content-box; width: 200px; padding: 20px; border: 5px solid #3498db; background: #ecf0f1;}/*┌─────────────────────────────────┐│ Border: 5px │ ← +5px cada lado│ ┌───────────────────────────┐ ││ │ Padding: 20px │ │ ← +20px cada lado│ │ ┌─────────────────────┐ │ ││ │ │ Content: 200px │ │ │ ← Width definido│ │ └─────────────────────┘ │ ││ └───────────────────────────┘ │└─────────────────────────────────┘Tamaño total: 250px*/
/* BORDER-BOX (recomendado) */.caja-border { box-sizing: border-box; width: 200px; padding: 20px; border: 5px solid #3498db; background: #ecf0f1;}/*┌─────────────────────────────────┐│ Border: 5px │ ← Incluido en 200px│ ┌───────────────────────────┐ ││ │ Padding: 20px │ │ ← Incluido en 200px│ │ ┌─────────────────────┐ │ ││ │ │ Content: 150px │ │ │ ← Ajustado automáticamente│ │ └─────────────────────┘ │ ││ └───────────────────────────┘ │└─────────────────────────────────┘Tamaño total: 200px (como definiste)*//* ⭐ Recomendación: Aplicar border-box globalmente */*, *::before, *::after { box-sizing: border-box;}
/* O solo en el root */html { box-sizing: border-box;}
*, *::before, *::after { box-sizing: inherit;}/* Sin border-box: Difícil de calcular */.columna-content { box-sizing: content-box; width: 50%; padding: 20px; border: 2px solid black; float: left;}/* Problema: 50% + 40px padding + 4px border = Se desborda! */
/* Con border-box: Funciona perfectamente */.columna-border { box-sizing: border-box; width: 50%; padding: 20px; border: 2px solid black; float: left;}/* Perfecto: Exactamente 50% del contenedor */
/* Grid de 3 columnas con border-box */.grid-item { box-sizing: border-box; width: 33.333%; padding: 15px; border: 1px solid #ddd; float: left;}/* Funciona sin problemas */
/* Input con border-box */input, textarea { box-sizing: border-box; width: 100%; padding: 10px; border: 2px solid #ddd;}/* El input ocupa exactamente 100% del contenedor */🔍 Visualización con DevTools
Section titled “🔍 Visualización con DevTools”Las herramientas de desarrollador del navegador son esenciales para entender y depurar el Box Model.
-
Abrir DevTools F12
- Chrome/Edge: F12 o Ctrl+Shift+I (Cmd+Option+I en Mac)
- Firefox: F12 o Ctrl+Shift+I (Cmd+Option+I en Mac)
- Safari: Cmd+Option+I (habilitar menú Desarrollo primero)
-
Seleccionar elemento
- Clic en el icono de selector (🔍)
- Hover sobre el elemento en la página
- O clic derecho → “Inspeccionar elemento”
-
Ver el Box Model
- Panel “Computed” o “Calculado”
- Diagrama visual del Box Model
- Valores exactos de cada área
-
Editar en vivo
- Clic en cualquier valor para editarlo
- Ver cambios en tiempo real
- Experimentar sin modificar el código
Interpretando el diagrama del Box Model
Section titled “Interpretando el diagrama del Box Model”Diagrama en DevTools:
┌─────────────────────────┐ │ margin: 20 │ ← Margen (naranja) │ ┌───────────────────┐ │ │ │ border: 5 │ │ ← Borde (amarillo/dorado) │ │ ┌───────────────┐ │ │ │ │ │ padding: 10 │ │ │ ← Padding (verde) │ │ │ ┌───────────┐ │ │ │ │ │ │ │ 300×200 │ │ │ │ ← Contenido (azul) │ │ │ └───────────┘ │ │ │ │ │ └───────────────┘ │ │ │ └───────────────────┘ │ └─────────────────────────┘🔵 AZUL - Content (Contenido) - Área del contenido - Definida por width y height
🟢 VERDE - Padding (Relleno) - Espacio interno - Entre contenido y borde
🟡 AMARILLO - Border (Borde) - Línea del borde - Grosor definido por border-width
🟠 NARANJA - Margin (Margen) - Espacio externo - Separación con otros elementosEn el panel Computed verás:
┌─────────────────────────────────┐│ Box Model │├─────────────────────────────────┤│ margin ││ 20 20 20 20 ││ ┌──────────┐ ││ │ border │ ││ 5 │ 5 │ 5 ││ │ ┌──────┐ │ ││ │ │padding│ │ ││ 10 │ │ 10 │ │ 10 ││ │ │┌────┐│ │ ││ │ ││300 ││ │ ││ │ ││× ││ │ ││ │ ││200 ││ │ ││ │ │└────┘│ │ ││ │ └──────┘ │ ││ └──────────┘ │└─────────────────────────────────┘
Tamaño total: 370 × 270/* 1. Hover sobre valores en DevTools *//* Muestra qué archivo y línea define ese valor */
/* 2. Checkbox para desactivar propiedades *//* Prueba qué pasa sin esa propiedad */
/* 3. Editar valores directamente *//* Cambia 20px a 40px y ve el resultado */
/* 4. Ver propiedades computadas *//* Valores finales después de herencia y cascada */
/* 5. Usar el selector de color *//* Para border-color y background */
/* 6. Ver box-sizing activo *//* Indica si es content-box o border-box */Atajos útiles en DevTools
Section titled “Atajos útiles en DevTools”⬆️ ⬇️ - Incrementar/decrementar valor en 1Shift + ⬆️⬇️ - Incrementar/decrementar en 10Alt + ⬆️⬇️ - Incrementar/decrementar en 0.1Ctrl + Click - Editar múltiples valoresEsc - Cerrar panelHover sobre elemento:- Muestra el Box Model con colores- Dimensiones exactas- Posición en la página
Clic en dimensión:- Editar valor directamente- Ver cambios en tiempo real
Panel "Layout":- Grid inspector- Flexbox inspector- Box Model detallado