Todo elemento de HTML es una caja, y esa caja tiene cuatro capas.
Las cuatro capas, de fuera hacia adentro
flowchart TB
subgraph MAR["margin"]
direction TB
subgraph BOR["border"]
direction TB
subgraph PAD["padding"]
direction TB
CON["content<br/>el texto o la imagen"]
end
end
end
Capa
Qué es
content
El contenido: el texto o la imagen
padding
Relleno interno: separa el contenido de su borde
border
El borde que rodea la caja
margin
Espacio externo: separa esta caja de las de al lado
La frase que hay que memorizar
padding empuja hacia adentro; margin separa hacia afuera.
Si el texto está muy pegado al borde de su tarjeta, es padding. Si dos tarjetas
están muy juntas entre sí, es margin.
La forma de dos valores es la que más vas a usar: 16px 24px da más aire a los
lados que arriba y abajo, que es como se ven bien casi todos los botones.
margin acepta exactamente los mismos formatos.
margin: 0 auto centra una caja
.contenedor { width: 900px; margin: 0 auto;}
auto reparte el espacio sobrante en partes iguales a izquierda y derecha. Es el
truco clásico para centrar un bloque, y necesita que la caja tenga un width.
El fondo cubre el padding, no el margin
Si le pones background-color a una tarjeta, el color llega hasta el borde,
incluyendo todo el relleno interno. El margin queda fuera y siempre se ve del
color de lo que haya detrás.
Por eso, si quieres más superficie de color, es padding; si quieres más
separación entre cajas, es margin.
Abre el inspector y la tarjeta mide 348 px de ancho: los 300 del width, más
20 de padding a cada lado, más 4 de borde a cada lado. Por defecto, el width es
solo el ancho del contenido, y el relleno y el borde se suman por fuera.
box-sizing: border-box cambia esa cuenta: el width pasa a ser el ancho total
de la caja, y el padding y el borde se acomodan por dentro.
* { box-sizing: border-box;}
El * es el selector universal: apunta a todos los elementos. Con esa regla al
comienzo del archivo, una caja de 300px mide 300 px, tenga el relleno que tenga.
Pon box-sizing: border-box al inicio de tu CSS
Es la primera regla de casi todas las hojas de estilo profesionales, y hace que las
medidas signifiquen lo que dicen. Tailwind la trae puesta por defecto, así que
cuando llegues ahí, las cajas ya se comportan así.
Flexbox
Por defecto los elementos de bloque se apilan: cada uno ocupa una línea entera y
empuja hacia abajo lo que sigue. Flexbox es la herramienta para ponerlos en fila
y repartirlos.
Se activa en el contenedor, no en los hijos
display: flex se escribe en el elemento padre. Los que se acomodan son sus
hijos directos, que no necesitan ninguna regla especial.
Confundir esos dos papeles es lo que más cuesta al principio: si pones
display:flex en las tarjetas en vez de en la caja que las contiene, no pasa nada
de lo que esperas.
.contenedor { display: flex; /* activa Flexbox */ flex-direction: row; /* en fila (por defecto) */ gap: 16px; /* espacio entre los hijos */}
Fila o columna, según flex-direction
flowchart TB
subgraph R["row"]
direction LR
A1["A"] ~~~ B1["B"] ~~~ C1["C"]
end
subgraph C["column"]
direction TB
A2["A"] ~~~ B2["B"] ~~~ C2["C"]
end
R ~~~ C
gap en vez de márgenes uno por uno
gap: 16px pone el espacio entre los hijos, y solo entre ellos: no sobra
margen al principio ni al final. Antes de que existiera había que poner
margin-right a todos menos al último, y era un dolor.
Distribuir y alinear
Dos propiedades hacen casi todo el trabajo, y se reparten los dos ejes.
Propiedad
Reparte
Valores más usados
justify-content
A lo largo de la fila
flex-start, center, space-between
align-items
A lo ancho, el eje contrario
flex-start, center, stretch
Valor de justify-content
Qué hace
flex-start
Todos al inicio (por defecto)
center
Todos al medio
space-between
Uno a cada extremo, el sobrante repartido entre medio
Valor de align-items
Qué hace
flex-start
Arriba
center
Al medio
stretch
Todos a la misma altura (por defecto)
La receta de una barra de navegación
.barra { display: flex; justify-content: space-between; /* marca a la izquierda, enlaces a la derecha */ align-items: center; /* todo centrado en vertical */ padding: 16px 24px;}
Estas tres líneas son el 90% de las barras de navegación que existen.
Cómo recordar cuál es cuál
justify va a lo largo de la fila; align va a lo ancho.
Con flex-direction: column los ejes se dan vuelta: ahí justify-content reparte
en vertical y align-items en horizontal. Por eso los nombres no dicen “horizontal”
ni “vertical”.
/* el contenedor */.precios { display: flex; gap: 20px; align-items: stretch;}/* los hijos */.tarjeta { flex: 1; /* las tres, del mismo ancho */ background: #e2f3f9; padding: 24px; text-align: center;}
flex: 1 va en cada hijo y es lo que reparte el ancho en partes iguales. Sin él,
cada tarjeta se encoge al tamaño de su propio texto.
Pruébalo borrando una línea
Copia ese ejemplo, quítale el flex: 1 y mira qué pasa. Es la forma más rápida de
entender qué hace cada propiedad: quitarla y observar.
Checkpoint
Intenta responder antes de desplegar cada pregunta.
¿Cuáles son las cuatro capas del modelo de caja?
De dentro hacia afuera: content (el texto o la imagen), padding (relleno
interno), border (el borde) y margin (el espacio que la separa de las otras
cajas).
¿Qué diferencia hay entre padding y margin?
El padding empuja hacia adentro: separa el contenido de su propio borde.
El margin separa hacia afuera: aleja esta caja de las de al lado.
Si el texto está pegado al borde de su tarjeta, es padding. Si dos tarjetas están
muy juntas, es margin.
Le pusiste fondo a una tarjeta. ¿El color llega hasta el margen?
No. El fondo cubre el contenido y el padding, hasta el borde. El margin
queda fuera y siempre muestra lo que haya detrás.
De ahí la regla práctica: más superficie de color es padding; más separación entre
cajas es margin.
Una caja con width: 300px, padding: 20px y borde de 4 px mide 348 px. ¿Por qué, y cómo se arregla?
Porque por defecto el width es solo el contenido: el padding (20 + 20) y el
borde (4 + 4) se suman por fuera. Con box-sizing: border-box el width pasa a ser
el ancho total y la caja mide 300 px. Se escribe para todos los elementos con
* { box-sizing: border-box; }, y Tailwind ya lo trae.
¿Cómo se activa Flexbox y dónde se escribe?
Con display: flex, y se escribe en el contenedor (el elemento padre). Los
que se acomodan son sus hijos directos, que no necesitan ninguna regla.
Ponerlo en los hijos en vez de en el padre es el error más común.
¿Qué hacen justify-content y align-items?
justify-content reparte a lo largo de la fila: flex-start al inicio,
center al medio, space-between uno a cada extremo.
align-items alinea a lo ancho, en el eje contrario: flex-start arriba,
center al medio, stretch todos a la misma altura.