Gérer la direction des éléments flexibles ou flex items

Le flexbox est un modèle qui va nous permettre de contrôler avec précision la disposition de nos éléments.

Pour disposer nos éléments flexibles, il va déjà falloir définir un axe de direction des éléments principal et un axe secondaire.

Pour définir l’axe principal, nous allons pouvoir utiliser la propriété flex-direction ou la version raccourcie flex-flow en les appliquant au conteneur flexible.

L’objectif de cette leçon est de bien comprendre cette notion d’axe et d’apprendre à modifier la direction des éléments flexibles.

 

L’axe principal et la propriété flex-direction

La propriété flex-direction nous permet de définir l’axe principal des éléments flexibles. Nous allons utiliser cette propriété sur notre conteneur flexible.

Nous allons pouvoir choisir parmi les valeurs de direction suivantes :

  • row : Valeur par défaut. L’axe principal est l’axe horizontal et les éléments flexibles vont se placer en ligne, dans le sens de la lecture (de gauche à droite pour un français) ;
  • row-reverse : L’axe principal est l’axe horizontal et les éléments vont se placer en ligne. Cette fois-ci, les éléments se placent dans le sens inverse de la lecture ;
  • column : L’axe principal est l’axe vertical et les éléments vont se placer en colonne, en partant du début du conteneur vers la fin (du haut vers le bas par défaut) ;
  • column-reverse : L’axe principal est l’axe vertical et les éléments vont se placer en colonne, en partant de la fin du conteneur vers le début (du bas vers le haut par défaut).

Prenons immédiatement un premier exemple pour illustrer cela :

Support HTML pour exemple d'utilisation de la propriété flex-direction

On utilise la propriété CSS flex-direction pour définir la direction des éléments flexibles

On controle la direction des éléments flexibles avec la propriété CSS flex-direction

See the Pen Cours HTML CSS 13.2.1 by Pierre (@pierregiraud) on CodePen.

Nous définissons ici 4 conteneurs flexibles. Les conteneurs flexibles sont à priori identiques et contiennent chacun 3 éléments désormais flexibles par définition.

Nous passons ensuite une valeur de flex-direction différente à chaque conteneur flexible pour définir la direction des éléments flexibles et également l’axe principal.

Pour nos deux premiers conteneurs, l’axe principal sera l’axe horizontal. Les éléments flexibles vont ainsi se positionner en ligne, les uns à côté des autres.

Avec la valeur row, les éléments suivent le sens de la lecture : les éléments se positionnent de gauche à droite avec le premier élément flexible tout à gauche, puis le deuxième à sa droite et etc.

Avec la valeur row-reverse, les éléments se positionnent selon le sens inverse à la lecture : le premier élément sera positionné à droite, le deuxième à sa gauche et etc.

Pour nos deux derniers conteneurs flexibles, l’axe principal sera l’axe vertical. Les éléments flexibles vont ainsi se positionner en colonne, les uns au-dessous des autres.

La valeur column va faire se positionner les éléments à partir du début (haut) du conteneur et vers la fin (bas) de celuici. Ainsi, le premier élément flexible sera en haut du conteneur, le deuxième sera en dessous du premier et etc.

Avec la valeur column-reverse, les éléments flexibles vont continuer de se positionner en colonne mais à partir de la fin du conteneur et vers le début.

 

Gérer les dépassements des éléments flexibles du conteneur

Dans l’exemple précédent, j’ai choisi les dimensions de mes différents éléments de façon à ce que les éléments flexibles ne dépassent pas de leur conteneur.

Cependant, vous devez savoir que si les éléments flexibles occupent plus de place selon leur axe principal que leur conteneur, alors ils vont par défaut dépasser de celui-ci.

Cela est dû au fait que les éléments flexibles n’ont pas le droit par défaut d’aller à la ligne (si l’axe principal est l’axe horizontal) ou de se placer sur une autre colonne (si l’axe principal est l’axe vertical).

