En esta página

Diseño responsivo con Tailwind

12 min lectura TextoCap. 2 — Layout y responsive

Diseño responsivo en Tailwind

El diseño responsivo en Tailwind funciona con un enfoque mobile-first: primero defines cómo se ve en pantallas pequeñas (sin ningún prefijo), y luego agregas prefijos de breakpoint para modificar el estilo en pantallas más grandes.

Este enfoque es el opuesto a como pensamos en CSS tradicional con max-width en media queries. En Tailwind, usas min-width, aunque no lo ves explícitamente porque los prefijos lo hacen por ti.

Los breakpoints de Tailwind v4

Tailwind v4 incluye estos breakpoints por defecto:

Prefijo Mínimo Descripción
sm: 640px Dispositivos pequeños, tablets en portrait
md: 768px Tablets en landscape
lg: 1024px Laptops y desktops pequeños
xl: 1280px Desktops grandes
2xl: 1536px Pantallas muy grandes

Cómo funcionan

<!-- Este elemento:
     - tiene padding-4 en TODO el rango de pantallas
     - tiene padding-8 desde 1024px hacia arriba (lg) -->
<div class="p-4 lg:p-8">...</div>

<!-- Este elemento:
     - tiene 1 columna en móvil (hasta 639px)
     - tiene 2 columnas de 640px en adelante
     - tiene 3 columnas de 1024px en adelante -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">...</div>

La clave es entender que una clase sin prefijo = aplica en todos los tamaños. Los prefijos solo sobreescriben hacia arriba.

Patrones responsivos más comunes

1. Stack a Grid (el más usado)

<!-- En móvil: columna vertical (flex-col por defecto es flex-col) -->
<!-- En desktop: fila horizontal -->
<div class="flex flex-col lg:flex-row gap-8">
  <aside class="lg:w-72 flex-none">
    <!-- Sidebar: arriba en móvil, a la izquierda en desktop -->
  </aside>
  <main class="flex-1">
    <!-- Contenido principal -->
  </main>
</div>

2. Hero section responsiva

<section
  class="min-h-screen bg-gradient-to-br from-blue-600 to-purple-700
         flex flex-col items-center justify-center text-center
         px-4 py-20"
>
  <h1
    class="text-4xl sm:text-5xl md:text-6xl lg:text-7xl
           font-extrabold text-white leading-tight mb-6"
  >
    Aprende sin límites
  </h1>
  <p
    class="text-lg sm:text-xl text-blue-100
           max-w-xs sm:max-w-md md:max-w-xl lg:max-w-2xl
           leading-relaxed mb-10"
  >
    Plataforma de cursos en línea para desarrolladores que quieren
    dominar las tecnologías más demandadas del mercado.
  </p>
  <div class="flex flex-col sm:flex-row gap-4 w-full sm:w-auto">
    <a
      href="/registro"
      class="bg-white text-blue-700 font-bold px-8 py-4 rounded-xl
             hover:bg-blue-50 transition-colors text-center"
    >
      Empezar gratis
    </a>
    <a
      href="/cursos"
      class="border-2 border-white/50 text-white font-bold px-8 py-4
             rounded-xl hover:bg-white/10 transition-colors text-center"
    >
      Ver cursos
    </a>
  </div>
</section>

3. Navegación responsiva con hamburguesa

<header class="bg-white border-b border-gray-100">
  <nav class="flex items-center justify-between px-4 py-4 max-w-7xl mx-auto">

    <!-- Logo siempre visible -->
    <a href="/" class="font-bold text-xl text-gray-900">Logo</a>

    <!-- Links: ocultos en móvil, visibles en desktop -->
    <ul class="hidden lg:flex items-center gap-8">
      <li><a href="/cursos" class="text-gray-600 hover:text-gray-900">Cursos</a></li>
      <li><a href="/blog" class="text-gray-600 hover:text-gray-900">Blog</a></li>
    </ul>

    <!-- CTA: solo en desktop -->
    <a
      href="/registro"
      class="hidden lg:inline-flex bg-blue-600 text-white
             px-4 py-2 rounded-lg font-medium hover:bg-blue-700 transition-colors"
    >
      Empezar gratis
    </a>

    <!-- Botón hamburguesa: solo en móvil y tablet -->
    <button
      type="button"
      class="lg:hidden p-2 rounded-lg text-gray-600
             hover:bg-gray-100 focus-visible:ring-2 focus-visible:ring-blue-500"
      aria-label="Abrir menú"
    >
      <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
              d="M4 6h16M4 12h16M4 18h16"/>
      </svg>
    </button>

  </nav>
