1 of 145

Flexxxxxxxxxxxxxxxxxxx

2 of 145

La hauteur du premier bloc s'adapte au context ainsi que les marges entre les blocs

3 of 145

PLAN

  1. Flex est une spécification très puissante permettant de placer des blocs dans un espace.
  2. L’objectif est de rendre flexible les blocs pour s’adapter aux tailles des écrans.
  3. L’ordre d’apparition des blocs est rendu indépendant du flux très facilement.

4 of 145

plan

Il y a donc trois grandes parties

  1. le placement des blocs
  2. l'adaptation de la taille des blocs
  3. la priorité des blocs

5 of 145

Définition : conteneur

parent

Flex conteneur

enfant

Les enfants directs sont des flex-items

6 of 145

flex-conteneur

flex-item

HTML

<Flex conteneur>

<Flex item>

<p>

</Flex item>

<Flex item>

</Flex item>

</Flex conteneur>

7 of 145

Flex items

le bloc bleu est conteneur.

Les blocs verts sont des flex-items pour le bloc bleu.

8 of 145

Flex items

Le bloc rouge contenu dans le bloc vert n'est pas un flex item pour le bloc bleu. Il peut être éventuellement un flex item pour le bloc vert.

9 of 145

Flex à tous les étages !

Un bloc flex peut contenir un autre bloc flex qui peut contenir un bloc flex ...

10 of 145

Forme des blocs

Les formes ressemblent à des divisions rectangulaires.

11 of 145

Remarque

Forme : la propriété radius permettrait de simuler des ronds à partir de forme rectangulaire !

12 of 145

plan

0. Définitions

Il y a donc trois grandes parties

  • le placement des blocs
  • l'adaptation de la taille des blocs
  • la priorité des blocs

13 of 145

Placement

14 of 145

Placement des blocs

Le placement se fait soit en ligne soit en colonne.

15 of 145

Placement des blocs

Voici un placement en ligne.

1 2 3 4 5 6 7 ...

16 of 145

REmarque : Grid

Grid permet des placements sur les deux dimensions.

17 of 145

AXES

18 of 145

Définition : les axes

Les coordonnées cartésiennes sont renommées en axe principal (main) et axe secondaire (cross).

19 of 145

Définition

Deux cas de figure se présentent en fonction de la propriété flex-flow du bloc conteneur.

Flex-flow

Axe principale

Axe Secondaire

row

x

y

column

y

x

20 of 145

flex-direction

Flex-flow

Axe principale

Axe Secondaire

row

x

y

21 of 145

flex-direction

Flex-flow

Axe principale

Axe Secondaire

column

y

x

22 of 145

placement sur deux axes

Le placement se fait en deux étapes.

On place un bloc en priorité sur son axe principal puis sur son axe secondaire.

23 of 145

Exemple : flex-direction : row

24 of 145

Exemple : flex-direction : row

1) On choisit un placement sur l'axe principal

25 of 145

Exemple : flex-direction : row

2) On choisit un placement sur l'axe secondaire

26 of 145

Code

HTML et CSS

Ecriture d'un simulateur

27 of 145

HTML

Nous allons prendre le cas d'un flex conteneur avec deux flex-items.

28 of 145

Situation de départ

HTML

<div class="conteneur">

</div>

la propriété class permettra d'associer le style CSS.�La balise div peut être remplacée par toutes balises qui peut être parent : body, session, ul.�

29 of 145

Situation de départ

HTML

<div class="conteneur">

<div class="item"></div>

<div class="item"></div>

</div>

30 of 145

Situation de départ

HTML

<div class="conteneur">

<div class="item">item 1</div>

<div class="item">item 2 item 2</div>

</div>

31 of 145

Remarques

Nous allons appliquer des propriétés

au bloc-conteneur

aux flex-items

32 of 145

CSS

Appliquons au bloc conteneur la propriété flex.

CSS

.conteneur {

  • display: flex;
  • height: 50vh;

}

33 of 145

Display : flex

Les flex-items prennent la hauteur du conteneur

34 of 145

Display : flex

Les flex-items prennent la largeur de leur contenu.

35 of 145

Display : flex

ils se positionnent en ligne !

36 of 145

Bilan : Display : flex

37 of 145

Display : flex

