Flexbox con clases

Todo lo que viste de Flexbox tiene su clase, y la regla sigue siendo la misma: se escribe en el contenedor.

ClaseCSS
flexdisplay: flex
flex-col · flex-rowflex-direction: column · row
justify-between · justify-centerjustify-content: space-between · center
items-center · items-start · items-stretchalign-items: center · flex-start · stretch
gap-4gap: 1rem
flex-1flex: 1 (en el hijo: se reparte el espacio)
flex-wrapSi no caben, los hijos bajan a la línea siguiente

La receta de la barra de navegación, ahora en una línea:

<nav class="border-b border-gray-200 bg-white">
  <div class="mx-auto flex max-w-5xl items-center justify-between px-4 py-3">
    <a href="index.html" class="text-lg font-bold text-gray-900">Ana Soto</a>
    <ul class="flex gap-6">
      <li><a href="index.html" class="font-semibold text-sky-700">Inicio</a></li>
      <li><a href="sobre-mi.html" class="text-gray-700 hover:text-sky-700">Sobre mí</a></li>
      <li><a href="contacto.html" class="text-gray-700 hover:text-sky-700">Contacto</a></li>
    </ul>
  </div>
</nav>

Compárala con la versión en CSS de el menú de lista a barra: son las mismas propiedades. La <ul> no necesita list-none ni p-0 porque Tailwind ya les quitó las viñetas y el relleno a las listas.

Grid con clases

ClaseCSS
griddisplay: grid
grid-cols-3grid-template-columns: repeat(3, 1fr), tres columnas iguales
gap-6gap: 1.5rem
col-span-2grid-column: span 2 (en el hijo: ocupa dos columnas)
<section class="grid grid-cols-3 gap-6">
  <article class="rounded-lg border border-gray-200 p-6">…</article>
  <article class="rounded-lg border border-gray-200 p-6">…</article>
  <article class="rounded-lg border border-gray-200 p-6">…</article>
</section>

El contenedor central

En pantallas grandes, un texto que ocupa todo el ancho es incómodo de leer. Casi todos los sitios encierran su contenido en una columna central:

<main class="mx-auto max-w-5xl px-4 py-8">
  …
</main>
ClaseQué hace
max-w-5xlNo deja que pase de 1024 px de ancho
mx-autoLo centra, igual que margin: 0 auto
px-4Deja 16 px a los lados, para que en el teléfono el texto no toque el borde

Usa el mismo contenedor en todas las vistas

Si <main>, la navbar y el pie usan el mismo max-w-5xl px-4, sus bordes quedan alineados en las tres vistas. Es de las cosas que más hacen que un sitio “se vea ordenado” sin que nadie sepa decir por qué.

Diseño responsivo: móvil primero

Una página responsiva se reacomoda según el ancho de la pantalla: en el teléfono las tarjetas van una bajo otra, y en el computador van en fila.

Tailwind lo resuelve con prefijos de tamaño, y la regla es una sola.

Sin prefijo, para todas; con prefijo, desde ese ancho

Las clases sin prefijo valen en todas las pantallas, empezando por el teléfono. Un prefijo como md: agrega o cambia algo desde ese ancho hacia arriba.

PrefijoSe aplica desdePensado para
(sin prefijo)0 pxEl teléfono, y todo lo que venga después
sm:640 pxTeléfonos grandes en horizontal
md:768 pxTablets
lg:1024 pxComputadores
xl:1280 pxPantallas grandes
<section class="grid grid-cols-1 gap-6 md:grid-cols-3">

Se lee así: una columna siempre y, desde 768 px, tres columnas.

La misma grilla en dos anchos

flowchart LR
    subgraph T["teléfono"]
        direction TB
        A1["A"] ~~~ B1["B"] ~~~ C1["C"]
    end

    subgraph D["desde md"]
        direction LR
        A2["A"] ~~~ B2["B"] ~~~ C2["C"]
    end

    T ~~~ D

md: no significa "solo en tablet"

Significa “desde 768 px en adelante”: en un computador también se aplica. Si quieres algo solo en el teléfono, lo escribes sin prefijo y lo cambias desde md:. Por eso se dice “móvil primero”: se diseña el teléfono y después se agregan los cambios para las pantallas más grandes.

Patrones que vas a usar

ClasesEn el teléfonoDesde md:
flex flex-col md:flex-rowUno bajo otroEn fila
grid grid-cols-1 md:grid-cols-3Una columnaTres columnas
text-2xl md:text-4xlTítulo medianoTítulo grande
hidden md:blockNo se muestraSe muestra
w-full md:w-1/2Todo el anchoLa mitad del ancho

Sin la meta viewport, nada de esto funciona

Sin <meta name="viewport" content="width=device-width, initial-scale=1.0">, el teléfono finge una pantalla de escritorio de unos 980 px. Como 980 es más que 768, siempre se aplican las clases md:, y el teléfono muestra la versión de computador en miniatura.

Prueba en el modo dispositivo del inspector

Abre el inspector (F12) y activa el modo dispositivo con Ctrl + Shift + M. Revisa la página en tres anchos: 375 px (un teléfono), 768 px (donde entra md:) y 1280 px (un computador). Arrastra el borde para ver el momento exacto en que la grilla cambia.

La interfaz en pantallas chicas

Que la página “quepa” en el teléfono no basta: también tiene que ser cómoda de usar con el dedo.

ReglaPor quéCómo
Todo en una columnaLeer de arriba abajo es natural en un teléfonoflex-col o grid-cols-1 sin prefijo
Áreas táctiles de al menos 44 px de altoUn dedo es mucho menos preciso que un cursorpy-3 px-4 en enlaces y botones del menú
Texto de 16 px o másLo más chico se lee con esfuerzotext-base en párrafos y campos
Separación entre enlacesEvita pulsar el vecinogap-2 o más en el menú apilado
Nada se sale por el costadoEl scroll horizontal se siente rotoVer el aviso de las tablas

La navbar, apilada en el teléfono y en fila desde md::

<nav class="mx-auto flex max-w-5xl flex-col gap-2 px-4 py-3 md:flex-row md:items-center md:justify-between">
  <a href="index.html" class="text-lg font-bold text-gray-900">Ana Soto</a>
  <ul class="flex flex-col gap-1 md:flex-row md:gap-6">
    <li><a href="index.html" class="block py-3 font-semibold text-sky-700 md:py-0">Inicio</a></li>
    <li><a href="sobre-mi.html" class="block py-3 text-gray-700 hover:text-sky-700 md:py-0">Sobre mí</a></li>
    <li><a href="contacto.html" class="block py-3 text-gray-700 hover:text-sky-700 md:py-0">Contacto</a></li>
  </ul>
</nav>

block py-3 hace que cada enlace ocupe toda la fila y tenga altura suficiente para el dedo; desde md:, con el ratón, ya no hace falta tanto relleno.

Los campos de texto con menos de 16 px hacen zoom solos

En el iPhone, al tocar un campo con letra más chica que 16 px, el navegador acerca la página y el usuario tiene que alejarla a mano. Con text-base en los <input> y <textarea> no pasa.

Una tabla ancha se sale de la pantalla

Las tablas no se encogen: si tienen muchas columnas, empujan la página hacia el costado y aparece el scroll horizontal en todo el sitio. Envuélvela en un div que se desplace solo:

<div class="overflow-x-auto">
  <table class="w-full">…</table>
</div>

Ahora solo la tabla se desliza de lado, y el resto de la página queda quieta.

Checkpoint

Intenta responder antes de desplegar cada pregunta.