</header>

4. Imagen de fondo responsiva

<!-- Imagen diferente según breakpoint (con bg-image y Tailwind arbitrario) -->
<div
  class="bg-[url('/hero-mobile.jpg')] lg:bg-[url('/hero-desktop.jpg')]
         bg-cover bg-center min-h-64 lg:min-h-96"
>
  <!-- Contenido sobre la imagen -->
</div>

Ocultar y mostrar elementos

<!-- Oculto en todos, visible desde lg -->
<div class="hidden lg:block">Solo visible en desktop</div>

<!-- Visible hasta md, oculto desde lg -->
<div class="block lg:hidden">Solo visible en móvil y tablet</div>

<!-- Visible solo en sm (entre 640px y 767px) -->
<div class="hidden sm:block md:hidden">Solo visible en sm</div>

<!-- flex vs block según breakpoint -->
<div class="hidden sm:flex items-center gap-4">
  <!-- Stack vertical en móvil, fila horizontal desde sm -->
</div>

Tipografía responsiva con fluid text

Enfoque con breakpoints

<h1 class="text-3xl sm:text-4xl md:text-5xl lg:text-6xl font-bold">
  Título principal
</h1>

<p class="text-base sm:text-lg leading-relaxed">
  Párrafo con tamaño adaptativo
</p>

Enfoque con valores arbitrarios (clamp)

Para tipografía verdaderamente fluida sin saltos bruscos:

<h1 class="text-[clamp(2rem,5vw,4rem)] font-bold">
  Título fluido que escala suavemente
</h1>

Spacing responsivo

<!-- Padding que crece con la pantalla -->
<main class="px-4 sm:px-6 md:px-8 lg:px-12 xl:px-16 py-8 lg:py-16">
  <!-- Contenido -->
</main>

<!-- Gap responsivo en grid -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 lg:gap-8">
  <!-- Tarjetas -->
</div>

El container en Tailwind

La clase container establece un max-width que corresponde al breakpoint actual y se centra con mx-auto:

<!-- Patrón más común para contenido centrado -->
<div class="container mx-auto px-4">
  <!-- El ancho máximo se adapta automáticamente al breakpoint -->
</div>

Por defecto, container no tiene padding horizontal propio ni se centra solo, necesitas mx-auto y px-4:

<!-- Variante con padding integrado en una clase utilitaria -->
<main class="container mx-auto px-4 sm:px-6 lg:px-8 py-12">
  <h1 class="text-4xl font-bold mb-8">Título de la página</h1>
  <!-- contenido -->
</main>

Breakpoints personalizados con @theme

Si los breakpoints estándar no se ajustan a tu diseño:

@import "tailwindcss";

@theme {
  /* Nuevo breakpoint pequeño */
  --breakpoint-xs: 480px;

  /* Breakpoint enorme para pantallas 4K */
  --breakpoint-3xl: 1920px;

  /* Modificar un breakpoint existente */
  --breakpoint-md: 800px;
}

Ahora puedes usar xs:grid-cols-2, 3xl:grid-cols-8, etc.

Ejemplo completo: página de landing responsiva

