Maquetación Web Dinámica / Layouts I: Flexbox completo
flex-grow, flex-shrink y flex-basis: la abreviatura descifrada
Hasta ahora los ítems miden lo que mide su contenido. Pero los layouts
reales necesitan otra cosa: "la búsqueda ocupa todo el espacio sobrante",
"el sidebar mide 250px pase lo que pase". Eso lo deciden tres propiedades
DE LOS ÍTEMS — y la abreviatura flex que las empaqueta y que hoy dejarás
de copiar sin entender.
flex-grow: repartir lo que sobra
Si el contenedor mide 600px y los ítems suman 300px, sobran 300px.
flex-grow (default 0: nadie crece) dice cuántas PARTES de ese sobrante
toma cada ítem:
<p class="t">grow: 0 (default) — el sobrante queda vacío</p>
<div class="flex"><div class="i">a</div><div class="i">b</div><div class="i">c</div></div>
<p class="t">b con grow: 1 — se queda TODO el sobrante</p>
<div class="flex"><div class="i">a</div><div class="i g1">b</div><div class="i">c</div></div>
<p class="t">grow 1 / 2 / 1 — el sobrante en 4 partes: b toma 2</p>
<div class="flex"><div class="i g1">a</div><div class="i g2">b</div><div class="i g1">c</div></div>body { font-family: system-ui; padding: 20px; }
.t { font-size: 12px; color: #64748b; margin: 0 0 4px; }
.flex { display: flex; gap: 8px; background: #f1f5f9; border-radius: 8px; padding: 6px; margin-bottom: 12px; }
.i { background: #6d28d9; color: white; border-radius: 6px; padding: 8px 14px; font-weight: 600; font-size: 14px; text-align: center; }
.g1 { flex-grow: 1; }
.g2 { flex-grow: 2; }Ojo al matiz: grow reparte el SOBRANTE, no el total. Un ítem con grow 2 no mide "el doble" que uno con grow 1 — toma el doble de espacio EXTRA. (Para proporciones exactas del total existe un truco que viene más abajo.)
flex-shrink y flex-basis
- flex-shrink (default
1): cuando NO cabe todo, cuánto cede cada ítem.flex-shrink: 0= "yo no me encojo" — vital para logos e iconos que el espacio apretado deformaría. - flex-basis (default
auto): el tamaño de PARTIDA del ítem en el eje principal, antes de crecer o encogerse. Conauto, parte de su contenido (o su width); con un valor, parte de ahí.
La abreviatura flex: los tres en uno
El patrón del mundo real que une todo — el header con búsqueda elástica:
<header class="barra">
<span class="logo">Forge</span>
<input class="busqueda" type="search" placeholder="Buscar..." aria-label="Buscar">
<a class="perfil" href="#">Mi perfil</a>
</header>body { font-family: system-ui; padding: 20px; }
.barra { display: flex; align-items: center; gap: 16px; background: white; border: 1px solid #e2e8f0; border-radius: 10px; padding: 10px 16px; }
.logo { font-weight: 800; color: #6d28d9; flex: none; }
.busqueda { flex: 1; min-width: 0; padding: 8px 14px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 14px; }
.perfil { flex: none; color: #334155; text-decoration: none; font-size: 14px; font-weight: 600; }Logo y perfil con flex: none (intocables), búsqueda con flex: 1 (toma
todo lo demás). Achica la ventana: solo la búsqueda cede. Ese trío de
decisiones es media web.
Tres tarjetas deben medir EXACTAMENTE lo mismo aunque tengan textos de largos distintos. ¿Qué les pones?
Mini-reto
Monta el header con búsqueda elástica en tu periódico: nombre fijo, barra de búsqueda con flex: 1, un enlace fijo. Estira y encoge la ventana hasta que puedas EXPLICAR quién cede y por qué.
Qué sigue
Controlas tamaño y reparto en una línea. ¿Y cuando los ítems son demasiados para una sola? flex-wrap, align-content y gap — el salto a las multilíneas.