• Flexbox CSS3

    display : flex
    Ce nouveau venu a été conçu pour étendre le périmètre des boites «block» et «inline» en introduisant un nouveau modèle de boîte distinct, que l'on appelle "le Modèle de boîte flexible".
    L'idée principale est de donner à un élément contenant (container) la possibilité de changer les largeur et hauteur des éléments contenus (items), afin de remplir au mieux l'espace disponible, et s'adapter toutes les tailles d'écrans.

    On raisonne ici selon quatre possibilités principales :

    - Distribution horizontale ou verticale des éléments, avec passage à la ligne autorisé ou non,
    - Alignements et centrages horizontaux et verticaux, justifiés, répartis,
    - Réorganisation des éléments indépendamment de l'ordre du flux (DOM),
    - Gestion des espaces disponibles (fluidité).

    Flexbox s'établit ainsi :
    - Tout d'abord un "flex-container" permettant de créer un parent conteneur,
    - Un ou plusieurs "flex-item" qui sont les enfants directs du conteneur, quels qu'ils soient.

    Le "flex-container" initialise le modèle de boîte flexible et peut être n'importe quel élément HTML doté de la déclaration display: flex. Ses enfants deviennent alors automatiquement des éléments de type "flex-item" :

                    
    .container {
        display: flex;
    }
    
    div 01
    div 02
    div 03
    div 04
  • Distribution et Axe principal

    La distribution, c'est à dire le sens d'affichage horizontal ou vertical des éléments "flex-items" est définie par la propriété flex-direction dont les valeurs peuvent être :
    - row (distribution horizontale, valeur par défaut)
    - row-reverse (distribution horizontale inversée)
    - column (distribution verticale)
    - column-reverse (distribution verticale inversée)

    Cette propriété s'applique au "flex-container" et détermine l'axe principal du modèle de boîte flexible :

                    
    .container {
    	display: flex;
        flex-direction: column-reverse;
    }
    
    div 01
    div 02
    div 03
    div 04

    flex-wrap

    Cette propriété définit si le contenu sera distribué sur une seule ligne ou si les "flex-items" peuvent passer à la ligne.
    Les valeurs de flex-wrap sont :
    nowrap (les éléments ne passent pas à la ligne, valeur par défaut)
    wrap (les éléments passent à la ligne dans le sens de lecture)
    wrap-reverse (les éléments passent à la ligne dans le sens inverse)

                    
    .container {
        display: flex;
        flex-direction: row;
        flex-wrap:wrap;
    }
    .container > div {
    	max-width:400px;
    }
    
    div 01
    div 02
    div 03
    div 04

    À noter qu'il existe une propriété raccourcie flex-flow qui regroupe flex-direction et flex-wrap.

    /* affichage en ligne et passage à la ligne autorisé */
    .container {
    	display: flex;
        flex-flow: row wrap;
    }
    

  • Alignements

    Axes
    Chaque boîte suit deux axes : L'axe principal (main axis) sur lequel les éléments flex se suivent.
    La propriété flex-direction établit l'axe principal.
    L'alignement sur l'axe principal est définit par la propriété justify-content
    L'axe secondaire (cross axis) est perpendiculaire à l'axe principal.
    La propriété align-items établit l'alignement sur l'axe secondaire.

    Ces deux propriétés s'appliquent au "flex-container".

    axes flexbox axes flexbox

    Axe principal : justify-content

    Les alignements dans l'axe de lecture principal sont définis à l'aide de la propriété justify-content, dont les valeurs possibles sont :

    flex-start (éléments positionnés au début du sens de lecture, valeur par défaut)
    flex-end (éléments positionnés à la fin)
    center (position centrale)
    space-between (répartition "justifiée")
    space-around (variante de répartition "justifiée")

    .container {
    	display: flex;
        flex-flow: row wrap;
        justify-content: space-around;
    }
    
    div 01
    div 02
    div 03
    div 04

    Axe secondaire: align-items

    - La propriété align-items définit comment les éléments flex sont positionnés le long de l'axe secondaire, les valeurs sont :

    - flex-start (au début)
    - flex-end (à la fin)
    - center (au centre)
    - baseline (généralement identique à flex-start)
    - stretch (étirés dans l'espace disponible, valeur par défaut)

    .container {
    	display: flex;
        flex-flow: row wrap;
        justify-content: space-around;
     	align-items: flex-end;
        min-height:300px;
    }
    
    div 01
    div 02
    div 03
    div 04

    Traiter les cas particuliers : align-self

    - La propriété align-self definit comment un seul élément flex est aligné sur l'axe secondaire et surcharge le comportement par défaut défini par align-items.
    Cela permet de distinguer l'alignement d'un "flex-item" de ses frères. Les valeurs de cette propriété sont identiques à celles de align-items. /* seul le paragraphe sera à droite */

    .container {
    	display: flex;
        flex-flow: row wrap;
        justify-content: space-around;
     	align-items: stretch;
        min-height:300px;
    }
    .container > div:last-child {
    	align-self: flex-end;
    }
    
    div 01
    div 02
    div 03
    div 04
  • Flexbox & Propriété margin

    La propriété margin lorsqu'elle est affectée à un "flex-item" ouvre de nouvelles perspectives, notamment dans l'axe vertical puisque Flexbox n'est plus lié à un sens de lecture en particulier.

    Il devient possible de positionner un élément en bas de son conteneur à l'aide d'un margin-top: auto,
    ou mieux : centrer à la fois horizontalement et verticalement via un simple margin: auto.

    /* paragraphe centré horizontalement et verticalement */
    .container {
        display: flex;
    }
    .container > div {
        margin: auto;
    }
    
    div centrée
    /* paragraphe centré sans utilisation du margin */
    .container {
        display: flex;
        justify-content:center;
        align-items:center;
    }
    
    div centrée sans margin
  • Ordonnancement

    Une des fonctionnalités les plus innovantes du modèle Flexbox est de pouvoir réordonner chacun des éléments du DOM grâce à la propriété order.

    Les éléments dont la valeur est la plus forte se trouveront en bas de la pile. La propriété order s'applique aux "flex-items" et sa valeur initiale est 0.

    /* le premier de la liste s'affichera en bas de pile */
    li:first-of-type {
        order: 1;
    }
    
    • 01
    • 02
    • 03
    • 04
    .container {
    	display:flex;
    }
    .container > div:last-child {
            order:-1;
        }
    @media (min-width:800px) {
        .container > div:last-child {
            order:0;
        }
    }
    
    div 01
    div 02
    div 03
  • Flexibilité des items

    La notion de flexibilité constitue le fondement du module de positionnement Flexbox, et c'est là qu'intervient l'indispensable propriété flex.

    La propriété flex est un raccourci de trois propriétés, flex-grow, flex-shrink et flex-basis, qui s'appliquent aux "flex-items".
    Par défaut, les valeurs de ces propriétés sont : flex-grow: 0, flex-shrink: 1 et flex-basis: auto.

    /* Par défaut */
    .flex-item {
    	flex:0 1 auto;
    }
    

    Les fonctionnalités en détail :

    - flex-grow : capacité pour un élément à s'étirer dans l'espace restant disponible.
    La propriété flex-grow accepte une valeur sans unité qui sert de proportion.
    Si tous les items ont flex-grow défini à 1, chaque enfant aura le "même espace" dans le container. Si vous donnez à l'un des enfants une valeur de 2, cet enfant prendra deux fois plus de place que les autres.

    - flex-shrink : capacité pour un élément à se contracter si nécessaire.

    Pour rendre un élément flexible, il suffit de lui attribuer une valeur de flex-grow supérieure à zéro.
    Cet élément occupera alors l'espace restant au sein de son conteneur :

    /* .item03 occupera l'espace restant */
    .flexItem {
        flex: 1; /* flex:1 1 0 */
    }
    
    div 01
    div 02
    div 03

    Si chaque item est à flex:1 1 0;
    Ils occupent chacun : 1 ÷ (1 + 1 + 1) soit 1/3 de l'espace total.

    La valeur de flex-grow est proportionnelle, ce qui signifie qu'elle change en fonction des valeurs des autres flex-items.
    Si le premier item a un flex-grow de 2, il prend la même quantité d'espace que les deux autres réunis.
    La somme des valeurs est égale à 4, donc le premier item occupe 2 ÷ (2 + 1 + 1), c'est à dire 1/2
    et les deux autres : 1 ÷ (2 + 1 + 1) soit 1/4.

    /* .item03 occupera 2 fois plus d'espace */
    .flex-item {
    	flex:1 1 0;
    }
    #item01 {
        flex: 2 1 0;
    }
    
    div 01
    div 02
    div 03

    - flex-basis : taille initiale de l'élément avant que l'espace restant ne soit distribué.
    Une valeur de flex-basis : auto dimensionne l'élément selon sa propriété de dimension(width)

    Exemple avec un premier item en taille initiale de 400px et des items frères dimensionnés avec un basis de 200px.
    Le basis est utilisé ici pour donner une taille minimum aux blocs comme le ferait un min-width.

    .flex-item {
    	flex:1 1 200px;
    }
    #item02 {
        flex: 2 1 400px;
    }
    
    div 01
    div 02
    div 03
    .flexG2 {
    	flex:2 1 3rem;
    }
    .flex-item {
        flex: 1 1 0;
        margin:0.5rem;
        padding:0.5rem
    }
    
    div 01
    div 02
    div 03
    div 01
    div 02
    div 03

    Pour créer une grille justifiée, il peut être utile de mettre en place des classes telles que flexItem et flexG2 pour déterminer différentes valeurs de flex.
    Le basis de .flexG2 prend une valeur qui est la somme des marges de deux blocs pour avoir un alignement parfait.
    Flexbox ne prend pas en compte les marges dans son calcul des proportions, ce qui provoque un retour à la ligne.

    propriété gap

    Cette super propriété définit les espaces ( gouttières ) entre les lignes et les colonnes.
    Cette propriété s'applique aux conteneurs multicolonnes, flexbox et grid.
    Elle peut prendre 2 valeurs : row-gap et column-gap
    Si une seule valeur est définie elle s'applique entre les flex-items(column) et les lignes(row)

    div.flexContainer {
        display: flex;
        flex-flow: row wrap;
        gap: 1rem;
    }
    div.flex-item {
        flex: 1 1 50%;
        background-color: orangered;
        padding: 1rem;
        background-clip: content-box;
    }
    
    flex-item 1
    flex-item 2
    flex-item 3
    flex-item 4
  • Flex exemple

    >

    flex: initial

    flex : 0 1 auto; /* initial */
    
    • Salade
    • Tomate
    • Oignons
    • Choucroute
    • Picon bière
    flex : 1 1 0;
    

    flex: 1 (dernier enfant)

    • Salade
    • Tomate
    • Oignons
    • Choucroute
    • Picon bière

    flex: 1 (4è et 5è enfant)

    • Salade
    • Tomate
    • Oignons
    • Choucroute
    • Picon bière

    flex: 1 (tous)

    • Salade
    • Tomate
    • Oignons
    • Choucroute
    • Picon bière
  • EXOS

    Exos : Flexbox
    Exo 01 :
    Créer une section avec 6 articles contenant image et texte( Emmet : section>article*6>img+p>lorem )
    Disposer les articles en ligne et autoriser le retour à la ligne
    Aligner les horizontalement avec le même espace avant et après chaque article
    Aligner les verticalement afin qu'ils fassent tous la même hauteur
    Donner leur la possibilité de grandir et de se réduire avec une largeur comprise entre 350px à 600px
    Tester la flexibilité des éléments
    Ajouter un titre dans cette section et faite en sorte qu'il occupe toute la largeur.

    Exo 02 :
    Reprendre la maquette "Légumes du jardin"
    Intégrer le header avec Flexbox
    Correction Légumes du Marché

    Exo 03 :
    Reprendre la maquette zoning HTML5
    Positionner les différents éléments HTML avec le modèle flexbox

    Sections de la page identifiées par les balises
    Sections d'une page identifiées en HTML5

    Correction exo 03

    Reprendre votre projet.
    Modifier votre homepage avec les propriétés vues en cours :
    - Centrage horizontal/vertical du logo dans le header
    - Alignement des articles
    - Alignement des boites dans le footer
    Exemple zoning VDC