📦 1.6 · Flexbox y Grid: layouts profesionales con CSS

⏱ 6h 00min ⚡ 100 XP 🏅 Aprendiz 📖 Fundamentos del Web FullStack
"Flexbox y Grid no compiten: se complementan. Uno para una dimensión, otro para dos."

🎯 Objetivo del tema

Al terminar este tema serás capaz de: Al terminar este tema serás capaz de crear layouts profesionales usando Flexbox (para una dimensión: filas O columnas) y CSS Grid (para dos dimensiones: filas Y columnas). Sabrás cuándo usar cada uno y podrás crear desde barras de navegación hasta galerías de productos sin usar float ni position: absolute.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

🗺️ Mapa del tema

Durante años, hacer layouts en CSS fue un infierno de floats, clears, y position: absolute. Todo cambió en 2017 con Flexbox, y en 2018 con CSS Grid. Hoy son las dos herramientas que todo desarrollador web debe dominar. En este tema vas a aprender ambas, sus diferencias, y cuándo usar cada una.

1. Por qué Flexbox y Grid reemplazaron a float

El dolor del pasado: floats para layout, hacks para limpiar, position para todo.

2. Flexbox: el patrón unidimensional

Una fila O una columna. Perfecto para barras de navegación, listas, alineación.

3. Las 6 propiedades del contenedor flex

display, flex-direction, flex-wrap, justify-content, align-items, gap.

4. Propiedades de los ítems flex

flex-grow, flex-shrink, flex-basis, order, align-self.

5. CSS Grid: el patrón bidimensional

Filas Y columnas al mismo tiempo. Perfecto para layouts de página completos, galerías, dashboards.

6. Cuándo usar Flexbox vs Grid

Regla práctica: 1 dimensión = Flexbox, 2 dimensiones = Grid. Pero hay excepciones.

1.6.1 Por qué Flexbox y Grid reemplazaron a float

Antes de 2017, hacer un layout era una pesadilla. La única herramienta de CSS pensada originalmente para layout era float, que en realidad fue diseñada para que el texto rodeara imágenes. El resultado: hacks, clearfix, position: absolute para todo, y un mareo constante de '¿por qué esto no se alinea?'.

El pasado (float-based layout)

