Apuntes DAM
Tema 2 de 7DIW · 2º DAW

Diseño de Interfaces Web

Maquetación con Flexbox, Grid y Responsive

Cascada y especificidad, modelo de caja y unidades, Flexbox, CSS Grid, diseño adaptable mobile first con media queries, container queries y clamp, con retos de CSS que miden el resultado.

70 min lecturaIntermedio

1. Cómo decide el navegador qué estilo aplicar

Es frecuente que dos reglas CSS digan cosas distintas del mismo elemento: una pone el título en azul y otra en rojo. Entender cómo resuelve el navegador esos conflictos es lo que separa escribir CSS a base de prueba y error de escribirlo con intención. El algoritmo se llama cascada y tiene en cuenta, por este orden, el origen y la importancia de la regla, su especificidad y, si empatan, cuál aparece la última.

SelectorEspecificidadEjemplo
Estilo en línea (style="…")1, 0, 0, 0<p style="color:red">
Identificador0, 1, 0, 0#portada
Clase, atributo, pseudoclase0, 0, 1, 0.destacado, [type=email], :hover
Elemento, pseudoelemento0, 0, 0, 1p, ::before
Selector universal0, 0, 0, 0*

La especificidad se compara columna a columna: una sola clase gana a cualquier número de elementos. Por eso las guías modernas recomiendan estilar casi todo con clases, que tienen una especificidad baja y uniforme, y evitar los identificadores y el !important: cada vez que uno de ellos gana una batalla, la siguiente regla necesitará algo todavía más fuerte, y la hoja de estilos se convierte en una carrera armamentística.

2. El modelo de caja y las unidades

Para el navegador, cada elemento es una caja formada por el contenido, el relleno (padding), el borde y el margen. Por defecto, width mide solo el contenido, así que una caja de 300px con 20px de relleno ocupa en realidad 340px. Casi todos los proyectos empiezan con la misma regla para que el ancho incluya relleno y borde, que es lo que uno espera:

css
1*, *::before, *::after { box-sizing: border-box; }
UnidadRelativa aÚsala para
pxNada: es fijaBordes y detalles finos
remEl tamaño de letra de la raíz (normalmente 16px)Tamaños de texto, espaciados: respeta la configuración del usuario
emEl tamaño de letra del propio elementoRelleno de botones que crece con su texto
%El tamaño del contenedorAnchos relativos
vw / vh / dvhEl ancho / alto de la ventanaSecciones a pantalla completa (dvh tiene en cuenta las barras del móvil)
frEl espacio libre de una rejillaColumnas de CSS Grid
chEl ancho del carácter «0»Limitar la longitud de las líneas de texto (60-75ch)

3. Flexbox: colocar en una dimensión

Flexbox coloca elementos en una fila o una columna y reparte entre ellos el espacio sobrante. Es la herramienta ideal para las piezas de una interfaz: una barra de navegación, los botones de un formulario, una tarjeta con su imagen y su texto. Todo gira en torno a dos ejes: el principal, que marca flex-direction, y el cruzado, perpendicular a él.

Flexbox es una estantería con los libros en fila

justify-content
Cómo se reparten los libros a lo largo de la balda: juntos al principio, al final, centrados o separados.
align-items
Cómo se colocan en altura: apoyados abajo, colgando arriba, centrados o estirados.
flex-wrap
Si no caben, pasan a la balda de abajo en lugar de apretarse.
css
1.barra {
2  display: flex;
3  justify-content: space-between;   /* eje principal: logo a un lado, menú al otro */
4  align-items: center;              /* eje cruzado: centrados en vertical */
5  gap: 1rem;                        /* separación entre elementos */
6  flex-wrap: wrap;                  /* si no caben, a la línea siguiente */
7}
8
9.buscador { flex: 1; }              /* ocupa todo el espacio que sobre */
Aprende CSS Flexbox en 15 Minutos — Victor Robles WEB

4. CSS Grid: colocar en dos dimensiones

Grid trabaja con filas y columnas a la vez, como una tabla invisible sobre la que colocas los elementos. Es la herramienta para la estructura de la página (cabecera, barra lateral, contenido, pie) y para cualquier colección de elementos en rejilla. La regla práctica: Flexbox para alinear piezas dentro de un componente, Grid para el esqueleto y las rejillas.