En augmentant la hauteur du conteneur on augmente également la hauteur des flex-items.

38 of 145

Flex-direction

Le positionnement de base est en ligne.

On peut modifier ce comportement par défaut.

39 of 145

Flex-direction

La direction est un besoin à "l'international"

برافو فليكس

bravo flex

40 of 145

Flex direction

.conteneur {

  • display: flex;

}

est équivalent à

.conteneur {

  • display: flex;
  • flex-direction: row;

}

41 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row-reverse;

}

42 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: column;

}

43 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: column-reserve;

}

44 of 145

Résumé

.conteneur {

flex-direction: row | row-reverse | column | column-reverse;

}

45 of 145

Placement

Axe principal

46 of 145

Placement : axe principal

A l’aide de la propriété justify-content appliquée au conteneur on peut modifier le placement des blocs entre eux sur l’axe principal

47 of 145

word

48 of 145

Problématique

Comment se répartir l'espace libre disponible entre les blocs ?

49 of 145

Flex direction

.conteneur {

  • display: flex;

}

est équivalent à

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: flex-start;

}

50 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: flex-end;

}

51 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: center;

}

52 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: space-between;

}

53 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: space-around;

}

54 of 145

Flex direction

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: space-evenly;

}

55 of 145

Résumé

.container {

justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly | start | end | left | right

}

56 of 145

EOF

57 of 145

Placement

Axe secondaire

58 of 145

Bilan

Nous venons de voir comment placer les blocs sur l'axe principal

59 of 145

Placement sur l'axe secondaire

Placement sur l'axe secondaire

60 of 145

cas de l’alignement : axe secondaire

A l’aide de la propriété align-items appliquée au conteneur on peut déterminer l’alignement entre les blocs sur l’axe secondaire

61 of 145

Align-items

.conteneur {

  • display: flex

}

62 of 145

align-items

Nous allons voir comment on peut une fois fixé le comportement sur l'axe principal modifier le comportement sur l'axe secondaire.

63 of 145

Align-items

.conteneur {

  • display: flex;
  • align-items: flex-start;

}

64 of 145

Align-items

.conteneur {

  • display: flex;
  • align-items: flex-end;

}

65 of 145

Align-items

.conteneur {

  • display: flex;
  • align-items: center;

}

66 of 145

Align-items

.conteneur {

  • display: flex;
  • align-items: stretch;

}

67 of 145

Align-items

.conteneur {

  • display: flex;

}

est équivalent à

.conteneur {

  • display: flex;
  • align-items: stretch;

}

68 of 145

Align-items

.conteneur {

  • display: flex;

}

est équivalent à

.conteneur {

  • display: flex;
  • flex-direction: row;
  • justify-content: flex-start;
  • align-items: stretch;

}

69 of 145

Align-items

.conteneur {

  • display: flex;
  • align-items: baseline;

}

70 of 145

align-items: baseline

Comparaison :

71 of 145

Résumé

.container {

align-items: stretch | flex-start | flex-end | center | baseline | start | end | self-start |

}

72 of 145

Flex-wrap

73 of 145

flex-wrap (conteneur)

En cas de dépassement de la taille du conteneur, les blocs peuvent se mettre sur plusieurs lignes !

74 of 145

Cas

75 of 145

Cas

76 of 145

Cas de blocs sur plusieurs lignes !

Chaque ligne sera traitée séparément.

77 of 145

.conteneur {

  • display: flex;
  • flex-wrap: wrap;
  • flex-direction: row;
  • justify-content: space-around;

}

Chaque ligne sera traitée séparément.

78 of 145

EOF

79 of 145

align-content*

cette propriété intervient dans le cas de la répartition des blocs sur plusieurs lignes !

80 of 145

81 of 145

Résumé

.container {

align-content: flex-start | flex-end | center | space-between | space-around | space-evenly | stretch | start | end | baseline

}

82 of 145

Résumé

83 of 145

PLACEMENT DANS LE CONTENEUR

align-content

justify-content

84 of 145

PLACEMENT items

align-items

85 of 145

PLACEMENT propre

align-self

86 of 145

Flexible !

87 of 145

plan

Il y a donc trois grandes parties

  • le placement des blocs
  • l'adaptation de la taille des blocs
  • la priorité des blocs

88 of 145

Bloc flexible

