Todo elemento HTML es una caja. Esa caja tiene, de afuera hacia adentro: margin (espacio fuera del borde, empuja a otros elementos), border (el borde en sí) y padding (espacio dentro del borde, entre el borde y el contenido).
margin
padding
content
Margin en todos los lados
m-{n} aplica margen en las 4 direcciones. La escala de Tailwind (1, 2, 4, 8...) corresponde a múltiplos de 0.25rem, así que m-4 = 1rem = 16px.
Tengo m-8
<div class="m-8 bg-teal-100">
Tengo m-8 (32px) de margen
</div>
→La escala no es arbitraria: m-1 = 4px, m-2 = 8px, m-4 = 16px, m-8 = 32px.
→Para un valor exacto que no está en la escala usa corchetes: m-[10px].
Margin por eje y por lado
mx / my controlan un eje completo (horizontal o vertical). mt, mr, mb, ml controlan un solo lado.
→mx-auto junto con un ancho definido (w-64, por ejemplo) es la forma clásica de centrar un bloque horizontalmente.
Margin negativo
Anteponiendo un guion se obtiene margen negativo, útil para superponer elementos o compensar el espaciado de un padre.
-mt-6
<div class="-mt-6 bg-rose-100">
Se superpone al elemento de arriba
</div>
→Úsalo con cuidado: es fácil generar overlaps no deseados si otro dev no espera un margen negativo ahí.
Padding en todos los lados y por eje
Misma lógica que margin, pero el espacio queda dentro del borde. p-{n}, px-{n}/py-{n}, pt/pr/pb/pl-{n}.
px-6 py-3
<div class="px-6 py-3 bg-teal-100">
Padding horizontal y vertical distinto
</div>
→Padding sí afecta el tamaño total de la caja (a menos que uses box-sizing: border-box, que es el default de Tailwind vía Preflight).
Margin collapsing (colapso de márgenes)
Cuando dos elementos hermanos en flujo normal (no flex/grid) tienen margin vertical, no se suman: se colapsan y prevalece el mayor.
Párrafo A (mb-8)
Párrafo B (mt-4)
<p class="mb-8">Párrafo A</p>
<p class="mt-4">Párrafo B</p>
<!-- El espacio real entre A y B es 32px (mb-8),
no 32px + 16px = 48px -->
→El colapso solo ocurre con márgenes verticales y en flujo normal de documento.
→Si el padre usa display: flex o grid, el colapso no aplica — por eso a veces conviene envolver secciones en un flex column con space-y-* en vez de márgenes sueltos.
space-y / space-x como alternativa
En vez de poner margin a cada hijo, space-y-{n} agrega separación vertical automática entre hermanos directos, sin depender de márgenes que colapsan.