Une introduction au module CSS Flexbox

CSS, malgré son plafond de compétences relativement faible, semble toujours avoir un tueur en vedette dans sa manche. Rappelez-vous comment les requêtes des médias ont rendu les présentations réactives possibles et ont révolutionné le développement frontal. Eh bien, aujourd’hui, nous allons parler d’un nouveau mode de présentation, appelé flexbox, une nouveauté de CSS3. Je suis sûr que vous êtes impatient d'y aller! Commençons après le saut.

Changements ultérieurs dans Techniques et logiciels

Certains aspects des applications ou techniques utilisées dans ce tutoriel ont changé depuis sa publication initiale. Cela pourrait le rendre un peu difficile à suivre. Nous vous recommandons de consulter ces didacticiels plus récents sur le même sujet:

  • Modifications de la Flexbox
  • Problème Github

Prise en charge de Flexbox CSS

Actuellement, la spécification CSS Flexbox est un brouillon et les choses vont changer! Les exemples abordés dans ce didacticiel risquent de ne pas fonctionner à l'avenir, car les navigateurs modifient leur implémentation de flexbox pour correspondre à la spécification. Le but de ce tutoriel est de vous fournir une compréhension de base de la flexbox CSS et de vous expliquer comment l'utiliser dans vos pages Web..

Veuillez noter que ce didacticiel utilisera des exemples webkit / non préfixés par le fournisseur par souci de brièveté. Consultez caniuse.com pour obtenir une liste des navigateurs prenant en charge le module flexbox et référencer les préfixes nécessaires dans vos projets, en conséquence..


Fond sur les modes de mise en page

CSS Flexbox est essentiellement un mode de mise en page. Il existe des modes de présentation dans CSS, et ils sont là depuis longtemps. Un exemple de mode de mise en page est bloc (par exemple, display: block). Les dispositions de bloc sont un excellent moyen de mettre en forme des documents entiers. De nombreux éléments sont traités par le navigateur comme des niveaux de bloc, par défaut. comprennent des éléments communs, tels que des paragraphes et des divs.

Parfois, lorsqu'un élément n'est pas bloqué, il est susceptible d'être en ligne. Les éléments de niveau en ligne incluent la balise d'ancrage, la balise d'entrée et la balise forte. Les outils de développement de Chrome vous permettent en fait d'afficher le "style calculé" d'un élément, ce qui est un excellent moyen de déterminer les propriétés et les valeurs CSS appliquées aux éléments non définis explicitement par le développeur..

Voici une astuce pour accéder au style calculé d'un élément à l'aide de la méthode window.getComputedStyle de JavaScript..

 var elem = document.querySelector ('h1 # someId'); window.getComputedStyle (elem) .display; //bloc

En dehors des modes de présentation en bloc et en ligne, CSS dispose également de modes de présentation en tableau et positionnés. La raison pour laquelle les modes de mise en page sont référencés est que flexbox est un nouveau mode de mise en page, ce qui permet une plus grande flexibilité lors de la mise en page..

La disposition de la boîte souple nous fournit des techniques simples pour dicter facilement la manière dont les articles doivent être disposés.


Comment utiliser Flexbox??

Pour forcer un élément à utiliser la mise en page flexbox, nous ajoutons le boîte souple valeur de la propriété display.

 #container display: flexbox; 

Par défaut, une flexbox est un élément de niveau bloc. nous pouvons définir un élément de niveau en ligne comme ceci:

 #container display: inline-flexbox; 

Comme dans l'exemple ci-dessus, vous souhaiterez appliquer la présentation de la flexbox au parent des enfants dont vous souhaitez contrôler le positionnement. Regardons simple, exemple en direct.

 
  • Un élément
  • Un autre article
  • Le dernier article
 ul / * Ancienne syntaxe * / display: -webkit-box; / * Nouvelle syntaxe * / display: -webkit-flexbox; 

Vous remarquerez que les éléments d’éléments de la liste sont maintenant horizontaux, de la même manière que leur rendu, si nous avions utilisé float: gauche. Les éléments d’éléments de la liste peuvent maintenant être appelés articles flexbox.