Support HTML pour exemple de disposition des éléments dans un modèle flexbox

On utilise flex-direction et flex pour définir la direction et la place prise par les éléments flexibles

Gestion de la direction et du dépassement des éléments flexibles avec flex-direction et flex

See the Pen Cours HTML CSS 13.2.2 by Pierre (@pierregiraud) on CodePen.

Dans l’exemple précédent, j’ai défini une dimension par défaut pour chacun de mes éléments flexibles égale à 35% de la taille du conteneur avec la propriété flex que nous étudierons plus tard.

Pour comprendre l’exemple ci-dessus, vous devez savoir que le flex : 0 0 35% va définir la largeur des éléments flexibles si l’axe principal est l’axe horizontal ou la hauteur de ces éléments si l’axe principal est l’axe vertical.

J’ai également ici défini une hauteur fixe pour nos deux conteneurs dont l’axe principal est l’axe vertical car sinon les éléments ne pourraient jamais dépasser. En effet, je vous rappelle que par défaut la hauteur d’un élément va dépendre de celle de ses enfants sauf si une hauteur explicite est précisée.

Nous avons donc finalement ici des éléments flexibles qui sont plus grands que leur conteneur (selon leur axe principal) et qui vont donc par défaut dépasser de celui-ci.

Pour éviter ce comportement souvent non souhaité, nous allons pouvoir utiliser la propriété flex-wrap qui va pouvoir donner la possibilité aux éléments flexibles d’aller à la ligne ou en colonne s’ils dépassent de leur conteneur.

Cette propriété va à nouveau s’appliquer au conteneur et accepte les valeurs suivantes :

  • nowrap : Valeur par défaut. Les éléments vont rester sur la même ligne ou sur la même colonne (selon leur axe principal) ;
  • wrap : Les éléments qui dépassent du conteneur vont avoir la possibilité d’aller à la ligne ou de se positionner sur une nouvelle colonne à partir du début du conteneur et en allant vers la fin de celui-ci (de haut en bas ou de gauche à droite par défaut);
  • wrap-reverse : Les éléments qui dépassent du conteneur vont avoir la possibilité d’aller à la ligne ou de se positionner sur une nouvelle colonne à partir cette fois-ci de la fin du conteneur et en allant vers le début (de bas en haut ou de droite à gauche par défaut).

Support HTML pour exemple d'utilisation de flex-wrap dans un modèle de boites flexibles

On utilise la propriété CSS flex-wrap pour autoriser les éléments flexibles à aller à la ligne

Gestion du dépassement des éléments flexibles avec flex-wrap

See the Pen Cours HTML CSS 13.2.3 by Pierre (@pierregiraud) on CodePen.

La direction des éléments de mon premier conteneur est définie avec flex-direction : row et on laisse la possibilité aux éléments d’aller à la ligne en partant du début du conteneur vers la fin avec flex-wrap : wrap. L’élément qui dépasse va donc être placé sous les autres, sur la gauche.

La direction des éléments du deuxième conteneur est également définie avec flex-direction : row mais cette fois-ci on laisse la possibilité aux éléments d’aller à la ligne en partant de la fin du conteneur vers le début avec flex-wrap : wrap-reverse.

Selon l’axe horizontal, le « début » du conteneur est sa première ligne tandis que la « fin » du conteneur est sa dernière ligne. Les éléments vont donc ici se positionner à partir du bas du conteneur et les éléments qui dépassent vont se positionner au-dessus.

La direction des éléments des troisième et quatrième conteneurs est définie avec flex-direction : row-reverse : les éléments vont se positionner en ligne à partir de la droite et vers la gauche.

On applique un flex-wrap : wrap à notre troisième conteneur, ce qui fait que les éléments vont pouvoir se positionner sur plusieurs lignes en partant du haut du conteneur et en allant vers le bas. Les éléments qui dépassent vont donc être renvoyés sur la ligne du dessous.

