Herramientas tecnológicas para el diseño y desarrollo

Maquetación:
Flexbox, Grid
y diseño adaptable

Dónde se coloca cada bloque, y cómo se reacomoda todo cuando la pantalla cambia de tamaño.

Unidad2.4
TemaHerramientas tecnológicas
DocenteL.D.G. Luis E. Maldonado Gil
FacultadFAD · UAEMéx

Unidad 2 · Herramientas tecnológicas

De la apariencia a la estructura

2.1

Panorama

Qué hace cada tecnología del navegador.

2.2

HTML

Etiquetas, atributos y el documento.

2.3

CSS

Selectores, cascada y modelo de caja.

2.4

Maquetación

Retícula y adaptación a la pantalla.

Punto de partida La sesión anterior dejó resuelto cómo se ve cada elemento por separado: color, tipografía, espacio y caja. Lo que falta es la relación entre ellos.

Objetivos

Al terminar la sesión

01

Distinguir

Reconocer cuándo un problema de acomodo es de una dimensión y cuándo de dos.

02

Construir

Armar una retícula con Grid y una fila flexible con Flexbox, sin recurrir a medidas fijas.

03

Adaptar

Definir puntos de quiebre a partir del contenido y no del catálogo de dispositivos.

Por qué hace falta otra herramienta

El flujo normal solo sabe apilar

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.

Lo que cambió Flexbox y Grid son los dos primeros sistemas del lenguaje pensados desde el principio para acomodar, no adaptados de otro uso.
Sin sistema de acomodo
Logotipo
Trabajo
Contacto
Proyecto destacado
Proyecto

La decisión, antes que el catálogo

Una dimensión o dos

↔

Flexbox Caja flexible · flexible box layout

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.

⊞

Grid Retícula · grid layout

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.

En la práctica Casi ninguna página usa solo uno. La estructura general suele ser una retícula, y dentro de cada zona hay filas flexibles.

Flexbox · cómo empieza

Una declaración cambia el trato

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.

Reparto de propiedades Unas viven en el contenedor —cómo se reparte el conjunto— y otras en cada hijo —cómo se comporta esa pieza—. Confundirlas es el error más común al empezar.
Antes y después

display: block

A
B
C

display: flex

A
B
C

Flexbox · de dónde salen los nombres

Dos ejes, no izquierda y arriba

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.

eje principal · justify-content
eje cruzado · align-items
Con flex-direction: column Los dos ejes intercambian su orientación, y las mismas dos propiedades siguen funcionando sin cambiar de nombre.

Flexbox · eje principal

justify-content

flex-start
Todo al inicio. Es el valor por omisión.
center
El grupo al centro, el sobrante repartido a los lados.
space-between
Primero y último pegados al borde; el hueco, entre ellos.
space-around
Cada elemento con el mismo margen propio, que se suma entre vecinos.
space-evenly
Todos los huecos iguales, incluidos los de los extremos.
La distinción que se pregunta en examen space-around y space-evenly parecen lo mismo hasta que se miran los extremos: en el primero, el margen del borde es la mitad del que hay entre piezas.

Flexbox · eje cruzado

align-items y la excepción de cada pieza

ValorQué hace
stretchEstira 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-startLos alinea por su borde inicial.
centerLos centra en el eje cruzado.
baselineAlinea la primera línea de texto de cada uno, aunque las cajas midan distinto.
align-self Se declara en un hijo concreto y le permite salirse de la alineación del grupo. Útil para el elemento que debe quedar abajo mientras el resto se centra.
baseline, que cuesta ver descrito
Aa
Aa
Aa
Aa

Las cajas tienen alturas distintas; lo que queda alineado es el renglón, no el borde.

Laboratorio 1

Las dos propiedades, sobre el mismo grupo

justify-content · eje principal

align-items · eje cruzado

.barra {
  display: flex;
  justify-content: flex-start;
  align-items: stretch;
}
Resultado
Trabajo
Estudio
y equipo
Contacto
Tienda

Flexbox · el tamaño de cada pieza

Qué hace cada elemento con el sobrante

↗

flex-grow

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.

↙

flex-shrink

Cuánto cede cuando falta espacio. Con 0 se niega a encoger, y ahí es donde aparecen los desbordes.

▭

flex-basis

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.

Las abreviaturas que se ven en código ajeno flex: 1 equivale a 1 1 0, y reparte el espacio en partes iguales ignorando el contenido. flex: auto es 1 1 auto, y sí lo tiene en cuenta. La diferencia se nota cuando un texto es mucho más largo que los demás.

Flexbox · cuando ya no caben

flex-wrap y gap

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.

gap, y por qué se agradece Antes de existir, la separación se hacía con márgenes y había que quitarle el suyo al primero y al último de cada línea. Con gap el hueco solo aparece entre piezas, nunca en los bordes.
La base como punto de quiebre El valor de flex-basis decide cuándo salta la línea. Ese número es, en la práctica, un punto de quiebre escrito en el propio componente en vez de en una consulta de medios.

Flexbox · dónde rinde

