Hoy · Hoja de ruta

  1. 1. Aprende: Los dos ejes de Flexbox y las cinco propiedades con las que se resuelve casi todo.
  2. 2. Haz: Convierte la navegación de tu sitio en un Flexbox.
  3. 3. Comprueba: El menú se comporta razonablemente al estrechar la ventana.

Antes de empezar · 5 minutos, sin apuntes

  1. ¿Qué diferencia hay entre un elemento block y uno inline?
  2. ¿Qué ocurre con el hueco de un elemento en position: absolute?
  3. Explica por qué display: none no es solo «hacerlo invisible».

Una dimensión

Flexbox distribuye elementos en una línea: o en fila, o en columna. Ese es el criterio para elegirlo, y lo veremos enfrentado a Grid en la semana 4.

En la UD1 dejaste el menú así:

<nav aria-label="Navegación principal">
    <ul>
        <li><a href="index.html">Inicio</a></li>
        <li><a href="productos.html">Productos</a></li>
    </ul>
</nav>

Con dos declaraciones deja de ser una lista vertical:

nav ul {
    display: flex;
    gap: 1rem;
    list-style: none;
    padding: 0;
    margin: 0;
}
Vista previaLa misma lista semántica, ahora distribuida en una fila

display: flex cambia la distribución; gap crea únicamente el espacio entre enlaces.

Fíjate en algo: el HTML no se ha tocado. Sigue siendo una lista de enlaces, que es lo que es. Solo ha cambiado cómo se dibuja.

Los dos ejes

Los ejes con flex-direction: row
  1. Eje principal · horizontal
  2. Eje transversal · vertical

Todo Flexbox tiene un eje principal, que es por donde se colocan los elementos, y un eje transversal, el perpendicular. Cuál es cuál lo decide flex-direction:

flex-direction: row;     /* por defecto: principal horizontal */
flex-direction: column;  /* principal vertical */

La confusión que te va a pasar

justify-content siempre actúa sobre el eje principal y align-items sobre el transversal. No sobre «horizontal» y «vertical».

Por eso, en cuanto pones flex-direction: column, las dos se intercambian: justify-content pasa a mover en vertical y align-items en horizontal. Cuando algo no se alinee como esperas, la primera pregunta es cuál es ahora el eje principal.

Las cinco propiedades del contenedor

.barra {
    display: flex;
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
}
Propiedad Qué hace
justify-content Reparte el espacio sobrante en el eje principal
align-items Alinea los elementos en el eje transversal
gap Separación entre elementos, sin márgenes ni el último elemento sobrando
flex-wrap Permite que los elementos salten de línea cuando no caben

Valores útiles de justify-content: flex-start, center, flex-end, space-between —los extremos pegados a los bordes y el hueco repartido en medio— y space-around.

De align-items: stretch (por defecto, todos igual de altos), center, flex-start, flex-end, baseline.

gap

La separación entre elementos de un contenedor Flexbox o Grid. Sustituye a los márgenes y evita su problema clásico: no deja un margen sobrante en el último elemento, y no sufre el colapso de márgenes.

En los elementos hijos

.logo    { flex: 0 0 auto; }   /* no crece, no se encoge, mide lo que mida */
.buscador{ flex: 1; }          /* se queda con todo el espacio sobrante */

flex resume tres propiedades: cuánto puede crecer, cuánto puede encogerse y cuál es su tamaño de partida. flex: 1 es el atajo que más vas a usar, y significa «reparte el espacio que sobre entre los elementos que lo tengan».

margin-left: auto en un hijo también tiene un efecto muy útil: empuja ese elemento y todos los siguientes hasta el final del eje. Es la forma limpia de separar un grupo del resto en una barra.

Tarea 8 · La navegación de tu sitio

Transforma la cabecera de tus cuatro páginas:

  1. La navegación en fila, con separación mediante gap y sin viñetas.
  2. El nombre del sitio a un lado y el menú al otro, en la misma línea.
  3. Los dos bloques alineados verticalmente entre sí.
  4. flex-wrap para que el menú no desborde cuando falte espacio.
  5. Comprueba a 360 px de ancho en DevTools que nada se sale de la pantalla.

Lo que no vale

Nada de margin-left: 73px para colocar cada elemento en su sitio. Si un número así aparece en tu CSS, significa que has medido la pantalla en la que estás mirando: en otra estará mal.

La forma de colocar en Flexbox es decir cómo se reparte el espacio, no dónde va cada cosa.

Estoy atascado · align-items: center no centra nada

Comprueba dos cosas, en este orden:

  1. Que lo has puesto en el contenedor, no en los hijos. justify-content y align-items van siempre en el elemento que tiene display: flex.
  2. Cuál es el eje principal. Si has puesto flex-direction: column, para centrar en vertical necesitas justify-content, no align-items.

Y usa el inspector de Flexbox: junto al elemento aparece un icono flex en DevTools que dibuja los ejes y el espacio libre.

Antes de cerrar · 2 minutos, sin mirar

  1. ¿Sobre qué eje actúa justify-content?
  2. ¿Qué le pasa a align-items si cambias a flex-direction: column?
  3. ¿Por qué gap es mejor que poner márgenes a los hijos?
Ver respuestas

1 · Sobre el eje principal, sea cual sea su dirección.

2 · Pasa a alinear en horizontal, porque el eje transversal ahora es el horizontal.

3 · Porque separa solo entre elementos, sin dejar un margen sobrante al final, y no sufre el colapso de márgenes.