Dónde se coloca cada bloque, y cómo se reacomoda todo cuando la pantalla cambia de tamaño.
Unidad 2 · Herramientas tecnológicas
Qué hace cada tecnología del navegador.
Etiquetas, atributos y el documento.
Selectores, cascada y modelo de caja.
Retícula y adaptación a la pantalla.
Objetivos
Reconocer cuándo un problema de acomodo es de una dimensión y cuándo de dos.
Armar una retícula con Grid y una fila flexible con Flexbox, sin recurrir a medidas fijas.
Definir puntos de quiebre a partir del contenido y no del catálogo de dispositivos.
Por qué hace falta otra herramienta
Un documento sin instrucciones de acomodo coloca cada bloque debajo del anterior y cada texto a continuación del anterior. Sirve para leer de corrido, que es para lo que se diseñó la web.
En cuanto se pide una fila de tarjetas del mismo alto, o una barra con el logotipo a la izquierda y el menú pegado a la derecha, el flujo normal deja de alcanzar. Durante años eso se resolvió con float y tablas invisibles: técnicas prestadas de otra cosa, que funcionaban a medias y se rompían en cuanto el contenido crecía.
La decisión, antes que el catálogo
Reparte a lo largo de una sola línea, horizontal o vertical. Los elementos deciden su tamaño según su contenido y el espacio que sobra.
Barras, filas de botones, listas de etiquetas, tarjetas que deben quedar del mismo alto.
Define filas y columnas a la vez. La plantilla existe antes que el contenido, y cada pieza se coloca en su celda.
Galerías, portadas, plantillas de página, cualquier acomodo donde importe la alineación vertical y la horizontal.
Flexbox · cómo empieza
La propiedad se declara en el contenedor, y a partir de ahí sus hijos directos dejan de comportarse como bloques y pasan a ser elementos flexibles.
.barra {
display: flex;
}
El cambio no alcanza a los nietos: cada nivel que quiera repartir a sus hijos necesita su propia declaración.
display: block
display: flex
Flexbox · de dónde salen los nombres
Las dos direcciones de Flexbox se llaman eje principal —aquella en que se colocan los elementos— y eje cruzado, el perpendicular. Nunca horizontal y vertical.
La propiedad flex-direction decide cuál es cuál. Con row el principal es horizontal; con column pasa a ser vertical, y todas las demás propiedades cambian de significado con él.
De ahí que las propiedades no se llamen «alinear a la izquierda» sino justify-content y align-items: los nombres son independientes de la orientación.
Flexbox · eje principal
flex-startcenterspace-betweenspace-aroundspace-evenlyFlexbox · eje cruzado
| Valor | Qué hace |
|---|---|
| stretch | Estira cada elemento hasta el alto del más alto. Valor por omisión, y la razón de que las tarjetas queden parejas sin pedirlo. |
| flex-start | Los alinea por su borde inicial. |
| center | Los centra en el eje cruzado. |
| baseline | Alinea la primera línea de texto de cada uno, aunque las cajas midan distinto. |
Las cajas tienen alturas distintas; lo que queda alineado es el renglón, no el borde.
Laboratorio 1
justify-content · eje principal
align-items · eje cruzado
.barra {
display: flex;
justify-content: flex-start;
align-items: stretch;
}
Flexbox · el tamaño de cada pieza
Cuánto del espacio libre reclama esta pieza. Con 0 no crece; con 1 toma su parte; con 2 toma el doble que sus vecinos de valor 1.
Cuánto cede cuando falta espacio. Con 0 se niega a encoger, y ahí es donde aparecen los desbordes.
El tamaño de partida antes de repartir sobrante o faltante. Con auto lo decide el contenido.
.pieza {
flex: 1 1 240px;
}
La taquigrafía de las tres, en ese orden: crecer, encoger, base.
Flexbox · cuando ya no caben
Por omisión, un contenedor flexible obliga a todo a caber en una línea: encoge las piezas hasta donde puede y, si aun así no alcanza, desborda. Con flex-wrap: wrap pasa a formar líneas nuevas.
.tarjetas {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.tarjetas > * {
flex: 1 1 260px;
}
Esas cuatro líneas producen una galería que cambia de una a cuatro columnas por sí sola, sin una sola consulta de medios.
Flexbox · dónde rinde
Logotipo a un lado, navegación al otro, con space-between y sin una sola medida fija.
Alturas iguales aunque el texto no lo sea, gracias a stretch.
Una tarjeta en columna con margin-top:auto en el botón lo empuja al pie, mida lo que mida el texto de arriba.
Listas de temas o filtros que forman las líneas que hagan falta.
Grid · la plantilla primero
Con Grid la estructura se declara completa desde el contenedor: cuántas columnas, de qué anchos, y cuántas filas. El contenido llega después y se acomoda en las celdas que ya existen.
.galeria {
display: grid;
grid-template-columns: 240px 240px 240px;
grid-template-rows: 180px 180px;
gap: 16px;
}
Escrita así, con medidas fijas, la retícula funciona en una pantalla y se rompe en las demás. Las tres láminas siguientes sustituyen cada número por algo que sabe adaptarse.
Grid · la medida propia del sistema
La unidad fr fracción · fraction reparte el espacio que queda después de descontar huecos y medidas fijas. Un porcentaje, en cambio, se calcula sobre el ancho total e ignora los huecos, así que la suma se pasa y la retícula desborda.
grid-template-columns: 2fr 1fr 1fr;
La primera columna recibe el doble que cada una de las otras dos, sea cual sea el ancho de la ventana.
Arriba, los huecos se suman al 99 % y la última columna se sale. Abajo, se descuentan antes de repartir.
Grid · la línea que más rinde
grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
Evita escribir la misma medida muchas veces. El primer argumento es cuántas, el segundo qué ancho.
Fija un mínimo y un máximo. Aquí: nunca por debajo de 260 px, y si sobra espacio que lo repartan.
Sustituye el número de columnas por «las que quepan». El navegador hace la cuenta en cada tamaño.
Laboratorio 2
.galeria {
display: grid;
grid-template-columns:
repeat(auto-fit, minmax(260px, 1fr));
gap: 16px;
}
Columnas visibles: 3
Grid · situar una pieza concreta
Una retícula de tres columnas tiene cuatro líneas verticales. Un elemento se coloca diciendo entre qué líneas empieza y acaba.
.destacado {
grid-column: 1 / 3; /* de la línea 1 a la 3 */
grid-row: 1 / 2;
}
.pie {
grid-column: 1 / -1; /* de la primera a la última */
}
El número negativo cuenta desde el final, así que -1 significa «hasta el borde» sin necesidad de saber cuántas columnas hay. Sirve para el encabezado y el pie de cualquier plantilla.
También existe span: grid-column: span 2 ocupa dos columnas desde donde le toque, sin fijar cuáles.
Grid · la plantilla dibujada
.pagina {
display: grid;
grid-template-columns: 220px 1fr;
grid-template-areas:
"cabecera cabecera"
"menu obra"
"pie pie";
}
.cabecera { grid-area: cabecera; }
.menu { grid-area: menu; }
.obra { grid-area: obra; }
.pie { grid-area: pie; }
Un punto en lugar de un nombre —"cabecera ."— deja esa celda deliberadamente vacía.
Grid · el ajuste fino
| Propiedad | Sobre qué actúa | Para qué se usa |
|---|---|---|
| gap | Separación entre filas y columnas | Admite un valor o dos: gap: 24px 16px son filas y columnas por separado. |
| justify-items | Cada pieza, dentro de su celda, en horizontal | Con start las piezas dejan de estirarse y toman el ancho de su contenido. |
| align-items | Cada pieza, dentro de su celda, en vertical | El mismo nombre que en Flexbox y el mismo comportamiento. |
| justify-content | La retícula entera dentro del contenedor | Solo se nota cuando las columnas miden menos que el espacio disponible. |
| place-items | Las dos primeras a la vez | place-items: center centra todo en ambos ejes. |
Grid · lo que no cabía en la plantilla
Una plantilla de dos filas con diez piezas dentro no deja ocho fuera: el navegador crea las filas que hagan falta. Esas filas nuevas son la retícula implícita, y por omisión miden lo que mida su contenido.
.galeria {
grid-auto-rows: 200px;
grid-auto-flow: dense;
}
grid-auto-rows les da una altura pareja. grid-auto-flow: dense permite que una pieza pequeña retroceda a rellenar un hueco anterior, a costa de alterar el orden visual respecto al del documento.
Las dos últimas caen en una fila que la plantilla no declaró.
La decisión, con casos
| Situación | Herramienta | Razón |
|---|---|---|
| Barra de navegación | Flexbox | Una línea, y las piezas miden lo que su texto. |
| Galería de proyectos | Grid | Importa que las columnas coincidan entre filas. |
| Tarjeta por dentro | Flexbox | Apilar en columna y empujar el botón al pie. |
| Plantilla de la página | Grid | Cabecera, lateral, contenido y pie se sitúan de una vez. |
| Fila de etiquetas | Flexbox | Anchos irregulares que envuelven cuando toca. |
| Formulario de dos columnas | Grid | Las etiquetas quedan alineadas entre filas. |
Diseño adaptable
Diseño adaptable responsive web design nombra la práctica de servir el mismo HTML a cualquier dispositivo y dejar que la presentación se reorganice según el espacio disponible.
La alternativa histórica fue mantener un sitio aparte para teléfonos, con su dirección y su contenido propios. Duplicaba el trabajo y siempre acababa desactualizado respecto al principal.
<meta name="viewport"
content="width=device-width,
initial-scale=1">
Sin ella, un teléfono finge medir 980 px y luego reduce la página entera, con letra ilegible. Ninguna consulta de medios se activa, porque el navegador cree estar en una pantalla ancha.
Diseño adaptable · la herramienta
/* estilos de la pantalla estrecha */
.galeria { grid-template-columns: 1fr; }
@media (min-width: 700px) {
.galeria { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1100px) {
.galeria { grid-template-columns: repeat(3, 1fr); }
}
Con min-width las reglas se suman conforme la pantalla crece, y cada bloque solo escribe lo que cambia respecto al anterior.
| Condición | Cuándo se cumple |
|---|---|
| min-width | A partir de ese ancho. La base del enfoque móvil primero. |
| max-width | Hasta ese ancho. Útil para excepciones puntuales. |
| orientation | Vertical u horizontal, comparando alto y ancho. |
| prefers-color-scheme | Cuando el sistema pide modo claro u oscuro. |
| prefers-reduced-motion | Cuando se han desactivado las animaciones. |
Las dos últimas consultan una preferencia que la persona ya declaró en su sistema. Atenderlas es parte de la accesibilidad.
Diseño adaptable · el criterio
Copiar los anchos de los dispositivos de moda produce una lista que envejece cada temporada y que nunca coincide con el momento en que el diseño deja de funcionar.
El método que aguanta: reducir la ventana poco a poco y anotar el ancho exacto en que algo se estropea —una línea de texto queda demasiado larga, dos columnas se estrechan hasta partir palabras, una imagen se vuelve una franja—. Ese ancho es el punto de quiebre, y sale del contenido.
Una línea de texto cómoda tiene entre 45 y 75 caracteres. Al ensanchar la ventana, un párrafo a todo lo ancho supera los 100 y la lectura se vuelve incómoda: el ojo pierde el renglón al volver.
El punto de quiebre no lo marca ahí ningún dispositivo, sino la medida de la línea. Suele aparecer bastante antes de lo que se espera.
.texto { max-width: 65ch; }
A veces ni siquiera hace falta la consulta: basta con poner un techo.
Diseño adaptable · sin consultas
Mínimo, valor preferido y máximo. El valor de en medio suele llevar unidades de ventana para que crezca con ella.
Eligen entre varios valores en cada momento. width: min(100%, 640px) es un ancho máximo que nunca desborda.
vw y vh son porcentajes del ancho y el alto visibles. En un teléfono conviene dvh, que descuenta la barra del navegador.
Un ch mide lo que el cero de la tipografía en uso, así que max-width: 65ch fija la medida de línea sin depender del tamaño.
h1 { font-size: clamp(28px, 5vw, 64px); }
Nunca menor de 28 px ni mayor de 64, y entre medias proporcional a la ventana. Una sola línea sustituye tres consultas de medios.
Laboratorio 3
Los puntos de quiebre de esta maqueta están en 600 y 900 px, elegidos por donde el texto y las tarjetas dejaban de funcionar.
Diseño adaptable · el elemento que más rompe
Impide que una imagen sea más ancha que su contenedor. Acompañada de height: auto conserva la proporción.
Recorta la imagen para llenar la caja sin deformarla. Con contain cabe entera y deja franjas.
Reserva la proporción antes de que la imagen cargue, así el resto de la página no salta al aparecer.
Decide qué parte sobrevive al recorte. En un retrato, top evita que cover se lleve la cabeza.
.pieza img {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
}
Lo que aparece al revisar entregas
| Lo que se ve | Qué lo provoca |
|---|---|
| Una barra horizontal que no debería estar | Un elemento con ancho fijo dentro de un contenedor flexible que no puede encoger. Suele bastar con min-width: 0. |
| La retícula ignora grid-template-columns | Falta display: grid, o se declaró en el elemento equivocado: va en el contenedor, no en las piezas. |
| Las columnas de porcentaje desbordan | El gap se suma al 100 %. Con fr el hueco se descuenta antes de repartir. |
| La consulta de medios no se activa | Falta la etiqueta viewport, o la regla se escribió antes de la que pretende sustituir y pierde por orden. |
| Las tarjetas quedan de alturas distintas | Se cambió align-items a un valor que no es stretch, que era el que las emparejaba. |
Actividad evaluable
Partir del documento HTML y la hoja de estilos de la sesión anterior, y resolver su acomodo completo. Entregar los dos archivos y tres capturas: a 360, 768 y 1280 px de ancho.
| Criterio | Puntos |
|---|---|
| Elección adecuada entre Flexbox y Grid en cada zona | 25 |
| La maqueta resiste de 320 px a 1400 sin desbordes ni solapes | 25 |
| Punto de quiebre justificado por el contenido | 20 |
| Imágenes con proporción reservada y sin deformar | 15 |
| Hoja legible: nombres claros y sin reglas repetidas | 15 |
Fin del subtema 2.4
Estructura, presentación y acomodo quedan resueltos. Lo que sigue es hacer que la página responda a quien la usa.
Esta presentación está pensada para pantalla horizontal.
CSS: selectores, cascada y modelo de caja