Tutorial de Flexbox: El Sistema de Maquetación Más Útil

 


¿Qué es Flexbox?

Flexbox (Flexible Box) es un sistema de maquetación CSS que te permite distribuir el espacio y alinear elementos de manera fácil y predecible. Es perfecto para crear diseños de una sola dimensión (filas O columnas).

La idea principal:

  • Tienes un contenedor PADRE (flex container)

  • Dentro tienes elementos HIJOS (flex items)

  • El padre decide cómo se colocan los hijos


1. Activar Flexbox

Para empezar a usar Flexbox, solo necesitas una línea mágica:

css
.padre {
    display: flex;    /* ¡Ya estás usando Flexbox! */
}

2. Las Dos Direcciones Principales

Por defecto: FILA (horizontal)

css
.padre {
    display: flex;
    flex-direction: row;  /* Valor por defecto */
}

Los hijos se colocan en horizontal (de izquierda a derecha).

Para cambiar a COLUMNA (vertical)

css
.padre {
    display: flex;
    flex-direction: column;  /* Apila en vertical */
}

Los hijos se colocan en vertical (de arriba a abajo).


3. Propiedades MÁGICAS para alinear

justify-content: Alinea en la dirección principal

ValorResultado
flex-startAl inicio (por defecto)
centerAl centro
flex-endAl final
space-betweenEspacio entre elementos
space-aroundEspacio alrededor
space-evenlyEspacio igualitario

Ejemplo visual con flex-direction: row:

css
.padre {
    display: flex;
    justify-content: center;  /* Centra horizontalmente */
}

align-items: Alinea en la dirección cruzada

ValorResultado
stretchEstira (por defecto)
centerAl centro
flex-startArriba/izquierda
flex-endAbajo/derecha

Ejemplo:

css
.padre {
    display: flex;
    align-items: center;  /* Centra verticalmente */
    height: 300px;        /* Necesita una altura para notarse */
}

4. Truco estrella: Centrar TODO

Con Flexbox, centrar es TRIVIAL:

css
.padre {
    display: flex;
    justify-content: center;  /* Centra horizontal */
    align-items: center;      /* Centra vertical */
    height: 100vh;            /* Altura completa de la pantalla */
}

¡Así de fácil! 🎯


5. Proyecto Práctico 1: Barra de Navegación

Vamos a crear un menú de navegación típico:

HTML:

html
<nav class="navbar">
    <div class="logo">MiLogo</div>
    <ul class="menu">
        <li><a href="#">Inicio</a></li>
        <li><a href="#">Servicios</a></li>
        <li><a href="#">Productos</a></li>
        <li><a href="#">Contacto</a></li>
    </ul>
    <button class="btn">Login</button>
</nav>

CSS:

css
.navbar {
    display: flex;
    justify-content: space-between;  /* Logo a izq, menú centro, botón der */
    align-items: center;
    padding: 1rem 2rem;
    background-color: #333;
    color: white;
}

.menu {
    display: flex;
    list-style: none;
    gap: 2rem;  /* Espacio entre items del menú */
}

.menu a {
    color: white;
    text-decoration: none;
}

.btn {
    padding: 0.5rem 1rem;
    background-color: #ff6b6b;
    border: none;
    color: white;
    border-radius: 5px;
}

6. Proyecto Práctico 2: Galería de Imágenes

HTML:

html
<div class="galeria">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <div class="item">6</div>
</div>

CSS:

css
.galeria {
    display: flex;
    flex-wrap: wrap;        /* Permite que pasen a la siguiente línea */
    gap: 20px;              /* Espacio entre items */
    justify-content: center; /* Centra las filas */
}

.item {
    width: 200px;
    height: 200px;
    background-color: #4ecdc4;
    color: white;
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 2rem;
    border-radius: 10px;
}

7. Propiedades para los hijos

flex-grow: Crecer

El hijo ocupa el espacio disponible

css
.hijo {
    flex-grow: 1;  /* Todos los hijos con esto crecen igual */
}

flex-shrink: Encogerse

Controla si el hijo puede encogerse

css
.hijo {
    flex-shrink: 0;  /* No se encoge aunque no quepa */
}

flex-basis: Tamaño base

css
.hijo {
    flex-basis: 200px;  /* Tamaño inicial antes de crecer/encoger */
}

Atajo: flex: 1

css
.hijo {
    flex: 1;  /* Equivalente a: flex-grow: 1; flex-shrink: 1; flex-basis: 0; */
}

8. Proyecto Práctico 3: Layout de 3 Columnas

HTML:

html
<div class="layout">
    <aside class="sidebar">Barra lateral</aside>
    <main class="contenido">Contenido principal</main>
    <aside class="sidebar">Barra lateral</aside>
</div>

CSS:

css
.layout {
    display: flex;
    min-height: 400px;
}

.sidebar {
    width: 200px;
    background-color: #f4f4f4;
    padding: 20px;
}

.contenido {
    flex: 1;  /* Ocupa todo el espacio disponible */
    background-color: white;
    padding: 20px;
}

9. Trucos Útiles

Ordenar elementos

css
.hijo:first-child {
    order: 2;  /* Orden personalizado (menor número = más a la izquierda) */
}
.hijo:last-child {
    order: 1;  /* Este irá primero */
}

Alinear un hijo específico

css
.hijo-especial {
    align-self: flex-end;  /* Solo este hijo se alinea abajo */
}

10. Chuleta Visual Rápida

text
DISPLAY: FLEX
│
├── EN EL PADRE:
│   ├── flex-direction: row / column
│   ├── justify-content: center / space-between / etc
│   ├── align-items: center / stretch / etc
│   ├── flex-wrap: wrap / nowrap
│   └── gap: 20px
│
└── EN LOS HIJOS:
    ├── flex: 1 (crece para llenar espacio)
    ├── align-self: center (alineación individual)
    └── order: 1 (cambiar orden)

Ejercicio para Practicar

Intenta crear este layout tú mismo:

HTML:

html
<header>Header</header>
<div class="contenedor">
    <nav>Menú</nav>
    <main>Artículo principal</main>
    <aside>Sidebar</aside>
</div>
<footer>Footer</footer>

Pista:

css
.contenedor {
    display: flex;
}
nav {
    width: 200px;
}
main {
    flex: 1;
}
aside {
    width: 200px;
}

Resumen en 3 Pasos

  1. Activar: display: flex en el padre

  2. Elegir dirección: flex-direction: row o column

  3. Alinear: justify-content y align-items

¡Y eso es todo! Con esto ya puedes hacer el 90% de los layouts que necesitas. ¿Quieres que practiquemos con algún ejemplo específico?

Comentarios

Entradas más populares de este blog

Tutorial de CSS: De Cero a Estilizar tu Primera Página Web

layouts

Proyecto Práctico: Tarjeta de Perfil