3.5. Flexbox
El mòdul Flexbox Layout (o Flexible Box) és un sistema de disseny modern que permet distribuir, alinear i redimensionar elements d’una manera molt més flexible que el CSS tradicional.
Flexbox resol problemes típics del disseny web:
- alineacions difícils
- repartiment d’espais desiguals
- centrat vertical
- columnes que s’adapten automàticament
- layouts que responen a pantalles de diferents mides
A diferència dels layouts clàssics:
- els elements block s’organitzen verticalment,
- els elements inline s’organitzen horitzontalment,
Flexbox no està lligat a cap direcció fixa: decideixes l’orientació i els elements s’adapten.
Flexbox és ideal per a dissenyar components i layouts de mida mitjana. Per a dissenys més grans, utilitzarem CSS Grid.
1. Conceptes bàsics de FlexBox
Per utilitzar Flexbox, un element ha de convertir-se en contenidor flex:
.container {
display: flex;
}
A partir d’este moment:
- aquest element és un flex container
- els seus fills directes són flex items
1.1 Els eixos de Flexbox
Flexbox funciona amb dos eixos:

- Main Axis (eix principal)
És l’eix on Flexbox col·loca els elements. La seua direcció depén de flex-direction.
- Cross Axis (eix transversal)
És perpendicular al main axis i s’utilitza per a alineacions verticals o horitzontals, segons el cas.
Altres conceptes del model Flexbox
Per entendre com Flexbox calcula l’espai i organitza els elements, convé conéixer estes idees:
- main-start → main-end
És el recorregut del flux principal. Els elements Flex es col·loquen començant en main-start i avançant cap a main-end.
- Main Size
És la mida principal d’un element Flex. Pot ser amplària o alçària segons flex-direction. Equival a width o height, segons el cas.
- cross-start → cross-end
Quan hi ha diverses línies Flex (amb flex-wrap), aquestes s’ordenen des de cross-start fins a cross-end.
- Cross Size
És la mida transversal d’un element Flex: la que correspon a l’eix perpendicular. També equival a width o height segons l’orientació del contenidor.
Com es disposen els elements?
Els elements flexibles es distribueixen seguint estes regles:
- Main Axis: Els elements es col·loquen des de main-start fins a main-end.
- Cross Axis: Si hi ha diverses línies flexibles, estes s’organitzen des de cross-start fins a cross-end.
2. Propietats del Contenidor Flex
Aquestes propietats modifiquen el comportament general dels elements (els flex items).
2.1 flex-direction — Direcció dels elements
Defineix com s’ordenen els elements:
.container {
flex-direction: row | row-reverse | column | column-reverse;
}
- row (per defecte): horitzontal, d’esquerra a dreta
- row-reverse: horitzontal invertida
- column: vertical, de dalt cap avall
- column-reverse: vertical invertida
2.2 flex-wrap — Permet trencar línia
Per defecte, Flexbox posa tots els elements en una sola línia. Amb esta propietat es pot permetre que els elements es dividisquen en múltiples línies si cal.
.container {
flex-wrap: nowrap | wrap | wrap-reverse;
}
nowrap(per defecte): Tots els elements flex estaran en una sola línia.wrap: Els elements flex es dividiran en diverses línies, de dalt a baix.wrap-reverse: Els elements flex es dividiran en diverses línies, de baix a dalt.
2.3 flex-flow — Abreviatura
Combinació de flex-direction i flex-wrap:
flex-flow: <direcció> <wrap>;
Exemple:
flex-flow: row wrap;
2.4 justify-content — Alineació horitzontal (eix principal)
Organitza espais i distribució en el main axis:
flex-start(per defecte): Els elements es col·loquen al començament de la direcció flex.flex-end: Els elements es col·loquen al final de la direcció flex.center: Els elements s’alineen al centre de la línia.space-between: Els elements es distribueixen equitativament; el primer està al començament i l’últim al final.space-around: Els elements tenen espai igual al seu voltant.space-evenly: L’espai entre qualsevol dos elements (i les vores) és igual.
2.5 align-items — Alineació en el Cross Axis
Controla l’alineació perpendicular al main axis, es a dir, en el cross axis. És similar a justify-content, però per a l’eix transversal o vertical.
stretch(per defecte): Els elements s’estiren per omplir el contenidor (respectantmin-width/max-width).flex-start/start/self-start: Els elements s’alineen al començament de l’eix transversal.flex-end/end/self-end: Els elements s’alineen al final de l’eix transversal.center: Els elements s’alineen al centre de l’eix transversal.baseline: Els elements s’alineen perquè les seues línies base coincidisquen.
2.6 align-content — Alineació de múltiples línies
Només afecta contenidors amb wrap.
Valors:
normal(per defecte): Els elements s’agrupen en la seua posició per defecte.flex-start/start: Les línies es col·loquen al començament del contenidor.flex-end/end: Les línies es col·loquen al final del contenidor.center: Les línies s’alineen al centre del contenidor.space-between: Les línies es distribueixen equitativament; la primera línia al començament i l’última al final.space-around: Espai igual al voltant de cada línia.space-evenly: Espai igual entre línies i les vores.stretch: Les línies s’estiren per ocupar l’espai restant.
Important:
align-itemss’aplica als items de cada línia, és a dir, a l’interior d’una línia.align-contents’aplica a totes les línies juntes, però només funciona quan hi ha wrap i espai vertical sobr ant.
2.7 gap — Espai entre elements
La propietat gap controla l’espai entre els elements flexibles. Només aplica este espai entre elements, no a les vores exteriors
Equivalent al gap de CSS Grid.
gap: 10px; /* mateix valor per a files i columnes */
gap: 10px 20px; /* files / columnes */
Nota:
gapno és exclusiu de flexbox; també funciona amb Grid i dissenys de columnes múltiples.
3. Propietats dels Elements Flex (flex items)
Aquestes propietats es posen en els fills del contenidor flex.
3.1 order — Reordenar visualment
Per defecte, els elements flexibles es disposen segons l’ordre en el codi font. No obstant això, la propietat order controla l’ordre en què apareixen dins del contenidor flex
No canvia el codi HTML, només la posició visual.
.item {
order: 5; /* el valor per defecte és 0 */
}
Els valors d’
ordersón números que indiquen prioritat visual (menor → abans). No representen una posició, sinó un pes:
order: 0(per defecte)order: 1apareix després
order: -1apareix abansEls elements amb el mateix valor mantenen l’ordre natural de l’HTML.
3.2 flex-grow — Capacitat de créixer
Reparteix proporcionalment l’espai disponible dins del contenidor entre els elements flexibles segons el seu valor de creixement (flex-grow).
.a { flex-grow: 1; }
.b { flex-grow: 2; } /* creix el doble que .a */
3.3 flex-shrink — Capacitat de contraure’s
Determina com es redueix un element quan hi ha poc espai.
1→ es pot contraure (per defecte)0→ no es contraurà
flex-shrinkdetermina la proporció de reducció quan el contenidor és massa xicotet. Per exemple:
shrink: 2es contraurà el doble queshrink: 1.- Si un element té
shrink: 0, no es redueix mai (pot desbordar el contenidor).
3.4 flex-basis — Mida inicial
Defineix la mida base d’un item abans de repartir espais.
.a { flex-basis: 100px; }
.b { flex-basis: 20%; }
flex-basisté prioritat sobrewidth(quan existeixen ambdós).
3.5 flex — Abreviatura recomanada
Equival a:
flex: <grow> <shrink> <basis>;
Exemple:
flex: 1; /* grow=1, shrink=1, basis=0 */
flex: 2 1 100px; /* grow=2, shrink=1, basis=100px */
flex: none; /* 0 0 auto */
En resum
flex-basis: Defineix la mida inicial de l’element abans de distribuir l’espai.flex: Permet establir de manera conjunta el comportament de creixement, contracció i mida inicial. Ideal per simplificar el codi.
Consell: És recomanable utilitzar esta propietat abreujada en lloc de definir cadascuna individualment, ja que assigna els altres valors de manera intel·ligent.
3.6 align-self — Alineació individual
Permet que un element es comporte diferent als altres, es a dir, sobreescriu la propietat align-items del contenidor per a un element específic.
.item {
align-self: flex-end;
}
Resum
Contenidor
display:flexactiva Flexbox.flex-directiondecideix l’orientació.flex-wrappermet que els elements salten de línia.justify-content→ organitza al llarg del main axis.align-items→ alineació en el cross axis.gap→ espai entre elements.
Elements
order→ canvia posició visual.flex-grow→ com creix.flex-shrink→ com es contraurà.flex-basis→ mida inicial.flex→ configuració completa abreujada.align-self→ alineació individual.
Amb
flex-grow,flex-shrinkiflex-basisdefinim si un element és flexible o fix. El conjunt determina com es comporta quan sobre o falta espai
Taules Resum Flexbox
1. Propietats del contenidor (Flex Container)
| Propietat | Què fa | Valors principals | Explicació breu |
|---|---|---|---|
| display | Activa Flexbox | flex | Converteix l’element en contenidor flex. |
| flex-direction | Direcció del main axis | row · row-reverse · column · column-reverse | Controla si els elements van en fila o columna i el sentit. |
| flex-wrap | Salt de línia | nowrap · wrap · wrap-reverse | Permet dividir els elements en diverses línies. |
| flex-flow | Abreviatura | <direction> <wrap> | Combina flex-direction i flex-wrap en una sola línia. |
| justify-content | Alineació en el main axis | flex-start · flex-end · center · space-between · space-around · space-evenly | Distribueix els elements horitzontalment (o segons l’eix principal). |
| align-items | Alineació en el cross axis | stretch · flex-start · flex-end · center · baseline | Alinea els elements dins de cada línia. |
| align-content | Alineació de múltiples línies | stretch · flex-start · flex-end · center · space-between · space-around · space-evenly | Només funciona amb wrap i diverses línies; distribueix les línies. |
| gap | Espai entre elements | gap: X · gap: X Y | Controla l’espai entre els items (no les vores). |
2. Propietats dels elements (Flex Items)
| Propietat | Què fa | Valors | Explicació breu |
|---|---|---|---|
| order | Reordena visualment | 0 (defecte), números positius o negatius | Un nombre menor apareix abans. No canvia l’HTML. |
| flex-grow | Creixement | 0 (defecte) · 1 · 2… | Determina quant espai extra ocupa un item respecte als altres. |
| flex-shrink | Contracció | 1 (defecte) · 0 · 2… | Controla quant es redueix un element quan falta espai. |
| flex-basis | Mida inicial | auto · px · % | Mida base de l’element abans de distribuir espai. Prioritza front a width. |
| flex | Abreviatura | <grow> <shrink> <basis> | Recomanat per definir el comportament complet d’un item. |
| align-self | Alineació individual | auto · flex-start · flex-end · center · baseline · stretch | Sobreescriu align-items per a un item concret. |
3. Resum dels eixos
| Eix | Direcció | Controlat per | Explica |
|---|---|---|---|
| Main Axis | Principal (fila o columna) | flex-direction | Determina com es col·loquen els elements. |
| Cross Axis | Perpendicular al main axis | align-items · align-content | Controla alineació vertical/horizontal segons el cas. |
4. Resum funcional
| Acció que vull fer | Propietat que utilitze | Exemple |
|---|---|---|
| Posar els elements en fila o columna | flex-direction | flex-direction: column; |
| Permetre que els elements salten a la línia següent | flex-wrap | flex-wrap: wrap; |
| Alinear horitzontalment (main axis) | justify-content | justify-content: center; |
| Alinear verticalment (cross axis) | align-items | align-items: flex-end; |
| Distribuir diverses línies | align-content | align-content: space-between; |
| Posar espai entre elements | gap | gap: 10px; |
| Reordenar visualment | order | order: -1; |
| Fer que un element ocupe més espai | flex-grow | flex-grow: 3; |
| Evitar que un element es reduïsca | flex-shrink | flex-shrink: 0; |
| Donar una mida base | flex-basis | flex-basis: 200px; |
| Establir grow + shrink + basis | flex | flex: 1 0 150px; |
| Alinear només un item | align-self | align-self: center; |