/* El 'código clásico' para centrar algo verticalmente, antes de 2017 */
.parent {
  position: relative;
  height: 300px;
}
.child {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
/* ¿Por qué tanta complicación? Porque float no servía para esto. */

Hacking con position: absolute

El presente (Flexbox y Grid)

/* Con Flexbox: 3 líneas y listo */
.parent {
  display: flex;
  align-items: center;
}
/* Eso es TODO. Sin position, sin transform, sin hacks. */

Centrado vertical con Flexbox

TareaAntes (2010)Ahora (2025)
Centrar verticalmenteposition + transform + porcentajes.display: flex + align-items: center.
Tres columnas igualesfloat: left + width: 33.33% + clearfix.display: grid + grid-template-columns: repeat(3, 1fr).
Barra de navegacióninline-block + line-height hacks.display: flex + gap + align-items: center.
Reordenar elementos en móvilJavaScript o duplicar el HTML.Cambiar el order en CSS.
⭐ Regla de oro: Flexbox (2017 estable) y Grid (2018 estable) son las DOS herramientas que reemplazaron TODO lo anterior. Olvídate de float, inline-block, position: absolute y table-layout. Si tu CSS usa esos para layout en 2025, es código legacy.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.6.2 Flexbox: el patrón unidimensional

Flexbox organiza elementos en UNA dimensión: o en una fila, o en una columna. Es perfecto para barras de navegación, listas de tarjetas, alineación de botones, distribución de espacio sobrante. La idea central: tienes un CONTENEDOR flex y unos ÍTEMS flex.

El ejemplo más simple: una barra de navegación

<nav class="navbar">
  <a href="/" class="logo">Mi sitio</a>
  <ul class="menu">
    <li><a href="/blog">Blog</a></li>
    <li><a href="/proyectos">Proyectos</a></li>
    <li><a href="/contacto">Contacto</a></li>
  </ul>
</nav>

<style>
.navbar {
  display: flex;                /* activa flexbox */
  justify-content: space-between;  /* logo a la izq, menú a la der */
  align-items: center;          /* alineados verticalmente */
  padding: 1rem 2rem;
}

.menu {
  display: flex;                /* menú también es flex */
  gap: 1.5rem;                  /* espacio entre items */
  list-style: none;
}
</style>

Barra de navegación con Flexbox

⭐ Cuándo pensar en Flexbox: El truco mental: cuando pienses 'quiero alinear estos elementos en una fila/columna y controlar cómo se reparten el espacio', usa Flexbox. Casi siempre es la respuesta correcta.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.6.3 Las 6 propiedades del contenedor flex

El contenedor flex (el padre con display: flex) tiene 6 propiedades que controlan cómo se distribuyen los hijos. Las 3 primeras controlan la dirección y el flujo; las 3 siguientes, la alineación.

PropiedadValores comunesQué hace
displayflex, inline-flexActiva flexbox en el contenedor.
flex-directionrow, column, row-reverse, column-reverseDirección principal de los ítems.
flex-wrapnowrap, wrap, wrap-reverseSi los ítems bajan a otra línea cuando no caben.
justify-contentflex-start, center, space-between, space-around, space-evenlyAlineación en el EJE PRINCIPAL.
align-itemsstretch, flex-start, center, flex-end, baselineAlineación en el EJE TRANSVERSAL.
gap1rem, 20px, etc.Espacio entre ítems (reemplaza márgenes manuales).

justify-content: el más usado

.contenedor {
  display: flex;
  justify-content: space-between;  /* más común: empuja el primero a la izq y el último a la der */
}

/* Otros valores útiles: */
/* flex-start:     todos pegados al inicio */
/* center:         todos centrados */
/* space-around:   espacio igual alrededor de cada uno */
/* space-evenly:   espacio igual ENTRE todos (incluyendo los bordes) */

justify-content: space-between

💡 El 80% de Flexbox: En el 80% de los casos usarás solo: display: flex + justify-content + align-items + gap. Las otras 2 propiedades (direction, wrap) son para casos específicos.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.6.4 Propiedades de los ítems flex

Además de las propiedades del contenedor, cada ÍTEM flex puede tener sus propias propiedades. Las 3 más importantes forman el atajo 'flex', que controla cómo crece, encoge y cuál es su tamaño base.

PropiedadAtajo deQué hace
flex-growPrimer valor de flexCuánto puede CRECER el ítem si sobra espacio (0 = no crece).
flex-shrinkSegundo valor de flexCuánto puede ENCOGER si falta espacio (1 = sí encoge, default).
flex-basisTercer valor de flexTamaño base antes de repartir el espacio sobrante.
flexAtajo de las 3Atajo: flex: 1 equivale a flex-grow: 1; flex-shrink: 1; flex-basis: 0%;
orderCambia el orden visual sin tocar el HTML (útil para responsive).
align-selfSobrescribe align-items solo para este ítem.

El patrón 'tres columnas iguales'

.contenedor {
  display: flex;
  gap: 1rem;
}
.columna {
  flex: 1;  /* las 3 crecen igual y ocupan el mismo ancho */
}

<!-- HTML -->
<div class="contenedor">
  <div class="columna">Columna 1</div>
  <div class="columna">Columna 2</div>
  <div class="columna">Columna 3</div>
</div>

/* flex: 1 es el atajo más usado de TODO Flexbox. */

Tres columnas iguales con flex: 1

⭐ El atajo más útil: flex: 1 = 'este ítem debe crecer hasta llenar el espacio disponible, en proporción igual a los otros ítems con flex: 1'. Es el 90% de los casos de uso de Flexbox. Memorízalo.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.6.5 CSS Grid: el patrón bidimensional

Grid organiza elementos en DOS dimensiones: filas Y columnas al mismo tiempo. Es perfecto para layouts de página completos, galerías de productos, dashboards, y cualquier diseño donde necesites controlar 'este elemento está en la fila 2 columna 3'.

El ejemplo: layout de página típico

body {
  display: grid;
  grid-template-columns: 250px 1fr;       /* sidebar fijo, contenido flexible */
  grid-template-rows: auto 1fr auto;        /* header, main, footer */
  grid-template-areas:
    "header  header"
    "sidebar main"
    "footer  footer";
  min-height: 100vh;
  gap: 1rem;
}

header  { grid-area: header; }
aside   { grid-area: sidebar; }
main    { grid-area: main; }
footer  { grid-area: footer; }

Layout de página con Grid areas

El atajo definitivo: repeat() + fr

/* 12 columnas iguales: el clásico de Bootstrap y frameworks */
.contenedor {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 1rem;
}
.col-6  { grid-column: span 6; }  /* ocupa 6 de 12 = mitad */
.col-4  { grid-column: span 4; }  /* ocupa 4 de 12 = un tercio */
.col-3  { grid-column: span 3; }  /* ocupa 3 de 12 = un cuarto */

Grid de 12 columnas con repeat()

Unidad fr: la más poderosa de Grid

La unidad fr (fracción) reparte el espacio disponible en proporciones. grid-template-columns: 1fr 2fr 1fr crea 3 columnas donde la del medio es el DOBLE de las otras. Es mucho más fácil que calcular porcentajes.

⭐ La unidad mágica: La unidad fr es a Grid lo que flex: 1 es a Flexbox. Si solo aprendes UNA cosa de Grid, que sea esta: fr reparte el espacio sobrante en proporciones.
🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

1.6.6 Cuándo usar Flexbox vs Grid

La confusión más común: ¿uso Flexbox o Grid para esto? La regla práctica es sencilla, aunque hay matices. Y la mejor noticia: puedes combinarlos sin problemas.

Caso de usoUsa...Por qué
Barra de navegaciónFlexboxEs una sola fila (o columna).
Lista de tarjetas en filaFlexboxUna dimensión, ítems de tamaño similar.
Centrar algoFlexboxSu specialty: alinear en una dimensión.
Layout completo de páginaGridHeader, sidebar, main, footer = 2 dimensiones.
Galería de productosGridFilas Y columnas que se alinean entre sí.
Dashboard con widgetsGridCada widget va en un área específica.
FormularioFlexbox O GridSi es 1 columna, Flexbox. Si es 2+ columnas, Grid.
⭐ Cuando dudes: Regla de oro: si tu layout cabe en una línea mental, usa Flexbox. Si necesitas pensar en filas Y columnas al mismo tiempo, usa Grid. Y si dudas: usa Grid, porque Grid puede hacer todo lo que hace Flexbox (aunque a veces con más código).

Combinados: Grid para el macro, Flexbox para el micro

Lo profesional es combinarlos. Por ejemplo: Grid para el layout general de la página (header, sidebar, main, footer), y Flexbox dentro de cada zona (la barra de navegación dentro del header, las tarjetas dentro de main, los botones dentro de una tarjeta). Cada herramienta en su nivel.

🎬
Video del instructor

El administrador aún no ha insertado un video para esta sección.

📚 Contenido ampliado

Material adicional, referencias externas verificadas y ejemplos extendidos.

🤖 AI Mission

Flexbox y Grid se aprenden haciendo. Pídele a la IA ejemplos CONCRETOS, no definiciones.

Misión: Toma la página 'Sobre mí' del Tema 1.3 y rediseña su layout completo usando Grid para la estructura general y Flexbox para los componentes internos. Pídele a la IA que te dé 3 ejemplos de layouts comunes (landing page, blog, dashboard) y compara cuál se parece más al tuyo. No copies el código de la IA: entiéndelo primero, después adáptalo.

Pasos sugeridos

  1. Abre tu página 'Sobre mí' con los estilos del Tema 1.5.
  2. Piensa: ¿tu página es 1D (lista de cosas) o 2D (header + sidebar + main + footer)? Decide si usas Flexbox, Grid, o ambos.
  3. Pídele a la IA: 'Dame 3 ejemplos de layouts CSS: landing page, blog post, dashboard. Usa Grid para la macroestructura y Flexbox para los componentes. Explica cada decisión.'
  4. Identifica cuál de los 3 se parece más a tu página 'Sobre mí'.
  5. Implementa en tu CSS: empieza con Grid para el layout general (header/main/aside/footer). Después Flexbox para los componentes internos.
  6. Prueba en DevTools: cambia el ancho de la ventana y verifica que el layout se adapta.
  7. Compara tu implementación con la de la IA. ¿Usaste las mismas técnicas? ¿Hay algo mejor que ella hizo y tú no?
  8. Anota en tu cuaderno: 'Grid para [X], Flexbox para [Y]. Razón: [Z]'.

📓 Entregable: Captura de tu página con el nuevo layout, código CSS del Grid principal con comentarios, y media página de cuaderno justificando cada decisión Flexbox/Grid.

🚫 Errores típicos de razonamiento

Error 1: Usar float para hacer layout en 2025.
Por qué: Float fue diseñado para que el texto rodee imágenes, NO para layout. Usarlo hoy significa hacks (clearfix, overflow: hidden), código frágil, y horas perdidas. Flexbox y Grid resuelven el 100% de los casos de float para layout, con código más corto, claro y mantenible.
Error 2: Poner display: flex en CADA elemento sin pensar en la jerarquía.
Por qué: display: flex solo afecta a los hijos DIRECTOS. Si pones flex en el body y luego quieres alinear los nietos, no funciona: necesitas poner flex también en el elemento padre directo. Antes de escribir display: flex, pregúntate: ¿estos elementos que quiero alinear son hijos DIRECTOS de este contenedor?
Error 3: Confundir justify-content (eje principal) con align-items (eje transversal).
Por qué: Es el error #1 de Flexbox. El eje principal es el de flex-direction (row = horizontal, column = vertical). El transversal es el perpendicular. Si tu flex-direction es row, justify-content alinea horizontalmente y align-items verticalmente. Si cambias a column, se invierten. Dibuja los ejes en un papel antes de escribir CSS.
Error 4: Usar position: absolute para centrar, en vez de Flexbox/Grid.
Por qué: Antes de 2017 no había opción fácil. Hoy, position: absolute para centrar es código legacy. display: flex + align-items: center + justify-content: center hace lo mismo en 1 línea, sin position, sin top/left/transform, y sin sacar el elemento del flujo del documento (lo cual causa otros problemas).
Error 5: Olvidar el gap y usar márgenes manuales entre ítems.
Por qué: Es tentador poner margin-right en cada ítem. El problema: el ÚLTIMO ítem también tiene margin-right, y queda un espacio feo al final. Solución clásica (hacks con :last-child { margin: 0; }). Solución moderna: usa gap en el contenedor, que aplica espacio SÓLO ENTRE los ítems, no al final. Funciona igual en Flexbox y Grid. Una línea, cero hacks.

🧪 Laboratorio práctico

Layouts se aprenden rompiendo y arreglando. Hazlo.

Laboratorio: Layout profesional con Grid + Flexbox para tu página 'Sobre mí'

Objetivo: Rediseñar completamente la página 'Sobre mí' con Grid para la estructura general y Flexbox para los componentes. El resultado: header con navegación, main con 2 secciones, aside con info lateral, footer con datos. Todo en CSS moderno, sin float.

Pasos

  1. Abre tu página 'Sobre mí' con el CSS del Tema 1.5.
  2. Estructura HTML: asegúrate de tener <header>, <nav>, <main>, <aside>, <footer> en el orden correcto.
  3. Crea un contenedor .layout (puede ser body o un div nuevo) con display: grid.
  4. Define las áreas: header (arriba, todo el ancho), main + aside (centro, en columnas), footer (abajo, todo el ancho).
  5. Usa grid-template-areas con nombres semánticos para mapear las áreas.
  6. Establece alturas: grid-template-rows: auto 1fr auto para que el footer quede pegado al fondo cuando hay poco contenido.
  7. Dentro del header: aplica display: flex a la .navbar con justify-content: space-between.
  8. Dentro de main: si tienes tarjetas de pasatiempos, aplícales display: flex con flex-wrap: wrap y gap.
  9. Dentro del aside: usa Flexbox para alinear los items de la lista verticalmente.
  10. Prueba el responsive: en DevTools, cambia a móvil (375px). ¿Se rompe? Anota los problemas.
  11. Agrega una media query: en móvil, el grid se vuelve 1 columna (grid-template-columns: 1fr).
  12. Verifica con Lighthouse: el puntaje de 'Best Practices' debe mejorar (no usa float).
  13. Haz commit: 'feat: layout profesional con Grid y Flexbox'.

📓 Entregable: Capturas de: (1) la página en desktop (1200px+), (2) en tablet (768px), (3) en móvil (375px), (4) el código del Grid con grid-template-areas, (5) Lighthouse Best Practices 95+, (6) commit en Git.

📓 Tu cuaderno: Anota pseudocódigo, diagramas, errores que encontraste y respuestas a "explica sin código". La escritura manual refuerza tu razonamiento. Tu profesor puede pedirte que subas fotos de páginas específicas.