En esta página

Espaciado, sizing y contenedores

10 min lectura TextoCap. 2 — Layout y responsive

Espaciado, sizing y contenedores

El sistema de espaciado de Tailwind es uno de sus mayores aportes a la consistencia visual. En lugar de usar valores arbitrarios como padding: 13px, margin: 22px, te fuerza a trabajar dentro de una escala predefinida que garantiza armonía visual en toda la interfaz.

La escala de espaciado

Tailwind usa una escala basada en 0.25rem (4px con el font-size base de 16px del navegador):

Clase rem px
p-0 0 0
p-px 1px 1px
p-0.5 0.125rem 2px
p-1 0.25rem 4px
p-1.5 0.375rem 6px
p-2 0.5rem 8px
p-3 0.75rem 12px
p-4 1rem 16px
p-5 1.25rem 20px
p-6 1.5rem 24px
p-8 2rem 32px
p-10 2.5rem 40px
p-12 3rem 48px
p-16 4rem 64px
p-20 5rem 80px
p-24 6rem 96px

Esta misma escala aplica para padding (p-*), margin (m-*), gap (gap-*), w-*, h-*, top-*, left-*, etc.

Extender la escala con @theme

Si necesitas valores fuera de la escala estándar:

@import "tailwindcss";

@theme {
  --spacing-18: 4.5rem;    /* p-18, m-18, gap-18 → 72px */
  --spacing-22: 5.5rem;    /* p-22 → 88px */
  --spacing-128: 32rem;    /* w-128, h-128 → 512px */
  --spacing-144: 36rem;    /* max-w-144 → 576px */
}

Padding y margin: referencia rápida

<!-- Padding -->
<div class="p-4">       Todos los lados = 16px</div>
<div class="px-6 py-3"> Horizontal 24px, vertical 12px</div>
<div class="pt-8">      Solo top = 32px</div>
<div class="pb-4">      Solo bottom = 16px</div>
<div class="pl-6">      Solo left = 24px</div>
<div class="pr-6">      Solo right = 24px</div>

<!-- Margin -->
<div class="m-4">       Todos los lados = 16px</div>
<div class="mx-auto">   Centrado horizontal automático</div>
<div class="mt-8 mb-4"> Top 32px, bottom 16px</div>

<!-- Margin negativo (muy útil para solapados) -->
<div class="-mt-4">     Margen top negativo = -16px</div>
<div class="-mx-4">     Margen horizontal negativo</div>

El utilitario space-y y space-x

En lugar de agregar margin-top a cada elemento individualmente, space-y-* lo hace automáticamente para todos los hijos excepto el primero:

<!-- Sin space-y: necesitas mt-* en cada elemento hijo -->
<div>
  <p>Párrafo 1</p>
  <p class="mt-4">Párrafo 2</p>
  <p class="mt-4">Párrafo 3</p>
</div>

<!-- Con space-y: mucho más limpio -->
<div class="space-y-4">
  <p>Párrafo 1</p>
  <p>Párrafo 2</p>
  <p>Párrafo 3</p>
</div>

<!-- space-x para elementos horizontales -->
<nav class="flex space-x-6">
  <a href="/">Inicio</a>
  <a href="/cursos">Cursos</a>
  <a href="/blog">Blog</a>
</nav>

Sizing: width y height

Valores fijos de la escala

<!-- Usando la escala de Tailwind (misma que espaciado) -->
<div class="w-4 h-4">16px × 16px</div>
<div class="w-6 h-6">24px × 24px</div>
<div class="w-8 h-8">32px × 32px</div>
<div class="w-16 h-16">64px × 64px</div>
<div class="w-24 h-24">96px × 96px</div>
<div class="w-64 h-64">256px × 256px</div>

Porcentajes y fracciones

<div class="w-1/2">50% del padre</div>
<div class="w-1/3">33.33% del padre</div>
<div class="w-2/3">66.66% del padre</div>
<div class="w-1/4">25% del padre</div>
<div class="w-3/4">75% del padre</div>
<div class="w-full">100% del padre</div>