Cuatro usos que aparecen en casi todo sitio

01

La barra superior

Logotipo a un lado, navegación al otro, con space-between y sin una sola medida fija.

02

Tarjetas parejas

Alturas iguales aunque el texto no lo sea, gracias a stretch.

03

El botón al fondo

Una tarjeta en columna con margin-top:auto en el botón lo empuja al pie, mida lo que mida el texto de arriba.

04

Etiquetas que envuelven

Listas de temas o filtros que forman las líneas que hagan falta.

El truco del margen automático Un margin: auto dentro de un contenedor flexible se come todo el espacio libre de ese lado. Sirve para separar un elemento del resto sin envolverlo en otra caja.

Grid · la plantilla primero

Dibujar el tablero antes de repartir

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.

Tres columnas, dos filas
123456

Grid · la medida propia del sistema

fr: una parte del sobrante

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.

Se pueden mezclar grid-template-columns: 260px 1fr deja una barra lateral fija y da todo lo demás al contenido. Es la plantilla de documentación más repetida de la web.
Con porcentajes: 33% · 33% · 33% y gap
33%33%33%
Con fracciones: 1fr · 1fr · 1fr y gap
1fr1fr1fr

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

Una retícula que se reacomoda sola

grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
R

repeat()

Evita escribir la misma medida muchas veces. El primer argumento es cuántas, el segundo qué ancho.

M

minmax()

Fija un mínimo y un máximo. Aquí: nunca por debajo de 260 px, y si sobra espacio que lo repartan.

A

auto-fit

Sustituye el número de columnas por «las que quepan». El navegador hace la cuenta en cada tamaño.

auto-fit y auto-fill Se diferencian solo cuando hay menos piezas que columnas posibles: auto-fit colapsa las columnas vacías y deja que el contenido se estire; auto-fill las conserva y aparecen huecos al final de la línea.

Laboratorio 2

La misma línea, con otros números

.galeria {
  display: grid;
  grid-template-columns:
    repeat(auto-fit, minmax(260px, 1fr));
  gap: 16px;
}

Columnas visibles: 3

Estudio Ocre · proyectos
CauceAireNubeVeraSitioBruma

Grid · situar una pieza concreta

Las líneas se numeran, y también se cuentan al revés

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.

Las líneas, numeradas
1234
grid-column: 1 / 3
3
4
5
6
grid-column: 1 / -1

Grid · la plantilla dibujada

La retícula se lee en el propio código

.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; }
Lo que produce
cabecera
menu
obra
pie
Por qué se usa Reacomodar la página para una pantalla estrecha se reduce a reescribir esas tres líneas de texto. No hay que tocar ninguna de las reglas de los hijos.

Un punto en lugar de un nombre —"cabecera ."— deja esa celda deliberadamente vacía.

Grid · el ajuste fino

Alinear dentro de la celda y la retícula dentro del contenedor

PropiedadSobre qué actúaPara qué se usa
gapSeparación entre filas y columnasAdmite un valor o dos: gap: 24px 16px son filas y columnas por separado.
justify-itemsCada pieza, dentro de su celda, en horizontalCon start las piezas dejan de estirarse y toman el ancho de su contenido.
align-itemsCada pieza, dentro de su celda, en verticalEl mismo nombre que en Flexbox y el mismo comportamiento.
justify-contentLa retícula entera dentro del contenedorSolo se nota cuando las columnas miden menos que el espacio disponible.
place-itemsLas dos primeras a la vezplace-items: center centra todo en ambos ejes.
La confusión frecuente justify-items mueve el contenido dentro de las celdas; justify-content mueve el conjunto de celdas. Cuando una retícula «no se centra», casi siempre se está usando la primera esperando el efecto de la segunda.

Grid · lo que no cabía en la plantilla

Las filas que el navegador inventa

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.

Con cuidado dense separa el orden que se ve del orden que se lee. Quien navegue con teclado o lector de pantalla seguirá el del documento, así que conviene reservarlo para galerías sin secuencia.
Plantilla de 2 filas, ocho piezas
123 456 78

Las dos últimas caen en una fila que la plantilla no declaró.

La decisión, con casos

Cuál de los dos, y por qué

SituaciónHerramientaRazón
Barra de navegaciónFlexboxUna línea, y las piezas miden lo que su texto.
Galería de proyectosGridImporta que las columnas coincidan entre filas.
Tarjeta por dentroFlexboxApilar en columna y empujar el botón al pie.
Plantilla de la páginaGridCabecera, lateral, contenido y pie se sitúan de una vez.
Fila de etiquetasFlexboxAnchos irregulares que envuelven cuando toca.
Formulario de dos columnasGridLas etiquetas quedan alineadas entre filas.
La pregunta que resuelve casi todos los casos Si al describir el acomodo aparece la palabra «y» entre dos direcciones —columnas y filas alineadas—, es Grid. Si basta con una, Flexbox llega antes y con menos código.

Diseño adaptable

Un solo documento para pantallas que no se parecen

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.