css
1.pagina {
2  display: grid;
3  grid-template-columns: 250px 1fr;
4  grid-template-areas:
5    "cabecera cabecera"
6    "lateral  contenido"
7    "pie      pie";
8  gap: 1.5rem;
9  min-height: 100dvh;
10}
11.pagina > header { grid-area: cabecera; }
12.pagina > aside  { grid-area: lateral; }
13
14/* Una rejilla que decide sola cuántas columnas caben (mínimo 220px cada una) */
15.productos {
16  display: grid;
17  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
18  gap: 1rem;
19}

La última regla es de las más útiles de CSS: repeat(auto-fill, minmax(220px, 1fr)) crea tantas columnas de al menos 220px como quepan y reparte el resto del espacio entre ellas. La rejilla se adapta a cualquier pantalla sin una sola media query.

Juega con Grid
Consola
(sin mensajes)
CSS Grid vs Flexbox - Cuando usar uno u otro. — FalconMasters

5. Diseño adaptable (responsive)

Más de la mitad de las visitas a una web llegan desde el móvil, y Google indexa la versión móvil de las páginas. Diseñar de forma adaptable significa que una misma página se reorganiza para verse bien en cualquier tamaño de pantalla. Descansa en cuatro ideas:

  1. La etiqueta <meta name="viewport" content="width=device-width, initial-scale=1">, sin la cual el móvil simula una pantalla de escritorio y lo encoge todo.
  2. Mobile first: los estilos base son para el móvil y las media queries con min-width añaden cambios para pantallas mayores. Es más fácil ampliar un diseño sencillo que recortar uno complejo.
  3. Puntos de ruptura según el contenido, no según modelos de teléfono: añade una media query donde el diseño empiece a verse mal.
  4. Medidas fluidas: porcentajes, fr, max-width: 100% en las imágenes y clamp() para textos que crecen con la pantalla.
css
1h1 { font-size: clamp(1.75rem, 1rem + 3vw, 3rem); }   /* mínimo, ideal y máximo */
2img { max-width: 100%; height: auto; }
3
4.tarjeta { display: grid; gap: 1rem; }
5@media (min-width: 40rem) {
6  .tarjeta { grid-template-columns: 200px 1fr; }       /* imagen al lado del texto */
7}
8
9/* Container queries: el componente se adapta a su contenedor, no a la pantalla */
10.lateral { container-type: inline-size; }
11@container (min-width: 30rem) {
12  .tarjeta { grid-template-columns: 1fr 2fr; }
13}

Prueba en dispositivos reales

El modo de dispositivo de las DevTools (Ctrl + Mayús + M) es muy útil, pero no sustituye a probar en un móvil de verdad: el tamaño del dedo, la luz del sol o una conexión lenta cambian mucho la experiencia.

6. Retos de maquetación

En estos retos editas el CSS. Las pruebas miden dónde queda cada elemento, y en los retos adaptables también comprueban cómo se ve la página a 375px (un móvil) y a 1000px.

Retos

CSSCentrar de verdadFácil

Centra .caja en horizontal y en vertical dentro de .contenedor usando Flexbox, sin márgenes ni posiciones calculadas a mano.

index.htmlsolo lectura
estilos.css
Vista previa
CSSUna galería con GridMedio

Coloca las fotos de .galeria en tres columnas del mismo ancho que ocupen todo el espacio disponible, con 16px de separación entre filas y columnas. Usa CSS Grid.

index.htmlsolo lectura
estilos.css
Vista previa
CSSTarjetas que se adaptanMedio

Diseña las tarjetas pensando primero en el móvil: una columna por defecto, dos columnas a partir de 600px de ancho y tres a partir de 900px, siempre con 16px de separación.

index.htmlsolo lectura
estilos.css
Vista previa
CSSUna cabecera adaptableDifícil

En pantallas de 600px o más, el logo va a la izquierda y el menú a la derecha, en la misma línea y centrados en vertical; los enlaces del menú, en fila con 24px de separación. En pantallas más estrechas, el menú pasa debajo del logo. Usa Flexbox.

index.htmlsolo lectura
estilos.css
Vista previa

¿Has terminado este tema?

Crea una cuenta gratis para guardar qué temas has terminado, subir de nivel y ganar medallas.

Guardar mi progreso