Hoy · Hoja de ruta
- 1. Aprende: Los dos ejes de Flexbox y las cinco propiedades con las que se resuelve casi todo.
- 2. Haz: Convierte la navegación de tu sitio en un Flexbox.
- 3. Comprueba: El menú se comporta razonablemente al estrechar la ventana.
Antes de empezar · 5 minutos, sin apuntes
- ¿Qué diferencia hay entre un elemento
blocky unoinline? - ¿Qué ocurre con el hueco de un elemento en
position: absolute? - Explica por qué
display: noneno 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;
}
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
flex-direction: row- Eje principal · horizontal
- 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:
- La navegación en fila, con separación mediante
gapy sin viñetas. - El nombre del sitio a un lado y el menú al otro, en la misma línea.
- Los dos bloques alineados verticalmente entre sí.
flex-wrappara que el menú no desborde cuando falte espacio.- 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:
- Que lo has puesto en el contenedor, no en los hijos.
justify-contentyalign-itemsvan siempre en el elemento que tienedisplay: flex. - Cuál es el eje principal. Si has puesto
flex-direction: column, para centrar en vertical necesitasjustify-content, noalign-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
- ¿Sobre qué eje actúa
justify-content? - ¿Qué le pasa a
align-itemssi cambias aflex-direction: column? - ¿Por qué
gapes 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.