Móvil primero Escribir primero los estilos de la pantalla estrecha y añadir después los de las anchas. La versión reducida es la que más restricciones tiene: resolverla primero obliga a decidir qué es imprescindible.
La etiqueta sin la cual nada funciona
<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

@media

/* 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ónCuándo se cumple
min-widthA partir de ese ancho. La base del enfoque móvil primero.
max-widthHasta ese ancho. Útil para excepciones puntuales.
orientationVertical u horizontal, comparando alto y ancho.
prefers-color-schemeCuando el sistema pide modo claro u oscuro.
prefers-reduced-motionCuando 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

El ancho lo marca el contenido

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.

Cuántos hacen falta Casi ningún sitio necesita más de tres. Una lista larga de puntos de quiebre suele indicar que el problema estaba en el componente y se está parcheando desde fuera.

El caso que se repite

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

Funciones que hacen la cuenta por su cuenta

c

clamp()

Mínimo, valor preferido y máximo. El valor de en medio suele llevar unidades de ventana para que crezca con ella.

m

min() y max()

Eligen entre varios valores en cada momento. width: min(100%, 640px) es un ancho máximo que nunca desborda.

v

Unidades de ventana

vw y vh son porcentajes del ancho y el alto visibles. En un teléfono conviene dvh, que descuenta la barra del navegador.

ch

La unidad ch

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.

Dónde sigue haciendo falta @media Estas funciones ajustan tamaños. Cuando lo que debe cambiar es la estructura —de dos columnas a una, o un menú que se pliega—, la consulta de medios sigue siendo la herramienta.

Laboratorio 3

El mismo documento, a cinco anchos

Tres columnas Por encima de 900 px caben las tres piezas en una fila y la barra mantiene el menú a la derecha.

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.

estudioocre.mx960 px

Diseño adaptable · el elemento que más rompe

Tres propiedades para las imágenes

max-width: 100%

Impide que una imagen sea más ancha que su contenedor. Acompañada de height: auto conserva la proporción.

object-fit: cover

Recorta la imagen para llenar la caja sin deformarla. Con contain cabe entera y deja franjas.

aspect-ratio

Reserva la proporción antes de que la imagen cargue, así el resto de la página no salta al aparecer.

object-position

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;
}
El salto de contenido Sin proporción reservada, el navegador da a la imagen alto cero hasta descargarla y luego empuja todo hacia abajo. Quien estuviera leyendo pierde el punto, y quien fuera a pulsar un enlace acaba en otro.

Lo que aparece al revisar entregas

Cinco tropiezos y su causa

Lo que se veQué lo provoca
Una barra horizontal que no debería estarUn 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-columnsFalta display: grid, o se declaró en el elemento equivocado: va en el contenedor, no en las piezas.
Las columnas de porcentaje desbordanEl gap se suma al 100 %. Con fr el hueco se descuenta antes de repartir.
La consulta de medios no se activaFalta la etiqueta viewport, o la regla se escribió antes de la que pretende sustituir y pierde por orden.
Las tarjetas quedan de alturas distintasSe cambió align-items a un valor que no es stretch, que era el que las emparejaba.

Actividad evaluable

Maquetar el portafolio de Estudio Ocre

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.

Requisitos

  • La barra superior con Flexbox, con el logotipo separado de la navegación sin medidas fijas.
  • La galería de proyectos con Grid, adaptable sin consultas de medios.
  • La plantilla general con áreas nombradas, reordenada en pantalla estrecha.
  • Al menos un punto de quiebre, justificado por escrito a partir del contenido.
  • Todas las imágenes con proporción reservada.
CriterioPuntos
Elección adecuada entre Flexbox y Grid en cada zona25
La maqueta resiste de 320 px a 1400 sin desbordes ni solapes25
Punto de quiebre justificado por el contenido20
Imágenes con proporción reservada y sin deformar15
Hoja legible: nombres claros y sin reglas repetidas15
Entrega Archivos index.html y estilos.css, más un documento breve con las capturas y la justificación del punto de quiebre.

Fin del subtema 2.4

La página ya sabe reacomodarse

Estructura, presentación y acomodo quedan resueltos. Lo que sigue es hacer que la página responda a quien la usa.

Siguiente tema Comportamiento: JavaScript en el navegador, eventos y manipulación del documento.

Fuentes de consulta

  • MDN Web Docs · Guías de CSS: Flexbox y Grid. Mozilla, consulta 2026.
  • Rachel Andrew, The New CSS Layout. A Book Apart, 2017.
  • Ethan Marcotte, Responsive Web Design. 2.ª ed. A Book Apart, 2014.
  • W3C · CSS Grid Layout Module Level 2. Especificación, 2025.
DocenteL.D.G. Luis E. Maldonado Gil
FacultadFAD · UAEMéx
01 / 31

Esta presentación está pensada para pantalla horizontal.

Índice de la sesión

CSS: selectores, cascada y modelo de caja

←→ cambiar de diapositiva O abrir y cerrar este índice T modo claro u oscuro F pantalla completa InicioFin primera y última