Valores de viewport

<div class="w-screen">100vw — ancho total del viewport</div>
<div class="h-screen">100vh — alto total del viewport</div>
<div class="h-dvh">100dvh — dynamic viewport height (mejor en móvil)</div>
<div class="h-svh">100svh — small viewport height</div>
<div class="h-lvh">100lvh — large viewport height</div>

Los valores dvh, svh, lvh son cruciales en móvil donde las barras del navegador pueden mostrar u ocultarse dinámicamente. h-dvh es la opción más robusta para secciones hero en móvil.

min-*, max-* constraints

<!-- min-width -->
<div class="min-w-0">min-width: 0 — imprescindible en flex para truncar</div>
<div class="min-w-full">min-width: 100%</div>

<!-- max-width -->
<div class="max-w-xs">24rem / 384px</div>
<div class="max-w-sm">24rem / 384px</div>
<div class="max-w-md">28rem / 448px</div>
<div class="max-w-lg">32rem / 512px</div>
<div class="max-w-xl">36rem / 576px</div>
<div class="max-w-2xl">42rem / 672px</div>
<div class="max-w-3xl">48rem / 768px</div>
<div class="max-w-4xl">56rem / 896px</div>
<div class="max-w-5xl">64rem / 1024px</div>
<div class="max-w-6xl">72rem / 1152px</div>
<div class="max-w-7xl">80rem / 1280px</div>
<div class="max-w-full">100%</div>
<div class="max-w-prose">65ch — ideal para texto legible</div>

<!-- min-height -->
<div class="min-h-screen">min-height: 100vh</div>
<div class="min-h-0">min-height: 0</div>

Valores de contenido

<div class="w-auto">auto — tamaño natural</div>
<div class="w-fit">fit-content — justo lo necesario</div>
<div class="w-min">min-content — el mínimo posible</div>
<div class="w-max">max-content — el máximo posible</div>

Aspect Ratio

aspect-ratio es una de las utilidades más prácticas para mantener proporciones:

<!-- Proporciones predefinidas -->
<div class="aspect-square">1:1</div>
<div class="aspect-video">16:9 — ideal para videos</div>
<div class="aspect-auto">auto (comportamiento del navegador)</div>

<!-- Proporciones personalizadas -->
<div class="aspect-[4/3]">4:3 — fotos clásicas</div>
<div class="aspect-[21/9]">21:9 — ultra wide cinematográfico</div>
<div class="aspect-[3/4]">3:4 — portrait/stories</div>

Patrón de embed responsivo

<!-- YouTube/Vimeo embed completamente responsivo -->
<div class="relative aspect-video rounded-xl overflow-hidden shadow-lg">
  <iframe
    src="https://www.youtube.com/embed/VIDEO_ID"
    title="Título del video"
    class="absolute inset-0 w-full h-full"
    frameborder="0"
    allowfullscreen
  ></iframe>
</div>

Patrones de contenedor

El patrón más común: wrapper centrado

<!-- Contenido centrado con padding lateral -->
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
  <!-- Tu contenido aquí -->
</div>

Usando la clase container

<!-- container aplica max-width según el breakpoint actual -->
<div class="container mx-auto px-4">
  <!-- A 640px: max-width: 640px -->
  <!-- A 1024px: max-width: 1024px -->
  <!-- Etc. -->
</div>

Contenedor con breakpoint específico

<!-- Máximo ancho en xl, centrado, con padding adaptativo -->
<main class="max-w-screen-xl mx-auto px-4 sm:px-6 xl:px-8 py-8 lg:py-16">
  <!-- content -->
</main>

Patrones de layout de página completa

<!-- Layout estándar de app: sidebar fija + contenido scrolleable -->
<div class="flex h-screen overflow-hidden">
  <aside class="w-64 flex-none bg-gray-900 overflow-y-auto">
    <!-- Sidebar -->
  </aside>
  <main class="flex-1 overflow-y-auto bg-gray-50">
    <div class="max-w-4xl mx-auto px-6 py-8">
      <!-- Contenido -->
    </div>
  </main>
