🎯 Objetivo del tema
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.
El dolor del pasado: floats para layout, hacks para limpiar, position para todo.
Una fila O una columna. Perfecto para barras de navegación, listas, alineación.
display, flex-direction, flex-wrap, justify-content, align-items, gap.
flex-grow, flex-shrink, flex-basis, order, align-self.
Filas Y columnas al mismo tiempo. Perfecto para layouts de página completos, galerías, dashboards.
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
| Tarea | Antes (2010) | Ahora (2025) |
|---|---|---|
| Centrar verticalmente | position + transform + porcentajes. | display: flex + align-items: center. |
| Tres columnas iguales | float: left + width: 33.33% + clearfix. | display: grid + grid-template-columns: repeat(3, 1fr). |
| Barra de navegación | inline-block + line-height hacks. | display: flex + gap + align-items: center. |
| Reordenar elementos en móvil | JavaScript o duplicar el HTML. | Cambiar el order en CSS. |
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
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.
| Propiedad | Valores comunes | Qué hace |
|---|---|---|
| display | flex, inline-flex | Activa flexbox en el contenedor. |
| flex-direction | row, column, row-reverse, column-reverse | Dirección principal de los ítems. |
| flex-wrap | nowrap, wrap, wrap-reverse | Si los ítems bajan a otra línea cuando no caben. |
| justify-content | flex-start, center, space-between, space-around, space-evenly | Alineación en el EJE PRINCIPAL. |
| align-items | stretch, flex-start, center, flex-end, baseline | Alineación en el EJE TRANSVERSAL. |
| gap | 1rem, 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 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.
| Propiedad | Atajo de | Qué hace |
|---|---|---|
| flex-grow | Primer valor de flex | Cuánto puede CRECER el ítem si sobra espacio (0 = no crece). |
| flex-shrink | Segundo valor de flex | Cuánto puede ENCOGER si falta espacio (1 = sí encoge, default). |
| flex-basis | Tercer valor de flex | Tamaño base antes de repartir el espacio sobrante. |
| flex | Atajo de las 3 | Atajo: flex: 1 equivale a flex-grow: 1; flex-shrink: 1; flex-basis: 0%; |
| order | — | Cambia el orden visual sin tocar el HTML (útil para responsive). |
| align-self | — | Sobrescribe 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 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.
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 uso | Usa... | Por qué |
|---|---|---|
| Barra de navegación | Flexbox | Es una sola fila (o columna). |
| Lista de tarjetas en fila | Flexbox | Una dimensión, ítems de tamaño similar. |
| Centrar algo | Flexbox | Su specialty: alinear en una dimensión. |
| Layout completo de página | Grid | Header, sidebar, main, footer = 2 dimensiones. |
| Galería de productos | Grid | Filas Y columnas que se alinean entre sí. |
| Dashboard con widgets | Grid | Cada widget va en un área específica. |
| Formulario | Flexbox O Grid | Si es 1 columna, Flexbox. Si es 2+ columnas, Grid. |
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.
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
- Abre tu página 'Sobre mí' con los estilos del Tema 1.5.
- Piensa: ¿tu página es 1D (lista de cosas) o 2D (header + sidebar + main + footer)? Decide si usas Flexbox, Grid, o ambos.
- 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.'
- Identifica cuál de los 3 se parece más a tu página 'Sobre mí'.
- Implementa en tu CSS: empieza con Grid para el layout general (header/main/aside/footer). Después Flexbox para los componentes internos.
- Prueba en DevTools: cambia el ancho de la ventana y verifica que el layout se adapta.
- Compara tu implementación con la de la IA. ¿Usaste las mismas técnicas? ¿Hay algo mejor que ella hizo y tú no?
- 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
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.
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?
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.
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).
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
- Abre tu página 'Sobre mí' con el CSS del Tema 1.5.
- Estructura HTML: asegúrate de tener <header>, <nav>, <main>, <aside>, <footer> en el orden correcto.
- Crea un contenedor .layout (puede ser body o un div nuevo) con display: grid.
- Define las áreas: header (arriba, todo el ancho), main + aside (centro, en columnas), footer (abajo, todo el ancho).
- Usa grid-template-areas con nombres semánticos para mapear las áreas.
- Establece alturas: grid-template-rows: auto 1fr auto para que el footer quede pegado al fondo cuando hay poco contenido.
- Dentro del header: aplica display: flex a la .navbar con justify-content: space-between.
- Dentro de main: si tienes tarjetas de pasatiempos, aplícales display: flex con flex-wrap: wrap y gap.
- Dentro del aside: usa Flexbox para alinear los items de la lista verticalmente.
- Prueba el responsive: en DevTools, cambia a móvil (375px). ¿Se rompe? Anota los problemas.
- Agrega una media query: en móvil, el grid se vuelve 1 columna (grid-template-columns: 1fr).
- Verifica con Lighthouse: el puntaje de 'Best Practices' debe mejorar (no usa float).
- 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.