On applique un flex-wrap : wrap-reverse à notre troisième conteneur, ce qui fait que les éléments vont pouvoir se positionner sur plusieurs lignes en partant du bas du conteneur. Les éléments qui dépassent vont être renvoyés vers le haut du conteneur, sur une ligne supérieure.

Le même principe va s’appliquer pour les éléments des conteneurs flexibles dont la direction est définie avec column ou column-reverse.

Ici, la valeur wrap de la propriété flex-wrap va permettre aux éléments qui dépassent de se positionner sur une nouvelle colonne, en partant de la gauche et en allant vers la droite. Les éléments qui dépassent vont donc être renvoyés sur d’autres colonnes à droite des premiers éléments.

La valeur wrap-reverse va elle nous permettre de renvoyer les éléments qui dépassent sur une nouvelle colonne à gauche des premiers éléments.

 

La notation raccourcie flex-flow

Les deux propriétés flex-direction et flex-wrap peuvent être abrégées grâce à la propriété raccourcie flex-flow.

Si une valeur est omise, alors la valeur par défaut de la propriété correspondante sera utilisée à savoir row pour flex-direction et nowrap pour flex-wrap.

Support HTML pour exemple d'utilisation de flex-flow dans un modèle de boites flexibles

On peut utiliser flex-flow pour gérer la direction et le passage à la ligne des éléments flexibles

Flex-flow CSS est la notation abrégée de flex-direction et flex-wrap

See the Pen Cours HTML CSS 13.2.4 by Pierre (@pierregiraud) on CodePen.

 

L’ordre d’affichage des éléments flexibles dans le conteneur

En plus de définir une direction pour les éléments de notre conteneur flexible, nous allons également pouvoir choisir leur ordre d’affichage élément par élément grâce à la propriété order.

Nous allons appliquer order aux éléments flexibles et non au conteneur et allons pouvoir lui passer un nombre.

La valeur de order d’un élément va être comparée à celle des autres et l’élément possédant la plus petite valeur sera affiché en premier, celui possédant la deuxième plus petite valeur en deuxième et etc.

La valeur par défaut de order est 0 et si plusieurs éléments possèdent la même valeur pour leur propriété order ils seront affichés selon l’ordre d’écriture du code.

Support HTML pour exemple d'utilisation de order dans un modèle flexbox

On utilise la propriété CSS order dans un modèle flex pour gérer l'ordre des éléments flexibles

On peut choisir l'ordre d'affichage des éléments flexibles grâce à la propriété order du flexbox

See the Pen Cours HTML CSS 13.2.5 by Pierre (@pierregiraud) on CodePen.

Ici, nous avons deux conteneurs flexibles identiques possédant chacun 5 éléments. La seule différence entre nos deux conteneurs va être la direction de leur axe principal : l’axe principal de notre premier conteneur est horizontal selon une direction qui suit le sens de l’écriture (gauche à droite pour moi) tandis que l’axe principal de notre deuxième conteneur est horizontal selon une direction contraire au sens de l’écriture.

A chaque fois, on attribue un order : 4 au premier élément des conteneurs, un order : 2 au deuxième élément et un order : -1 au quatrième élément.

On ne définit pas de valeur pour la propriété order pour nos troisième et cinquième éléments. La valeur par défaut, 0, sera donc utilisée.

L’élément qui possède la valeur la plus petite pour sa propriété order est donc le quatrième élément qui sera affiché en premier puis vont suivre dans l’ordre d’écriture dans le code les troisième et cinquième élément puis le deuxième et enfin le premier.

Notez bien ici que l’ordre des éléments va dépendre de la direction de l’axe du conteneur flexible : pour notre deuxième conteneur, le début du conteneur se situe à droite et la fin à gauche. Le premier élément va donc s’afficher à droite, le deuxième à sa gauche et ainsi de suite vers la gauche.

Laisser un commentaire