Pages

Affichage des articles dont le libellé est flex. Afficher tous les articles
Affichage des articles dont le libellé est flex. Afficher tous les articles

Flex en action

Code HTML


Tapez le code HTML suivant :

Pensez à utiliser .parent>.enfant*4>.enfant suivi de TAB dans votre éditeur (Emmet)

Code CSS


tapez le code CSS suivant :

Ajoutons la magie du calcul des marges



Ajoutons les propriétés de flex au contenu des blocs



Ajoutons la propriété de flexibilité aux blocs


Pensez à redimensionner votre fenêtre.

Flex en action

Revision

Voici quelques etudes de cas :

Liste de même taille
Plusieurs medias
Création d'un environnement à la bootstrap !

Test : flex;

Donner le code CSS à écrire dans le simulateur (donner en dessous) pour obtenir les cinq figures suivantes.

Par exemple pour la figure suivante :
on pourrait écrire :
.flex-conteneur { display :flex; padding : 10px 0; } .flex-conteneur *{ flex : 100%; }








Utiliser le simulateur ! 





1
2

Article : flex

bug : chrome

Il arrive que les navigateurs ne se comportent pas comme le demande la spécification :

Exemple  :
JS Bin on jsbin.com
 Version 49.0.2623.87 m de chrome : 
(version corrigé sur 51)

Internet explorer 11


Centrer : easy now !

      html, body {
        height: 100%;
      }
      body {
        display: flex;
        align-items: center;
        justify-content: center;
      }
      .container {
        width: 100%;
        text-align: center;
        font-size: 8em;
      }

TP

Dom : clonage


Le code utilise la balise <template> et le clonage.

JS Bin on jsbin.com Pour en savoir plus.

Correction examen 2015

Remarque : il s’agissait uniquement de ne pas écrire la propriété position : absolute.
cours https://jsbin.com/tisana/1/edit?html,css,output

les sous listes apparaissent en dessous en décalant le menu vers le bas et non sur le côté sans décalage.

selecteur
p + p + p https://output.jsbin.com/tisana/2/

 p[2] et p:nth-of-type(-n+2) https://output.jsbin.com/tisana/3/

p:nth-child(2) https://output.jsbin.com/tisana/4/

Création page

L'utilisation de flex est obligatoire.
https://output.jsbin.com/gikado/4/
https://output.jsbin.com/gikado/5/
https://output.jsbin.com/gikado/7/
https://output.jsbin.com/gikado/8
 Menu
code en action

Flex : en action

Voici un exemple de la force de Flex :

sur l'exemple suivant décoché le commentaire sur le body pour le rendre flexible.

-> fichier
Voici la source du code. Vous découvrirez comment définir par programmation la taille des colonnes.
 http://www.the-haystack.com/2015/03/05/conditional-multi-column-sublists/

Collapsed Items : avancé

http://dev.w3.org/csswg/css-flexbox-1/#flex
http://dev.w3.org/csswg/css-flexbox-1/#visibility-collapse

flex en action

-> fichier

Flex : A la loupe

Cas d'augmentation-

p:nth-of-type(2n+1) {//bleu
  flex : 1 1 25%; 
}

p:nth-of-type(2n) {//rouge
  flex : 1 1 50%; 
}

voir -> fichier test

Dans ce cas, la somme des pourcentage est inférieur à 100% (la taille du conteneur), il y a augmentation ; les chiffres rouges sont pris en compte.

Chaque bloc va augmenter proportionnellement de la même valeur.

Ainsi, si le body fait 1000 px, nous aurions eu le bloc bleu (25%) à 250 px et le bloc rouge (50%) à 500 px. Il y a une augmentation de 1000 - ( 250 + 500) = 250 px à répartir.

Cette augmentation de 250 px va se répartir sur 1/1+1 pour le bloc bleu et 1/1+1 pour le bloc rouge.

Nous pouvons appliquer la formule :

nouvelle taille = taille + ( augmentation * proportion)

Ainsi, pour le bloc bleu

nouvelle taille = 250 + ( 250  *1/2 ) = 375

Et, pour le bloc rouge

nouvelle taille = 500 + ( 250  *1/2 ) = 625




Autre cas 


p:nth-of-type(2n+1) {//bleu
  flex : 4 1 25%; 
}

p:nth-of-type(2n) {//rouge
  flex : 1 1 50%; 
}