<body class="bg-white">

  <!-- Hero -->
  <section class="px-4 py-16 sm:py-24 lg:py-32 text-center">
    <div class="max-w-4xl mx-auto">
      <h1 class="text-4xl sm:text-6xl font-extrabold text-gray-900 mb-6 leading-tight">
        La mejor plataforma<br class="hidden sm:block"> de aprendizaje
      </h1>
      <p class="text-xl text-gray-600 max-w-2xl mx-auto mb-10 leading-relaxed">
        Aprende programación con proyectos reales y mentores expertos.
      </p>
      <a
        href="/empezar"
        class="inline-block bg-blue-600 text-white font-bold
               px-10 py-4 rounded-2xl text-lg hover:bg-blue-700 transition-colors"
      >
        Empieza hoy — es gratis
      </a>
    </div>
  </section>

  <!-- Features grid -->
  <section class="bg-gray-50 px-4 py-16 sm:py-24">
    <div class="max-w-6xl mx-auto">
      <h2 class="text-3xl sm:text-4xl font-bold text-center text-gray-900 mb-12">
        ¿Por qué elegirnos?
      </h2>
      <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8">
        <div class="bg-white p-8 rounded-2xl shadow-sm text-center">
          <div class="text-5xl mb-4">🚀</div>
          <h3 class="text-xl font-bold text-gray-900 mb-2">Aprendizaje rápido</h3>
          <p class="text-gray-500 leading-relaxed">
            Lecciones cortas y enfocadas para máxima retención.
          </p>
        </div>
        <div class="bg-white p-8 rounded-2xl shadow-sm text-center">
          <div class="text-5xl mb-4">🎯</div>
          <h3 class="text-xl font-bold text-gray-900 mb-2">Proyectos reales</h3>
          <p class="text-gray-500 leading-relaxed">
            Cada curso incluye proyectos que puedes mostrar en tu portafolio.
          </p>
        </div>
        <div
          class="bg-white p-8 rounded-2xl shadow-sm text-center
                 sm:col-span-2 lg:col-span-1"
        >
          <div class="text-5xl mb-4">👥</div>
          <h3 class="text-xl font-bold text-gray-900 mb-2">Comunidad</h3>
          <p class="text-gray-500 leading-relaxed">
            Únete a miles de estudiantes y mentores activos.
          </p>
        </div>
      </div>
    </div>
  </section>

</body>

Resumen

El diseño responsivo en Tailwind se basa en tres conceptos: mobile-first (el estilo base aplica en móvil), breakpoints (sm:, md:, lg:, xl:, 2xl:) que sobreescriben hacia arriba, y control de visibilidad (hidden/block/flex con prefijos). Estos tres conceptos, combinados con Flexbox y Grid, te permiten construir interfaces completamente responsivas sin escribir una sola media query manualmente.

Tailwind es mobile-first
Las clases sin prefijo aplican en TODOS los tamaños de pantalla (incluyendo móvil). Los prefijos sm:, md:, lg: sobreescriben desde ese breakpoint hacia arriba. Nunca uses sm: para "ocultar en desktop" — usa lg:hidden para eso.
Usa el container para layouts centrados
La clase container centra el contenido y aplica padding horizontal. Combínala con mx-auto: <div class="container mx-auto px-4">. También puedes definir el max-width de container con @theme: --container-*.
<!-- Mobile-first: aplica la clase sin prefijo en móvil,
     luego sobreescribe con prefijos de breakpoint -->

<!-- Stack en móvil, grid en tableta, 4 cols en desktop -->
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
  <div class="bg-white rounded-xl p-6 shadow-sm">Tarjeta 1</div>
  <div class="bg-white rounded-xl p-6 shadow-sm">Tarjeta 2</div>
  <div class="bg-white rounded-xl p-6 shadow-sm">Tarjeta 3</div>
  <div class="bg-white rounded-xl p-6 shadow-sm">Tarjeta 4</div>
</div>

<!-- Texto que cambia de tamaño según la pantalla -->
<h1 class="text-2xl sm:text-4xl lg:text-6xl font-bold text-gray-900">
  Aprende a programar
</h1>

<!-- Visible solo en ciertos breakpoints -->
<nav class="hidden lg:flex items-center gap-6">
  <!-- Solo visible en desktop -->
</nav>

<button class="lg:hidden">
  <!-- Solo visible en móvil y tableta: menú hamburguesa -->
  ☰ Menú
</button>