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