Remarque: un descendant direct d'une boîte flexible, qui est positionné de manière absolue, par ex. en utilisant position: absolue, ne peut pas être un élément flexbox, car il coupe le flux habituel.

Vous remarquerez peut-être que les éléments (les éléments d'élément de liste) ont pris un flux horizontal (la direction du flux est également appelée axe principal). Heureusement, nous sommes en mesure de contrôler ce flux (et donc ce qui est considéré comme l’axe principal) et d’éviter l’utilisation de flotteurs.!


Explorant flex direction

Nous pouvons appliquer le flex direction propriété et spécifiez la direction dans laquelle nous souhaitons que nos articles de boîte souple soient disposés. La propriété accepte ligne, ligne inverse, colonne et colonne inverse comme des valeurs. La valeur par défaut est rangée.

En utilisant un balisage similaire à l'exemple ci-dessus, nous pouvons ajouter une propriété CSS supplémentaire: paire de valeurs: (flex-direction: column)

 ul -webkit-flex-direction: column; 

Si vous travaillez bien, essayez de changer le colonne valeur sur le flex direction propriété à inversion de colonne, et observez comment les éléments de flexbox sont affichés dans une disposition en colonnes, mais dans l'ordre inverse.


Emballage avec flex-wrap

Par défaut, une flexbox est monoligne. Celui qui ne peut pas contenir ses enfants peut déborder en utilisant le flex-wrap propriété; nous pouvons ordonner à la flexbox de devenir multiligne, auquel cas les éléments flexbox peuvent envelopper. flex-wrap accepte les valeurs, maintenant (la valeur par défaut), emballage Et wrap-reverse.

Remarquez comment, dans la démo, les éléments sont bouclés, car ils ne peuvent pas être contenus dans leur petit 100px parent. À l’aide des outils de développement, essayez d’inverser la débordement caché et -webkit-flex-wrap morceaux. Sans le flex-wrap et débordement propriétés, les éléments débordent de leur parent.

Il y a un raccourci utile pour flex direction et flex-wrap, comme indiqué ci-dessous:

 direction de flexion: rangée; flex-wrap: nowrap; // En utilisant les deux valeurs ci-dessus avec le raccourci flex-flow, nous obtenons: flew-flow: row nowrap; // flex-direction: column; enveloppe souple: enveloppe; flex-flow: enroulement de colonne;

Un exemple rapide

Bien que ce ne soit certainement pas le plus beau du monde, cet exemple de menu montre quelques utilisations de la flexbox..

  • Une largeur de 300px a été placé sur la flexbox elle-même pour démontrer l'emballage.
  • Une idée générale pour un menu pourrait être d'utiliser les requêtes des médias afin de servir un menu convivial pour mobile, où direction de flexion: colonne pourrait avoir un sens.

Ce qui serait bien, c’est de demander aux éléments de la boîte souple de s’étaler et d’utiliser l’espace disponible - quelque chose comme cela. C'est ce que la propriété flex est pour.


Fléchissement

La flexion est la capacité du conteneur à modifier sa largeur ou sa hauteur pour occuper l'espace disponible. "

le fléchir la propriété est une fonctionnalité intéressante; il offre quelque chose de nouveau qui aurait été difficile à réaliser dans le passé.

Avec cette propriété, nous pouvons définir une taille préférée pour nos articles. N'oubliez pas que la propriété flex est appliquée aux éléments de la boîte de dialogue, pas à la boîte de dialogue elle-même. Le navigateur essaiera de définir la taille des éléments de la flexbox sur un par ligne. Il essaiera ensuite de répartir uniformément l'espace libre restant sur les éléments. Si nous examinons l'exemple de menu et utilisons les outils de développement pour découvrir la largeur calculée des éléments de la flexbox, nous verrons qu'il en est ainsi. 78px. Enquêtons plus loin…

Vous vous demandez probablement, "Comment les éléments de la boîte souple ont-ils gagné leur espace supplémentaire lorsque nous avons défini leur largeur préférée sur 60px?"

  • Dans la première ligne, il y a trois éléments, qui devraient être autour de 60pxflex propriété (c'est un total de 180px).
  • La largeur de la flexbox entière est 300px. Ça, moins 180px (la taille totale préférée des articles), est 120px. Cependant, il ne semble pas que nous ayons réellement 120px de l'espace libre.
  • Chaque élément de la boîte souple a un marge droite de 10px; c'est un total de 30px pour trois articles, nous laissant avec 90px de l'espace libre.
  • Mais attendez, chaque élément a aussi un rembourrage: 5px - c'est 5px de rembourrage en haut, à droite, en bas et à gauche. Donc, semblable au marge droite propriété, chaque article utilise 10px de rembourrage en ce qui concerne sa largeur. Nous sommes partis avec 60px de l'espace libre - enfin presque.
  • Chaque article a bordure: noir uni 1px - 1px à gauche et à droite. Un total de deux pixels par élément, donc, pour trois éléments, cela revient à 6px. Il nous reste maintenant 54px de l'espace libre.
  • Avec 54px d'espace libre, nous pouvons le distribuer également aux trois éléments de la première ligne - c'est 18px, par article, ce qui est maintenant logique pourquoi, lorsque nous fixons une préférence de 60px, la largeur calculée transformée en 78px.

Comme vous l'avez peut-être deviné, la dernière ligne (contenant l'élément "Contactez-nous") s'adapte à toute la largeur de la flexbox.

Les articles Flexbox peuvent avoir différentes largeurs; un article avec un fléchir de 2 est dit être deux fois plus flexible comme article avec un fléchir de 1. Ainsi, s’agissant de la distribution d’espace libre entre les deux éléments, l’article avec un fléchir de 1 sera donné la moitié de l'espace que l'élément avec un fléchir de 2 reçoit.


Commande

Flexbox nous permet de commander facilement certains éléments à l'aide de CSS, quel que soit leur ordre d'apparition dans le document. Voici un exemple rapide.

Compte tenu du balisage suivant:

 
  • Objet 1
  • Point 2
  • Point 3
 ul display: -webkit-flexbox;  ul li: nième enfant (1) -webkit-flex-order: 2; 

Nous pouvons cibler le premier élément d’élément de liste à l’aide de la pseudo-classe nth-child, puis appliquer le flex-order propriété à elle. Les éléments Flexbox sont, par défaut, à l'ordre 0. En plaçant le premier article de la liste à la commande 2, le navigateur affichera les éléments 2 et 3 en premier, suivis de l'élément 1.


Alignement

Nous sommes en mesure d’aligner des éléments de boîtes flexibles sur l’axe principal à l’aide du bouton flex-pack propriété. Cette propriété accepte les valeurs suivantes:

  • début
  • fin
  • centre
  • justifier
  • distribuer

La démonstration de ce didacticiel fournit des exemples des différents types d’alignement. En regardant l'exemple jsbin, nous pouvons voir que les éléments n'ont été centrés que sur un axe: l'axe principal. C’est essentiellement l’axe sur lequel sont placés les éléments de la flexbox.

Nous pouvons changer l’axe en ajustant la flex direction propriété. En le mettant à colonne, il devient évident que l'axe principal a changé. Afin d’affecter l’alignement de l’axe transversal (axe perpendiculaire à l’axe principal), nous pouvons utiliser flex-align.

Centrer un article

 

Je devrais être centré

 .flexbox display: -webkit-flexbox; -webkit-flex-pack: centre; -webkit-flex-align: center; largeur: 50%; hauteur: 100px; fond: orange;  .flexbox p bordure: 1px vert uni; rembourrage: 5px; 

Vérifiez définitivement la démo en direct si vous êtes confus.


Lectures complémentaires

  • flexiejs offre un support multi-navigateur pour flexbox.
  • Modernizr peut détecter le support de la flexbox.
  • html5rocks contient un tutoriel sur flexbox
  • Alex Russell, qui travaille sur Google Chrome, possède un ensemble intéressant de classes CSS pour l’utilisation de flexbox..
  • inserthtml propose un didacticiel amusant sur la spécification flexbox. Il comprend un grand ensemble de visuels pouvant vous aider à comprendre certains concepts..
  • Le livre Stunning CSS3 a une section sur flexbox.

Merci de votre lecture et assurez-vous de consulter caniuse.com pour obtenir une liste des navigateurs prenant en charge le module flexbox, ainsi que les préfixes des fournisseurs à référencer.