Dans ce cas encore, la somme des pourcentages est inférieur à 100% (la taille du conteneur), il y a un étirement ; les chiffres rouges sont pris en compte.

Chaque bloc va augmenter proportionnellement de la même valeur.

Ainsi, si le body fait 1000 px, nous aurions eu le bloc bleu (25%) à 250 px et le bloc rouge (50%) à 500 px. Il y a une augmentation de 1000 - ( 250 + 500) = 250 px à répartir.

Cette augmentation de 250 px va se répartir sur 4/1+4 pour le bloc bleu et 1/1+4  pour le bloc rouge.

Nous pouvons appliquer la formule :

nouvelle taille = taille + ( augmentation * proportion)

Ainsi, pour le bloc bleu

nouvelle taille = 250 + ( 250  *4/5 ) = 450

Et, pour le bloc rouge

nouvelle taille = 500 + ( 250  *1/5) = 550



Fichier de test

Flex : A la loupe

Reprenons l'écriture avec des pourcentages

body {
  display : flex;
  flex-flow: row nowrap;
}

p:nth-of-type(2n+1) {//blue
  flex : 1 4 100%; 
}

p:nth-of-type(2n) {//red
  flex : 1 1 50%; 
}

Nous allons tenter de comprendre la situation.

fichier

Notons tout d'abord que la propriété nowrap impose que les blocs soient sur une ligne.

body {
  ...
  flex-flow: row nowrap;
}

Notons ensuite que le bloc blue fait 100% et que le bloc Rouge 50%, nous allons donc devoir les réduire.

Réécrivons notre code pour avoir un cas plus simple.

p:nth-of-type(2n+1) {//blue
  flex : 1 1 100%; 
}

p:nth-of-type(2n) {//red
  flex : 1 1 50%; 
}

Comme il y a réduction, nous nous intéressons aux valeurs rouge, Chaque bloc va se réduire proportionnellement de la même valeur.

Ramenons les pourcentages à des proportions :

100% -> 2
50%   -> 1

Le bloc bleu va donc compter pour 2 sur un total de 3
Le bloc rouge va compter pour 1 sur un total de 3

Ainsi, si le body fait 1000px, nous aurions eu le bloc bleu (100%) à 1000px et le bloc rouge (50%) à 500px. Il y a une réduction de 1000-(1000+500) = 500px.

Cette réduction de 500px va se répartir sur 2/3 pour le bloc bleu et 1/3 pour le bloc rouge.

Nous pouvons appliquer la formule :

nouvelle taille = taille - ( réduction * proportion)

Ainsi, pour le bloc bleu

nouvelle taille = 1000 - ( 500  *2/3 ) = 666

Et, pour le bloc rouge

nouvelle taille = 500 - ( 500  *1/3 ) = 333

Donner une taille au body de 1000px et vérifié le résultat.

←Fichier→



Cas suivant

Modifions le cas précédent en changeant la valeur de réduction du bloc bleu.

p:nth-of-type(2n+1) {//blue
  flex : 1 2 100%; 
}

p:nth-of-type(2n) {//red
  flex : 1 1 50%; 
}

Comme il y a réduction, nous nous intéressons aux valeurs rouge, Chaque bloc va se réduire non plus proportionnellement mais le bloc bleue va se réduire de fois plus de la même valeur.

Ramenons les pourcentages à des proportions :

100% -> 2
50%   -> 1

En prenant en compte le facteur de réduction.

Le bloc bleu va donc compter pour 2*2 sur un total de (2*2+1)
Le bloc rouge va compter pour 1 sur un total de (2*2+1)

Ainsi, si le body fait 1000px, nous aurions eu le bloc bleu (100%) à 1000px et le bloc rouge (50%) à 500px. Il y a une réduction de 1000-(1000+500) = 500px.

Cette réduction de 500px va se répartir sur 4/5 pour le bloc bleu et 1/5 pour le bloc rouge.

Nous pouvons appliquer la formule :

nouvelle taille = taille - ( réduction * proportion)

Ainsi, pour le bloc bleu :

nouvelle taille = 1000 - ( 500  * 4/5 ) = 600

Et, pour le bloc rouge :

nouvelle taille = 500 - ( 500  * 1/5 ) = 400


→fichier←

Finalement pour les valeurs
p:nth-of-type(2n+1) {
  flex : 1 4 100%;
}

p:nth-of-type(2n) {
  flex : 1 1 50%;
}

