Nous allons pouvoir utiliser les propriétés suivantes pour déclarer un conteneur flexible et disposer nos différents éléments :
display : flex
nous permet de créer un conteneur flexible ;flex-direction
nous permet de choisir l’axe principal et la direction des éléments flexibles selon cet axe ;flex-wrap
nous permet de laisser la possibilité aux éléments flexibles qui dépassent du conteneur d’aller à la ligne ou sur une nouvelle colonne et de définir la direction des éléments selon l’axe secondaire ;order
permet de choisir l’ordre d’affichage des éléments ;justify-content
permet de définir l’alignement des éléments dans leur axe principal ;align-items
permet de définir l’alignement des éléments dans leur axe secondaire ;align-self
permet de définir l’alignement d’un élément en particulier dans son axe secondaire ;align-content
permet de définir l’alignement des lignes ou des colonnes selon l’axe secondaire ;flex-grow
permet de laisser la possibilité aux éléments flexibles de grossir pour absorber l’espace vide dans le conteneur ;flex-shrink
permet de laisser la possibilité aux éléments flexibles de rétrécir dans le conteneur ;flex-basis
permet de définir une taille de base pour les éléments flexibles.
En pratique, nous allons pouvoir recourir au modèle des boites flexibles pour résoudre simplement de nombreuses questions d’affichage et de positionnement qui pouvaient poser problème par le passé.
Exemples concrets d’utilisation du flexbox
Effectuer un centrage parfait
Pendant très longtemps, il a été très difficile d’obtenir un centrage parfait en toute circonstance pour un élément ou un ensemble d’éléments et notamment un centrage vertical.
Cela devient très facile avec le flexbox puisqu’on va pouvoir centrer les éléments dans leur axe principal et dans leur axe secondaire.
See the Pen Cours HTML CSS 13.5.1 by Pierre (@pierregiraud) on CodePen.
Ici, on centre le ou les éléments par rapport à leur axe principal dans leur conteneur avec justify-content : center
et on les centre également dans leur axe secondaire avec align-items : center
.
Créer un menu avec le flexbox
Dans les parties précédentes, je vous ai proposé de créer un menu horizontal simple puis un menu déroulant.
Pour que notre menu principal s’affiche de manière horizontale, nous avons utilisé la propriété float
.
Ensuite, pour que les éléments du menu s’affichent correctement, nous leur avons attribué une largeur égale à 100% divisée par le nombre d’éléments.
Cette méthode n’était pas parfaite, loin de là. En effet, imaginons qu’on modifie le nombre d’éléments dans le menu : il faudra alors modifier la largeur donnée à chaque élément de menu. De même, selon la taille de certains écrans, on aimerait pouvoir distribuer l’espace dans le conteneur d’une façon ou d’une autre. Nous allons pouvoir gérer tout cela facilement avec le flexbox.
See the Pen Cours HTML CSS 13.5.2 by Pierre (@pierregiraud) on CodePen.
Ici, on attribue un flex : 1 1 0
à nos éléments de menu. Cela signifie que nos différents éléments de menu vont tous avoir la même taille de base avec flex-basis : 0
et vont pouvoir grandir ou rétrécir pour absorber l’espace vide du menu ou pour faire de la place à de nouveaux éléments.
Grouper des éléments
Le flexbox va également nous permettre simplement de créer des groupes d’éléments et de les aligner d’un côté ou de l’autre du conteneur. Pour cela, nous allons utiliser la propriété margin
et sa valeur auto
qui va faire que la marge va consommer tout l’espace vide dans le conteneur.
See the Pen Cours HTML CSS 13.5.3 by Pierre (@pierregiraud) on CodePen.
Ici, on attribue un margin-left : auto
au troisième élément de notre menu. Cela fait que sa marge gauche va consommer tout l’espace vide du conteneur et va donc repousser l’élément et les éléments suivants sur la droite. Cela va être particulièrement utile pour la création de menus.
Styliser les formulaires
Imaginons que l’on souhaite créer un formulaire d’inscription à une newsletter. La seule information qu’on va demander aux utilisateurs va être leur adresse mail.
Ici, plutôt que d’afficher notre unique input
sur une ligne puis le bouton d’envoi du formulaire en dessous, on aimerait tout avoir sur la même ligne pour des questions d’ergonomie.
Cependant, pour que nos éléments de formulaire alignés s’affichent toujours bien, il va falloir qu’ils se redimensionnent les uns par rapport aux autres en fonction de l’espace disponible. On va pouvoir faire cela très simplement avec le flexbox.
See the Pen Cours HTML CSS 13.5.4 by Pierre (@pierregiraud) on CodePen.
Ici, on applique flex : 1 1 auto
à notre input de type email
afin que celui-ci se redimensionne en fonction des éléments autour et pour qu’il occupe toujours tout l’espace vide dans le conteneur.
Les limites du flexbox
Le modèle des boites flexibles est à l’heure actuelle l’un des modèles de disposition les plus puissants que l’on puisse utiliser. Cependant, comme ce modèle est relativement récent, l’implémentation n’est pas encore parfaite et certaines propriétés manquent pour le moment.
Cela va être notamment le cas pour la gestion des gouttières, c’est-à-dire de l’espace entre les éléments flexibles. En effet, par défaut, nos différents éléments flexibles vont venir se coller les uns aux autres.
Pour créer des gouttières, c’est-à-dire pour créer un espace entre ces éléments, j’ai jusqu’à présent utilisé la propriété margin
. Le problème ici est que cela va également créer un espace entre les éléments et le bord du conteneur, ce qui n’est pas toujours le comportement voulu.
Pour annuler cet espace, la solution actuellement admise est d’attribuer des marges négatives au conteneur qui vont venir contrebalancer les marges attribuées aux éléments flexibles.
Notez qu’on ne sera bientôt plus obligé d’utiliser cette technique puisque deux nouvelles propriétés qui vont nous permettre justement de créer des gouttières sont en train d’être ajoutées au modèle des boites : les propriétés row-gap
et column-gap
. Ces propriétés ne sont néanmoins pour le moment pas supportées par la plupart des navigateurs.
See the Pen Cours HTML CSS 13.5.5 by Pierre (@pierregiraud) on CodePen.