Deux Freelances, passionnés de CSS
Malik Baba Aïssa
Scrum master,
travaille tous les jours avec un kanban (~ une grosse grille)
Thomas Zilliox
Expert CSS,
a écrit un livre sur Flexbox
aux éditions le train de 13h37
<div class="parent">
<div class="enfant"></div>
<div class="enfant"></div>
<div class="enfant"></div>
<div class="enfant"></div>
...
</div>
Des specs inadaptés :
On a recours à des outils type Bootstrap.
Avant
.parent {
display: flex;
}
.enfant {
/* Deviennent automatiquement des éléments flexibles */
width: 100px;
}
Avec Flex
.parent {
display: flex;
}
.enfant {
width: 100px;
}
.enfant:nth-child(5) {
width: 300px;
}
Avec Flex
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 100px;
}
.enfant {
/* Deviennent automatiquement des éléments cellules */
}
Avec Grid
.parent {
display: grid;
grid-template-columns: repeat(4, 100px);
}
.enfant {
/* Deviennent automatiquement des éléments cellules */
}
Avec Grid
.parent {
display: grid;
grid-template-columns: repeat(4, 100px) 300px;
}
.enfant {
/* Deviennent automatiquement des éléments cellules */
}
Avec Grid
.parent {
display: grid;
grid-template-columns: repeat(4, 100px) 300px;
grid-gap: 20px;
}
.enfant {
/* Deviennent automatiquement des éléments cellules */
}
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Avec Flex
.parent {
justify-content: flex-start;
}
Avec Flex
.parent {
justify-content: flex-end;
}
Avec Flex
.parent {
justify-content: center;
}
Avec Flex
.parent {
justify-content: space-between;
}
Avec Flex
.parent {
align-items: flex-start;
}
Avec Flex
.parent {
align-items: flex-end;
}
Avec Flex
.parent {
align-items: center;
}
Avec Flex
.parent {
align-items: stretch;
}
Avec Grid
C'est pareil,
mais sans les préfixes !
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Avec Flex
.parent { display: flex; }
.enfant { width: 100px }
.enfant:nth-child(4) {
flex: 1;
}
Avec Flex
.parent { display: flex; }
.enfant { width: 100px }
.enfant:nth-child(4) {
flex: 1;
}
.enfant:nth-child(5) {
flex: 1;
}
Avec Flex
.parent { display: flex; }
.enfant { width: 100px }
.enfant:nth-child(4) {
flex: 1;
}
.enfant:nth-child(5) {
flex: 2;
}
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 100px 100px 1fr 100px;
}
.enfant {
/* rien */
}
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 100px 100px 1fr 1fr;
}
.enfant {
/* rien */
}
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 100px 100px 1fr 2fr;
}
.enfant {
/* rien */
}
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 1fr 1fr;
}
Avec Grid
.parent {
display: grid;
grid-template-columns: 100px 1fr 1fr;
grid-template-rows: 100px 200px;
}
Avec Flex
.parent {
display: flex;
flex-wrap: wrap;
}
.enfant {
width: 200px;
}
Avec Flex
.parent {
display: flex;
flex-wrap: wrap;
}
.enfant { width: 100px; }
.enfant:nth-child(3n + 2),
.enfant:nth-child(3n + 3) {
flex: 1;
}
Avec Flex
.parent { display: flex; flex-wrap: wrap; }
.enfant { width: 100px; }
.enfant:nth-child(3n + 2),
.enfant:nth-child(3n + 3) {
flex: 1;
min-width: 40%;
}
Avec Flex
.parent {
display: flex;
flex-direction: column;
}
.enfant {
height: 100px;
}
Avec Flex
.parent {
display: flex;
flex-direction: column;
flex-wrap: wrap;
}
.enfant {
min-height: 100px;
flex: 1;
}
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Avec Flex
.parent {
display: flex;
}
.enfant:nth-child(3) {
order: 1;
}
Avec Flex
.parent {
display: flex;
}
.enfant:nth-child(3) {
order: -1;
}
Avec Grid
.parent {
display: grid;
}
.enfant:nth-child(3) {
order: 1;
}
Avec Grid
.parent { display: grid; }
.enfant:nth-child(3) {
grid-row: 2;
}
Avec Grid
.parent { display: grid; }
.enfant:nth-child(3) {
grid-row: 2;
grid-column: 5;
}
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Positionnement | 0 | 1 |
De Flex
De Grid
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Positionnement | 0 | 1 |
Simplicité | 1 | 0 |
De Grid
De Flex
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Positionnement | 0 | 1 |
Simplicité | 1 | 0 |
Support | 1 | 0.5 |
De Grid
De Grid
De Grid
De Flex
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Positionnement | 0 | 1 |
Simplicité | 1 | 0 |
Support | 1 | 0.5 |
Dev Tools | 0 | 1 |
Flexbox proche
des applications mobiles / natives
Flex porté
en C/C++ par Facebook pour React Native
Feature | Flex | Grid |
---|---|---|
Colonnes | 1 | 2 |
Alignement | 1 | 1 |
Elasticité | 1 | 1 |
Multi-lignes | 0 | 1 |
Positionnement | 0 | 1 |
Simplicité | 1 | 0 |
Support | 1 | 0.5 |
Dev Tools | 0 | 1 |
Outside the web | 2.5 | 0 |
Total | 7.5 | 7.5 |
.enfant3 {
grid-column: span 2;
}
.parent {
grid-template-areas:
"header header"
"menu content"
"footer footer"
}
.enfant1 {
grid-area: content;
}
.enfant2 {
grid-area: menu;
}
.enfant3 {
grid-area: header;
}
...
.enfant2 {
grid-column: 3 / span 2;
grid-row: 2;
}
.enfant3 {
grid-column: 4;
grid-row: 1 / span 3;
}
.parent {
grid-auto-flow: row/column/dense
}
Grid
pour les gabarits complexes
Flex
pour les gabarits simples ou les composants (si application)
Aujourd'hui seul Flexbox
peut être utilisé sur IE10+
CSS Grid est un "bonus"
N'hésitez pas à venir au Village (espace animations à 10h) pour discuter de Flex et de Grid
Malik Baba Aïssa
@malik_ba
https://codepen.io/malikba
Thomas Zilliox
@iamtzi
https://tzi.fr
Flexbox :
https://bit.ly/play-flex
Grid :
https://bit.ly/play-grid
Flexbox :
https://flexboxfroggy.com/#fr
Grid :
https://cssgridgarden.com/#fr
Flexbox :
https://bit.ly/mdn-flex
Grid :
https://bit.ly/mdn-grid
Flexbox :
https://flexbox.io/
Grid :
https://cssgrid.io/
Des questions ?
Malik Baba Aïssa
@malik_ba
https://codepen.io/malikba
Thomas Zilliox
@iamtzi
https://tzi.fr