Les blocs pourront adapter leur taille en fonction de la taille du conteneur !

89 of 145

Taille du conteneur

Comment s'adapte le bloc vert lorsque son bloc conteneur change de taille ?

90 of 145

flex

C'est au travers de la propriété flex sur les blocs-items que l'on va définir le comportement.

91 of 145

Flex : complexe

Il y a de nombreuses façons d'exprimer le comportement

flex: none

flex: <'flex-grow'>

flex: <'flex-basis'>

flex: <'flex-grow'> <'flex-basis'>

flex: <'flex-grow'> <'flex-shrink'>

flex: <'flex-grow'> <'flex-shrink'> <'flex-basis'>

référence MDN

92 of 145

Flex : complexe

Il y a de nombreuses façons d'exprimer le comportement

flex: none

flex: <'flex-grow'>

flex: <'flex-basis'>

flex: <'flex-grow'> <'flex-basis'>

flex: <'flex-grow'> <'flex-shrink'>

flex: <'flex-grow'> <'flex-shrink'> <'flex-basis'>

référence MDN

93 of 145

Flex : 3 valeurs

.flex-item {

flex : 1 1 auto;

}

94 of 145

Flex : 3 valeurs

.flex-item {

flex : 1 1 auto;

}

auto : Indique qu'une valeur est calculée de manière automatique par le navigateur.

95 of 145

auto

auto est la taille du contenu

96 of 145

Flex : 3 valeurs

.flex-item {

flex : 1 1 auto;

}

<'flex-grow'> indique le comportement si le conteneur est plus grand.

Ici la valeur est 1. Cette valeur donne un poids de pondération vis à vis des autres blocs

97 of 145

Flex : 3 valeurs

.flex-item {

flex : 1 1 auto;

}

<'flex-shrink'> indique le comportement si le conteneur est plus petit.

Ici la valeur est 1. Cette valeur donne un poids de pondération vis à vis des autres blocs

98 of 145

EOF

99 of 145

Flex : Exemples

Nous allons voir une série de cas !

100 of 145

Flex

.conteneur {

  • display: flex;

}

bloc1 {

flex: 1 1 auto;

}

101 of 145

Flex

.conteneur {

  • display: flex;

}

bloc1 {

flex: 1 1 auto;

}

102 of 145

Flex

.conteneur {

  • display: flex;

}

bloc1 {

flex: 1 1 auto;

}

103 of 145

Flex

.conteneur {

  • display: flex;

}

bloc1 {

flex: 10 1 auto;

}

Le résultat avec 10 serait le même que celui avec 1 !

104 of 145

Flex

.conteneur {

  • display: flex;

}

bloc1 {

flex: 1 1 auto;

}

105 of 145

106 of 145

Exemple avec deux blocs

107 of 145

Taille fixée à 100px

108 of 145

Taille fixée à 100px

.conteneur {

  • display: flex;

}

bloc {

flex: 1 1 100px;

}

109 of 145

Taille fixée à 100px

.conteneur {

  • display: flex;

}

bloc {

flex: 1 1 100px;

}

110 of 145

auto

.conteneur {

  • display: flex;

}

bloc {

flex: 1 1 100px;

}

100px+aug*1/2

100px+aug*1/2

111 of 145

remarque

.conteneur {

  • display: flex;

}

bloc {

flex: 10 1 100px;

}

100px+aug*10/20

Le résultat avec 10 (10/20) serait le même que celui avec 1 (½)!

100px+aug*10/20

112 of 145

EOF

113 of 145

Numériquement

Nous allons calculer l'augmentation (diminution) des blocs en fonction de la taille de leur conteneur !

Le conteneur est ici le body.

Et ceci avec des valeurs de flexibilité différentes entre les blocs.

114 of 145

Situation 1)

�body a pour taille 1000px. Il est le conteneur de deux blocs de taille initiale 300px et 100px.

bloc1 {� flex : 1 5 300px;�}�bloc2 {� flex : 2 1 100px;�}

Article

��

115 of 145

body = 1000px : Valeur de l'augmentation ?

bloc1 {� flex : 1 5 300px;�}�bloc2 {� flex : 2 1 100px;�}

body est plus grand que la somme des deux blocs.

L'augmentation potentielle est de [1000-300-100]= 600px

116 of 145