Les proportions seraient de 4*2/4*2+1 et de 1/9. Vérifiez avec le premier fichier test.

Flex : à la loupe

Nous allons étudier en détail le comportement FLEXIBLE des blocs en fonction de la taille de leur conteneur.

Prenons le cas de deux paragraphes contenus dans un bloc (le body).

Et donnons à chaque paragraphe les valeurs de flexibilité suivantes :

body {
  display : flex;
  flex-flow: row nowrap; //nowrap = une ligne !
}
p:nth-of-type(2n+1) { //bleu
  flex : 5 5 400px;
}

p:nth-of-type(2n) { //rouge
  flex : 1 1 400px;
}

Le fichier de test ( lien sur le fichier ) permet de faire varier la taille du conteneur pour observer la flexibilité des blocs.


Nous allons examiner trois cas :
  1. La place totale du conteneur est  <  à la somme de la taille de chaque bloc.
  2. La place totale du conteneur est  >  à la somme de la taille de chaque bloc.
  3. Egalité entre le contenu et le contenant

Cas 1 : Conteneur plus petit que le contenu !

Prenons par exemple un conteneur (body) de taille 400px.

Nous sommes dans le cas 1, où la taille du body ne permet pas de placer les deux blocs avec leur taille initiale de 400px.

Il faut donc réduire  la taille de chaque bloc.

Valeur de réduction : -400px(taille P1)-400px(taille P2)+400px(taille body) =  -400px.

Nous devons réduire les blocs(Pi) de 400px au total.

Les 400px(de chaque bloc) doivent être réduits mais proportionnellement.

Nous prenons le second coefficient de la propriété flex qui indique la valeur de réduction.

p:nth-of-type(2n+1) { //bleu
  flex : 5 5 400px;
}

p:nth-of-type(2n) { //rouge
  flex : 1 1 400px;
}

Le bloc bleu va se réduire de 5/(5+1) * réduction = 5/6 * 400 = 333.
Sa taille sera donc de 400-333 = 66.

Le bloc rouge va se réduire de 1/(1+5) * réduction = 1/6 * 400 = 66.
Sa taille sera de 400-66=334.

En action : 
a l'aide du fichier test, modifier la taille du body à 400px, et vérifier que les valeurs calculées correspondent à la simulation.

Cas 2 : Conteneur plus grand que le contenu !

Prenons par exemple un body de taille 1000px.

Nous sommes dans le cas 2, où la taille du body permet de placer les deux blocs avec leur taille initiale de 400px et de les agrandir.

Valeur de l'augmentation : -400px(taille B1)-400px(taille B2)+1000px(taille body) =  +200px.

Il faut donc les augmenter de 200px, mais proportionnellement aux valeurs indiquées par la première valeur de la propriété de flex.

p:nth-of-type(2n+1) { //bleu
  flex : 5 5 400px;
}
p:nth-of-type(2n) { //rouge
  flex : 1 1 400px;
}

Le bloc bleu va augmenter de 5/(1+5) * augmentation = 5/6*200 = 166
Sa taille sera donc de 400 + 166 = 566.

Le bloc rouge va augmenter de 1/(1+5) * augmentation = 1/6*200 = 33
Sa taille sera donc de 400 + 33 = 433.





Cas 3 : body = 800px


Remarque

si les valeurs de flex sont :

p:nth-of-type(2n+1) { //bleu
  flex : 5 5;
}
p:nth-of-type(2n) { //rouge
  flex : 1 1;
}

Nous aurons simplement à répartir 800px (la taille du body) en 5/5+1 *800px pour le bloc1 et 1/5+1 *800px pour le bloc 2.





Flex : en action

JS Bin

Flex : en action menu

Partons de la situation suivante →voir fichier, puis ajoutons

nav {
 ...
   justify-content: space-between;
}

fichier

Améliorons la situation en ajoutant du style (de haut vol)

 nav > a {
 ...
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
 }

fichier

Ajoutons le comportement flex

nav > a {
 ...
  text-align: center;
  flex : 1
}

Pensez à redimensionner votre page :
fichier

Flex : en action

Notez la différence de comportement de ces deux exemples :

-> fichier -> fichier
Notez aussi cette astuce !
footer {
    margin-top : auto;
}
-> fichier

Voir exemple complet : où l'on remarque que l'input "print" est toujours en bas du conteneur grace à la propriété margin-top !

-> fichier