Una web, muchas pantallas
Más de la mitad de las visitas a cualquier web llegan desde un móvil. El resto, desde tabletas, portátiles y pantallas enormes. No tiene sentido hacer una web para cada tamaño: lo que se hace es una sola web que se adapta. A eso se le llama diseño responsive (adaptable).
Buena noticia: ya llevas medio camino hecho. El HTML se adapta solo al ancho de la pantalla por naturaleza, y herramientas como max-width, flex-wrap o repeat(auto-fit, minmax()) ya son responsive. En esta lección añadimos las piezas que faltan.
1. La etiqueta viewport
Es la línea que pusimos en el esqueleto de la lección 3 sin explicarla del todo:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Sin ella, el navegador del móvil finge ser un ordenador: dibuja la página como si la pantalla midiera unos 980px y luego la encoge para que quepa. Resultado: todo diminuto y hay que hacer zoom con los dedos. Con ella, le dices: «usa el ancho real del dispositivo».
2. Contenido flexible
Antes de escribir una sola media query, asegúrate de que nada tiene un ancho fijo que no quepa en un móvil:
* {
box-sizing: border-box;
}
img {
max-width: 100%;
height: auto;
}
.contenedor {
max-width: 1100px;
margin: 0 auto;
padding: 0 16px;
}
- Imágenes fluidas: nunca más anchas que su contenedor, y sin deformarse.
max-widthen lugar dewidthpara los contenedores.- Un poco de
paddinga los lados, para que el texto no quede pegado al borde del móvil.
3. Media queries
Una media query es una regla con condición: «aplica estos estilos solo si la pantalla cumple esto».
@media (min-width: 768px) {
/* Estas reglas solo se aplican en pantallas de 768px de ancho o más */
h1 {
font-size: 3rem;
}
}
Dentro de las llaves de @media van reglas normales, con su selector y sus llaves. Fíjate en las dos llaves de cierre: una de la regla y otra de la media query.
Mobile first: primero el móvil
Hay dos formas de pensar, y la recomendada es mobile first (primero el móvil):
- Escribe el CSS para el móvil, sin media queries. Suele ser lo más sencillo: todo en una columna.
- Añade media queries con
min-widthpara lo que cambia en pantallas más grandes.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
¿Qué anchos uso?
No hay que diseñar para cada modelo de móvil. Los puntos de ruptura (breakpoints) se eligen donde tu diseño empieza a verse mal. Como punto de partida, estos sirven para casi todo:
| Desde | Pensado para |
|---|---|
| 0 (sin media query) | Móviles |
min-width: 768px | Tabletas y móviles en horizontal |
min-width: 1024px | Portátiles y ordenadores |
Un caso real: el menú
En el móvil no cabe un menú horizontal con muchos enlaces. Una solución sencilla: en el móvil, todo en columna; a partir de 768px, logo a un lado y menú al otro.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Prueba en tamaño móvil con las DevTools
No necesitas un móvil para probar. En las DevTools (F12), pulsa el icono de móvil y tableta (o Ctrl + Mayús + M; en Mac, Cmd + Mayús + M). Arriba podrás elegir un modelo de móvil o arrastrar para cambiar el ancho, y ver tu web como en ese dispositivo.
Errores típicos
- Olvidar la etiqueta viewport: en el ordenador todo funciona, en el móvil no.
- Anchos fijos en píxeles (
width: 800px) que obligan a desplazarse en horizontal en el móvil. - Imágenes sin
max-width: 100%que se salen de la pantalla. - Olvidar una llave al cerrar la media query: todo lo que viene después deja de funcionar.
- Escribir la condición sin paréntesis:
@media min-width: 768pxno funciona; es@media (min-width: 768px). - Mezclar
min-widthymax-widthsin orden y que unas reglas pisen a otras. Elige mobile first y usamin-width.
Ejercicios
Ejercicio 1: la galería adaptable (fácil)
Haz que estas cajas estén en una columna en el móvil, en dos a partir de 500px y en cuatro a partir de 800px.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
El CSS base ya es la versión móvil. Añade dos media queries con min-width que cambien grid-template-columns.
Solución
@media (min-width: 500px) {
.galeria {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 800px) {
.galeria {
grid-template-columns: repeat(4, 1fr);
}
}
Ejercicio 2: texto más grande en el ordenador (fácil)
El título mide 1.75rem en el móvil. Haz que mida 3rem a partir de 768px, y que el párrafo pase de 1rem a 1.25rem.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
Una sola media query puede contener varias reglas.
Solución
@media (min-width: 768px) {
h1 {
font-size: 3rem;
}
p {
font-size: 1.25rem;
}
}
Ejercicio 3: contenido con barra lateral (reto)
En el móvil, el artículo y la barra lateral van uno debajo del otro. A partir de 900px, deben ir lado a lado: el artículo con 3fr y la barra con 1fr.
Tab añade una sangría. Pulsa Escape y luego Tab para salir del editor.
Pista
Usa Grid en .pagina con gap en el CSS base (una columna) y define las dos columnas dentro de la media query.
Solución
.pagina {
display: grid;
gap: 16px;
}
@media (min-width: 900px) {
.pagina {
grid-template-columns: 3fr 1fr;
}
}
Ficha resumen
- Responsive = una sola web que se adapta a cualquier pantalla.
- Siempre la etiqueta viewport en el
<head>. - Base flexible:
box-sizing: border-box,img { max-width: 100%; height: auto; }, contenedores conmax-width. - Mobile first: CSS para el móvil y
@media (min-width: …)para pantallas mayores. - Puntos de ruptura donde tu diseño lo necesite (de partida, 768px y 1024px).
- Prueba con el modo dispositivo de las DevTools (Ctrl + Mayús + M).
Glosario
| Término | Definición |
|---|---|
| Diseño responsive | Diseño que se adapta al tamaño de la pantalla en la que se ve la página. |
| Viewport | Zona de la ventana del navegador en la que se ve la página. |
| Media query | Bloque de CSS que solo se aplica si la pantalla cumple una condición, como un ancho mínimo. |
| Mobile first | Forma de trabajar que escribe primero el CSS del móvil y añade cambios para pantallas grandes. |
| Punto de ruptura | Ancho de pantalla en el que el diseño cambia mediante una media query (breakpoint). |
| Imagen fluida | Imagen que se encoge con su contenedor gracias a max-width: 100%. |