body = 1000px Répartition de cette augmentation

bloc1 {� flex : 1 5 300px;�}�bloc2 {� flex : 2 1 100px;�}

Le bloc1 va augmenter de 1/(1+2) * augmentation = 1/3*600 = 200px

La taille du bloc1 sera égale à (300 + 200)px = 500px��

117 of 145

Situation 2)

�body a pour taille 200px.

bloc1 {� flex : 1 5 300px;�}�bloc2 {� flex : 2 1 100px;�}

��

118 of 145

La diminution de [300+100-200]= 200px

�bloc1 {� flex : 1 5 300px;�}�bloc2 {� flex : 2 1 100px;�}�

Le bloc1 va diminuer de 5/(1+5) * diminution = 5/6*200 ≃ 160

Sa taille sera égale à (300 - 160)px = 140px��

119 of 145

Exemple avec deux blocs

cas où la valeur initiale est auto :

auto : Indique qu'une valeur est calculée de manière automatique par le navigateur.

120 of 145

auto

.conteneur {

  • display: flex;

}

bloc {

flex: 1 1 auto;

}

121 of 145

auto

.conteneur {

  • display: flex;

}

bloc {

flex: 1 1 auto;

}

auto+aug*1/2

auto+aug*1/2

Le bloc1 reste < au bloc2

122 of 145

EOF

123 of 145

Flex : complexe

Il y a de nombreuses façons d'exprimer le comportement

flex: none

flex: <'flex-grow'>

flex: <'flex-basis'>

flex: <'flex-grow'> <'flex-basis'>

flex: <'flex-grow'> <'flex-shrink'>

flex: <'flex-grow'> <'flex-shrink'> <'flex-basis'>

référence MDN

124 of 145

auto

.conteneur {

  • display: flex;

}

bloc{

flex: 1 1;

}

aug*1/2

aug*1/2

125 of 145

Proportion entre blocs

.conteneur {

  • display: flex;

}

bloc1{

flex: 1;

}

bloc2{

flex: 2;

}

2 : aug*2/3

1 : aug*1/3

126 of 145

👿Alias

Il existe de nombreux raccourcis d'écriture !

127 of 145

Des alias !

par défaut

flex: 0 1 auto

128 of 145

Des alias !

auto

flex: 1 1 auto

129 of 145

Des alias !

initial

flex: 0 1 auto

130 of 145

Des alias !

none

flex: 0 0 auto

131 of 145

🆒Des alias !

par défaut

flex: 0 1 auto

auto

flex: 1 1 auto

initial

flex: 0 1 auto

none

flex: 0 0 auto

132 of 145

Des alias ! <positive-number>

flex: 100%;

    • flex-grow: 1;
    • flex-shrink: 1;
    • flex-basis: 100%;

flex: 100px;

    • flex-grow: 1;
    • flex-shrink: 1;
    • flex-basis: 100px;

133 of 145

Des alias ! <positive-number>

flex: 1;

    • flex-grow: 1;
    • flex-shrink: 1;
    • flex-basis: 0%;

134 of 145

Etude de comportement

Nous allons essayer de comprendre le comportement des blocs en fonction de leur propriété et de la taille du conteneur.

135 of 145

none

flex: none

"flex: 0 0 auto"

Cas d'une augmentation du conteneur

🥷La taille du bloc "none" reste identique.

+

136 of 145

none

flex:none

"flex: 0 0 auto"

Cas d'une diminution du conteneur

🥷La taille du bloc "none" reste identique.

-

137 of 145

Testez vous connaissance ! AUTO

auto

"flex: 1 1 auto"

+

-

-

+

-

-

138 of 145

Testez vous connaissance ! Initial

initial

"flex: 0 1 auto".

-

=

+

-

139 of 145

PLAN

  1. Flex est une spécification très puissante permettant de placer des blocs dans un espace.
  2. L’objectif est de rendre flexible les blocs pour s’adapter aux tailles des écrans.
  3. L’ordre d’apparition des blocs est rendu indépendant du flux très facilement.

140 of 145

Ordre

141 of 145

order

Nous verrons en TD que la propriété order permet de définir l'ordre d'apparition des blocs dans le conteneur.

142 of 145

Outils

143 of 145

travail perso

144 of 145

EOF

145 of 145

Taille des colonnes