</div>

<!-- Layout de marketing: secciones a ancho completo, contenido centrado -->
<body>
  <section class="bg-blue-600 py-24">
    <div class="max-w-6xl mx-auto px-4 text-center text-white">
      <h1 class="text-6xl font-extrabold">Hero Section</h1>
    </div>
  </section>

  <section class="bg-white py-20">
    <div class="max-w-6xl mx-auto px-4">
      <div class="grid grid-cols-1 md:grid-cols-3 gap-8">
        <!-- Feature cards -->
      </div>
    </div>
  </section>
</body>

Overflow y scroll

<!-- Overflow -->
<div class="overflow-hidden">  Oculta lo que se desborda</div>
<div class="overflow-auto">    Scroll cuando es necesario</div>
<div class="overflow-x-auto">  Scroll horizontal solamente</div>
<div class="overflow-y-auto">  Scroll vertical solamente</div>
<div class="overflow-scroll">  Scroll siempre visible</div>

<!-- Scroll snapping -->
<div class="overflow-x-auto snap-x snap-mandatory flex gap-4">
  <div class="snap-start flex-none w-80 h-48 bg-blue-100 rounded-xl"></div>
  <div class="snap-start flex-none w-80 h-48 bg-purple-100 rounded-xl"></div>
  <div class="snap-start flex-none w-80 h-48 bg-pink-100 rounded-xl"></div>
</div>

Resumen

El sistema de espaciado de Tailwind garantiza consistencia visual: usa la escala de 4px como base para todos los márgenes, paddings y tamaños. Los utilitarios clave son: space-y-* para stacks verticales, mx-auto para centrado, max-w-7xl para contenedores, aspect-video para proporciones de video, y min-h-dvh para secciones fullscreen en móvil.

space-y-* vs gap-*
Usa space-y-* (que agrega margin-top a todos los hijos excepto el primero) en listas de contenido donde los hijos son de altura variable. Usa gap-* en Grid/Flex cuando los hijos tienen altura definida. gap-* es más predecible y funciona mejor con justify-content.
aspect-video es tu mejor amigo para embeds
Para iframes de YouTube o Vimeo, envuelve el embed en un div con aspect-video relative, luego aplica absolute inset-0 w-full h-full al iframe. Esto garantiza que el video mantenga la proporción 16:9 en cualquier ancho de pantalla.
<!-- Escala de Tailwind: 1 unidad = 0.25rem = 4px -->
<!-- p-1=4px, p-2=8px, p-4=16px, p-8=32px, p-16=64px -->

<!-- Tarjeta con espaciado consistente -->
<div class="bg-white rounded-2xl shadow-md overflow-hidden">

  <!-- Imagen -->
  <div class="aspect-video bg-gray-200">
    <img src="cover.jpg" alt="Portada" class="w-full h-full object-cover" />
  </div>

  <!-- Cuerpo con padding generoso -->
  <div class="p-6">
    <!-- Stack vertical con espacio consistente -->
    <div class="space-y-3">
      <span class="text-xs font-semibold text-blue-600 uppercase tracking-wide">
        Tutorial
      </span>
      <h2 class="text-xl font-bold text-gray-900 leading-snug">
        Introducción a Tailwind CSS v4
      </h2>
      <p class="text-gray-500 text-sm leading-relaxed">
        Aprende a instalar y configurar Tailwind v4 desde cero.
      </p>
    </div>

    <!-- Footer de la tarjeta con margen top automático -->
    <div class="flex items-center justify-between mt-6 pt-4 border-t border-gray-100">
      <span class="text-sm text-gray-400">12 min</span>
      <a href="/leccion" class="text-sm font-semibold text-blue-600 hover:text-blue-800">
        Leer →
      </a>
    </div>
  </div>
</div>