Product Craft Bible
Responsive Patterns
Inicio Avanzado Responsive Patterns
Avanzado

Responsive Patterns

8 reglas smashing magazine · css-tricksmdn · css-tricks · smashing magazinemdn · smashing magazinesmashing magazine · brad frost
174

Responsive Patterns

8 reglas
1516

Romper layout cuando el contenido lo exija, no por dispositivo

Los breakpoints no deben basarse en tamaños de pantalla populares (768px, 1024px) sino en el punto donde el contenido empieza a romperse o apretarse. Diseñar con un ancho variable y anadir un breakpoint cuando el layout "duele". Si a 600px el layout se rompe y no hay breakpoint porque el siguiente es 768px (iPad), el usuario ve contenido apretado o desbordado sin razón.

smashing magazine · css-tricks
Preferir
@media (min-width: 540px) { /* tarjetas 1 col a 2 col */ }
@media (min-width: 820px) { /* sidebar visible */ }
600px - adapta naturalmente
Proyecto Alpha
Contenido completo visible y legible
Proyecto Beta
Todo el texto con espacio suficiente
Break when the content breaks, not when the device changes
Evitar
@media (max-width: 768px) { /* iPad */ }
@media (max-width: 375px) { /* iPhone */ }
600px - sin breakpoint
Menú
Item 1
Item 2
Proyecto Alpha con nombre largo
Contenido truncado que no cabe...
Proyecto Beta
Texto apretado sin espac...
A 600px no hay breakpoint: el layout se rompe entre 768px y 375px
1517

clamp() para tipografía y espaciado fluidos

clamp(min, preferido, max) escala suavemente entre dos valores sin breakpoints. Para tipografía: font-size: clamp(1rem, 0.5rem + 2vw, 1.75rem). Para espaciado: padding: clamp(16px, 5vw, 48px). Elimina la necesidad de redefinir valores en cada breakpoint y produce una transición continua en lugar de saltos abruptos al cruzar cada media query.

mdn · css-tricks · smashing magazine
Preferir
h1 { font-size: clamp(1rem, 0.5rem + 2vw, 1.75rem); }
16px
320px
480px
640px
800px
960px
1120px
28px
1280px
Escala continua sin saltos, una sola línea de CSS
Evitar
h1 { font-size: 16px; }
@media (min-width:600px) { h1 { font-size: 20px; } }
@media (min-width:1024px) { h1 { font-size: 28px; } }
16px
320px
16px
599px
20px
600px
20px
1023px
28px
1024px
28px
1440px
Saltos abruptos en cada breakpoint, el tamaño se congela entre ellos
1518

Container queries para componentes multi-contexto

Un componente colocado en un sidebar de 280px debe verse diferente al mismo componente en el área principal de 800px. Con container-type: inline-size, el componente responde a su contenedor, no al viewport. Es la diferencia entre "responsivo al viewport" y verdaderamente portable.

mdn · smashing magazine
Preferir
.wrapper { container-type: inline-size; }
@container (min-width: 400px) { .card { flex-direction: row } }
Sidebar
280px
Tarjeta producto
$1,200 MXN
Main
800px
Tarjeta producto
Descripción completa visible porque el contenedor tiene espacio
$1,200
Mismo componente, se adapta a su contenedor. @container reemplaza @media para componentes portables.
Evitar
@media (min-width: 600px) { .card { flex-direction: row } }
Sidebar
280px
Tarjeta produ...
$1,200
Main
800px
Tarjeta producto
Mismo layout horizontal en ambos contextos
$1,200
Media query ve el viewport, no el contenedor. La card en sidebar queda apretada con layout horizontal.
1519

Mobile-first: una columna y añadir complejidad

Escribir los estilos base para pantallas pequeñas y añadir complejidad con min-width. El CSS base es el más simple (una columna, sin layout especial) y los min-width añaden columnas, sidebars y elementos secundarios. Invertir este orden (desktop-first con max-width) genera especificidad innecesaria.

smashing magazine · brad frost
Preferir
.layout { display:flex; flex-direction:column; }
@media (min-width:640px) { .layout { display:grid; grid-template-columns:1fr 1fr; } }
@media (min-width:1024px) { .layout { grid-template-columns:200px 1fr 1fr; } }
375px
Proyecto Alpha
Contenido completo
Reporte mensual
Datos visibles
1024px+
Nav
Inicio
Config
Proyecto Alpha
Contenido completo
Reporte mensual
Datos completos
Mobile-first: columna simple como base, sidebar y segunda columna aparecen con min-width. Progressive enhancement.
Evitar
.layout { display:grid; grid-template-columns:200px 1fr 1fr; }
@media (max-width:768px) { .sidebar { display:none; } }
@media (max-width:480px) { .layout { grid-template-columns:1fr; } }
Mobile 375px
Proyecto Alph...
Contenido trun...
Reporte mens...
Datos incompl...
sidebar: display:none
Desktop-first: layout complejo de 3 columnas que se aplasta con overrides. Sidebar oculto con display:none, contenido truncado.
1520

auto-fit con minmax para grids auto-adaptables

grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)) crea un grid que ajusta el número de columnas automáticamente sin media queries. Cada celda tiene un mínimo (280px) y crece con 1fr para llenar el espacio sobrante. Cuando el contenedor se estrecha, las celdas saltan a la fila siguiente solas. Es la solución canonica para galerias, listas de productos y dashboards que deben funcionar en cualquier viewport sin breakpoints manuales.

css-tricks · mdn
Preferir
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
Desktop 1200px: 3 columnas
Alpha
Contenido completo visible
Beta
Contenido completo visible
Gamma
Contenido completo visible
Tablet 700px: 2 columnas
Alpha
Visible
Beta
Visible
Gamma
Ocupa todo el ancho sobrante
Mobile 375px: 1 columna
Alpha
Contenido completo
Beta
Contenido completo
Gamma
Contenido completo
Sin breakpoints: el grid pasa de 3 a 2 a 1 columna según el espacio disponible.
Evitar
grid-template-columns: 1fr 1fr 1fr;
Desktop 1200px
Alpha
Contenido
Beta
Contenido
Gamma
Contenido
Mobile 375px
Alp...
Bet...
Gam...
3 columnas fijas siempre. En mobile las cards son ilegibles porque no hay wrap.
1521

Priorizar columnas criticas en tablas mobile

En mobile, las tablas con muchas columnas se deforman. Estrategias: ocultar columnas secundarias con display:none en mobile, colapsar filas a cards, o marcar columnas con data-priority y ocultar las de baja prioridad progresivamente. La columna de identificación y la de acción deben ser siempre visibles.

smashing magazine · nielsen norman
Preferir
Mobile 375px
Nombre Estado Acciones
Ana Lopez Activo
Carlos Ruiz Activo
Tocar fila para ver Email, Rol, Fecha
Solo 3 columnas criticas visibles. Columnas secundarias disponibles al expandir la fila, sin scroll horizontal.
Evitar
Mobile 375px
Nombre Email Rol Fecha Estado Acciones
Ana Lopez ana@co.mx Admin 2024-03-12 Activo Editar
Carlos Ruiz carlos@co.mx Editor 2024-05-20 Activo Editar
scroll horizontal necesario para ver todas las columnas
6 columnas apretadas en 375px. Texto ilegible, scroll horizontal obligatorio, el usuario no puede operar la tabla.
1522

srcset y art direction en imagenes

srcset sirve al browser la imagen del tamaño correcto para el viewport y la densidad de pantalla. sizes describe el espacio que ocupara la imagen en el layout. Art direction con <picture> y media permite servir composiciones distintas (crop diferente) según el breakpoint.

mdn · smashing magazine
Preferir
<picture>
<source media="(max-width:640px)"
srcset="hero-crop-400.webp 400w"
sizes="100vw">
<source media="(min-width:641px)"
srcset="hero-800.webp 800w, hero-1200.webp 1200w"
sizes="(max-width:1024px) 50vw, 33vw">
<img src="hero-800.webp" alt="...">
</picture>
Mobile 375px
375px
crop vertical
120 KB
Desktop 1440px
1440px
full landscape
380 KB
Art direction: mobile recibe un crop vertical enfocado (120 KB), desktop la composición completa (380 KB). El browser elige automáticamente.
Evitar
<img src="hero-2400.jpg" alt="...">
Mobile 375px
375px
2.1 MB
Desktop 1440px
1440px
2.1 MB
Misma imagen de 2400px servida a todos los dispositivos. Mobile descarga 2.1 MB para mostrarla a 375px.
1523

Navegación mobile: hamburger vs tabs vs bottom nav

Hamburger: para apps con muchas secciones secundarias o flujos tipo documento. Bottom nav: para 3-5 destinos principales con alta frecuencia de uso (apps). Tabs horizontales: para contenido categorizado con pocas opciones (2-4). El patrón equivocado aumenta friction y abandono. Ocultar toda la navegación detras de un hamburger reduce la descubribilidad en un 21% según Nielsen Norman Group. La combinación ideal en apps móviles es bottom nav para los 3-5 destinos principales (siempre visibles) + hamburger para items secundarios y configuración.

nielsen norman · apple hig · material design
Preferir
Bottom Nav
3-5 items primarios
Siempre visible
Apps con destinos frecuentes
Tabs
2-4 categorías
Mismo nivel
Contenido categorizado
Hamburger
Items secundarios
Overflow / config
Solo lo no esencial
9:41100%
Mi App
Feed principal
Contenido del día
Mensaje nuevo
Hace 2 min
Inicio
Buscar
Favoritos
Perfil
Bottom nav con 4 destinos principales siempre visibles. Hamburger reservado para items secundarios (config, ayuda, legal). El usuario navega sin abrir menús.
Evitar
9:41100%
Mi App
8 items ocultos detras del hamburger
Contenido principal
El usuario no sabe que hay 7 secciones más
Buscar, Perfil, Favoritos...
Invisibles sin abrir menú
Toda la navegación oculta detras de un hamburger. El usuario debe abrir el menú para cada acción. Items criticos invisibles, descubribilidad nula.