Slide 1

Slide 1 text

PLACE À LA FLEXBOX GUEULE DE BOIS !

Slide 2

Slide 2 text

Source : Nick Marchenko (Twitter) FLEXBOX
 DANS TES RÊVES : FLEXBOX
 DANS TON NAVIGATEUR:

Slide 3

Slide 3 text

Raphaël Goetter

Slide 4

Slide 4 text

FLEXBOX CHEAT SHEET parce que tu connais toutes les propriétés, toi ?

Slide 5

Slide 5 text

FLEX CONTAINER 1/2 display: flex; display: inline-flex; flex-wrap: nowrap; flex-wrap: wrap; flex-wrap: wrap-reverse; flex-direction: row; flex-direction: row-reverse; flex-direction: column; flex-direction: column-reverse; justify-content: flex-start; justify-content: center; justify-content: flex-end; justify-content: space-between; justify-content: space-around; BONUS : 
 flex-flow → flex-direction + flex-wrap

Slide 6

Slide 6 text

align-items: flex-start; align-items: center; align-items: flex-end; align-items: stretch; align-items: baseline; align-content: flex-start; align-content: center; align-content: flex-end; align-content: space-between; align-content: space-around; align-content: stretch; FLEX CONTAINER 2/2

Slide 7

Slide 7 text

FLEX ITEM order: 0; order: 1; order: -1; source : http://apps.workflower.fi/css-cheats/?name=flexbox align-self: auto; align-self: flex-start; align-self: center; align-self: flex-end; align-self: baseline; align-self: stretch; justify-self ? → nope flex-grow: 0; flex-grow: 1; flex-shrink: 0; flex-shrink: 1; flex-basis: auto; flex-basis: 50%;

Slide 8

Slide 8 text

QUIZ ! quelle est la valeur par défaut de flex ? flex: auto; flex: 1; flex: 0; flex: 0 1 0; flex: 1 1 auto; flex: 0 1 auto;

Slide 9

Slide 9 text

PRIORITÉS COMPLEXES Je suis flex-wrap, dois-je laisser passer flex-shrink ?

Slide 10

Slide 10 text

width flex-basis .flex-item { flex-basis: 500px; width: 250px; }

Slide 11

Slide 11 text

FIGHT ! width flex-basis

Slide 12

Slide 12 text

width flex-basis FLEX-BASIS WINS !

Slide 13

Slide 13 text

flex-basis: auto; width: valeur; flex-basis: valeur; flex-grow | flex-shrink flex-wrap max-width min-width PRIORITÉS DANS FLEXBOX

Slide 14

Slide 14 text

CONCRÈTEMENT ?

Slide 15

Slide 15 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; }

Slide 16

Slide 16 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; } .flex-item { width: 50% } flex-basis: auto; width: valeur; flex-basis: valeur; flex-grow | flex-shrink flex-wrap max-width min-width

Slide 17

Slide 17 text

.flex-container { display: flex; } .flex-item { width: 150% } Salade Tomate Oignon Picon bière flex-basis: auto; width: valeur; flex-basis: valeur; flex-grow | flex-shrink flex-wrap max-width min-width

Slide 18

Slide 18 text

flex-basis: auto; width: valeur; flex-basis: valeur; flex-grow | flex-shrink flex-wrap max-width min-width .flex-container { display: flex; flex-wrap: wrap; } .flex-item { width: 150% } Salade Tomate Oignon Picon bière

Slide 19

Slide 19 text

SUPER « une question de taille… » source image QUIZ !

Slide 20

Slide 20 text

.flex-item { flex: 1; width: 250px; } 1000px TAILLE 1

Slide 21

Slide 21 text

.flex-item { flex: 1; width: 250px; } 1000PX flex-grow le force à remplir l’espace restant 1000px TAILLE 1

Slide 22

Slide 22 text

.flex-item { flex-basis: 500px; width: 250px; } 1000px TAILLE 2

Slide 23

Slide 23 text

.flex-item { flex-basis: 500px; width: 250px; } 500PX flex-basis l’emporte sur width 1000px TAILLE 2

Slide 24

Slide 24 text

.flex-item { flex-basis: auto; width: 250px; } 1000px TAILLE 3

Slide 25

Slide 25 text

.flex-item { flex-basis: auto; width: 250px; } 250PX width l’emporte sur flex-basis: auto 1000px TAILLE 3

Slide 26

Slide 26 text

.flex-item { flex-basis: 500px; width: 250px; min-width: 750px; } 1000px TAILLE 4

Slide 27

Slide 27 text

750PX .flex-item { flex-basis: 500px; width: 250px; min-width: 750px; } min-width l’emporte sur width et flex-basis 1000px TAILLE 4

Slide 28

Slide 28 text

.flex-item { flex-basis: 500px; flex-shrink: 1; min-width: 1250px; } 1000px TAILLE 5

Slide 29

Slide 29 text

1250PX .flex-item { flex-basis: 500px; flex-shrink: 1; min-width: 1250px; } min-width l’emporte systématiquement 1000px TAILLE 5

Slide 30

Slide 30 text

.flex-item { flex-basis: 0; flex-shrink: 0; width: 250px; } 1000px TAILLE 6

Slide 31

Slide 31 text

0 .flex-item { flex-basis: 0; flex-shrink: 0; width: 250px; } ⚠ il prend au-moins la taille minimale du contenu 1000px TAILLE 6

Slide 32

Slide 32 text

1000px .flex-item { width: 500px; flex-basis: 1250px; min-width: 750px; flex-shrink: 0; flex-grow: 1; } TAILLE 7

Slide 33

Slide 33 text

1250PX flex-basis (et min-width) s’appliquent .flex-item { width: 500px; flex-basis: 1250px; min-width: 750px; flex-shrink: 0; flex-grow: 1; } 1000px TAILLE 7

Slide 34

Slide 34 text

EN DÉTAIL : FLEX-GROW, FLEX-SHRINK, LE CALCUL SAVANT

Slide 35

Slide 35 text

FLEX-GROW facteur d’agrandissement si espace restant dans le flex-container Salade Tomate Oignon .salade { flex-grow: 0; } .tomate { flex-grow: 0; } .oignon { flex-grow: 0; }

Slide 36

Slide 36 text

FLEX-GROW facteur d’agrandissement si espace restant dans le flex-container Salade Tomate Oignon .salade { flex-grow: 0; } .tomate { flex-grow: 1; } .oignon { flex-grow: 0; }

Slide 37

Slide 37 text

facteur d’agrandissement si espace restant dans le flex-container Salade Tomate Oignon .salade { flex-grow: 1; } .tomate { flex-grow: 2; } .oignon { flex-grow: 0; } FLEX-GROW

Slide 38

Slide 38 text

facteur de rétrécissement si espace négatif dans le flex-container Salade Tomate Oignon * {flex-basis: 500px;} .salade { flex-shrink: 0; } .tomate { flex-shrink: 0; } .oignon { flex-shrink: 0; } FLEX-SHRINK

Slide 39

Slide 39 text

facteur de rétrécissement si espace négatif dans le flex-container * {flex-basis: 500px;} .salade { flex-shrink: 0; } .tomate { flex-shrink: 1; } .oignon { flex-shrink: 0; } Salade Tomate Oignon FLEX-SHRINK

Slide 40

Slide 40 text

facteur de rétrécissement si espace négatif dans le flex-container * {flex-basis: 500px;} .salade { /* rien */
 } .tomate { flex-shrink: 1; } .oignon { flex-shrink: 0; } Salade Tomate Oignon FLEX-SHRINK

Slide 41

Slide 41 text

CALCUL DE FLEX-GROW-SHRINK accroche-toi bien ! Salade Tomate Oignon 1 On calcule l’Espace Restant Déterminé par la somme des flex-basis (ou des width, ou des min|max-width) 2 Résultat positif ou négatif ? Cas 1 : si l’espace est positif, alors flex-grow s’applique Cas 2 : si l’espace est négatif, alors flex-shrink s’applique 3 Comptez-vous ! Cas 1 : on compte le nombre de flex-grow présents et leur valeur totale Cas 2 : on compte le nombre de flex-shrink présents et leur valeur totale

Slide 42

Slide 42 text

4 on applique simplement la formule (ici pour flex-grow) :

Slide 43

Slide 43 text

O RLY ?

Slide 44

Slide 44 text

CONCRÈTEMENT ? sérieux, t’as pas compris ?!

Slide 45

Slide 45 text

Salade Tomate 1 On calcule l’Espace Restant flex: 1 est égal à flex: 1 1 0, donc la somme des flex-basis vaut 0 et l’Espace Restant est de 1000px 2 Somme des flex-grow flex-grow identique —> répartition équitable —> +500px chacun (qu’ils ajoutent à leur flex-basis) 3 Calcul la taille finale de chaque élément est donc flex-basis+500px , soit 500 px. flex: 1; flex: 1; 1000px

Slide 46

Slide 46 text

Salade Tomate 1 On calcule l’Espace Restant La somme des flex-basis vaut 700px et l’Espace Restant est de 300px 2 Somme des flex-grow répartition : 
 2/3 de 300px pour le premier, 1/3 de 300px pour le 2è 3 Calcul la taille finale de chaque élément : 500px et 500px flex: 2 0 300px; flex: 1 0 400px; 1000px

Slide 47

Slide 47 text

Flexbox t’aide à construire des mondes merveilleux ! ON EN A GROW !

Slide 48

Slide 48 text

LES BUGS DE FLEXBOX Hey salut IE, comment ça va bien ?

Slide 49

Slide 49 text

FLEXBUGS la bible des bugs de Flexbox https://github.com/philipwalton/flexbugs

Slide 51

Slide 51 text

PAS DE BOX-SIZING DANS FLEX-BASIS le modèle de boîte box-sizing: border-box n’est pas appliqué sur la propriété flex-basis. Les padding et border s’ajoutent donc à la taille. IE10 - IE11 symptôme : remplacer flex-basis par width ou height, ou ajouter un conteneur supplémentaire sans padding / border solution : concerne : 2

Slide 52

Slide 52 text

PAS DE CALC () DANS FLEX-BASIS calc() n’est pas reconnu au sein de flex-basis ou flex. 
 Exemples : flex:0 0 calc(100%/3) ou flex-basis: calc(100%/3) IE10 - IE11 symptôme : ben… pas vraiment, non solution : concerne : 3

Slide 53

Slide 53 text

UNITÉ DE FLEX-BASIS sur IE10-IE11, flex-basis nécessite une unité, même pour la valeur 0 :
 donc flex: 1 1 0; n’est pas reconnu par exemple IE10-IE11 symptôme : toujours spécifier une unité à flex-basis, ex. flex: 1 1 0%; et pas flex: 1 1 0; concerne : solution : 4

Slide 54

Slide 54 text

VALEUR PAR DÉFAUT DE FLEX-SHRINK sur IE10, flex-shrink vaut 0 par défaut et non 1, donc :
 par défaut un flex-item IE10 vaut flex: 0 0 auto; et non flex: 0 1 auto; IE10 symptôme : toujours spécifier la valeur de flex-shrink, ex. flex: 1 1 0%; et pas flex: 1; solution : concerne : 5

Slide 55

Slide 55 text

You shall not use Flexbox. ‟ — Internet Explorer 9

Slide 56

Slide 56 text

TRUCS BIZARRES, COURANTS, PAS VRAIMENT DES BUGS, MAIS NÉANMOINS CHIANTS DANS FLEXBOX

Slide 57

Slide 57 text

RATIO D’IMAGE CASSÉ TAILLE MINIMALE GÊNANTE LARGEURS FAUSSÉES http://www.hadoukenshoryuken.com

Slide 58

Slide 58 text

RATIO D’IMAGE CASSÉ

Slide 59

Slide 59 text

div { display: block; } img { max-width: 100%; height: auto; }

Slide 60

Slide 60 text

j’ai réduit ma fenêtre div { display: block; } img { max-width: 100%; height: auto; }

Slide 61

Slide 61 text

div { display: flex; } img { max-width: 100%; height: auto; }

Slide 62

Slide 62 text

div { display: flex; } img { max-width: 100%; height: auto; } j’ai réduit ma fenêtre

Slide 63

Slide 63 text

div { display: flex; align-items: flex-start; } img { max-width: 100%; height: auto; }

Slide 64

Slide 64 text

= Codepen or didn’t happen div { display: flex; align-items: flex-start; div { display: flex; flex-direction: column; }

Slide 65

Slide 65 text

TAILLE MINIMALE http://www.hadoukenshoryuken.com

Slide 66

Slide 66 text

div { display: flex; }

Slide 67

Slide 67 text

div { display: flex; } p { word-wrap: break-word; }

Slide 69

Slide 69 text

http://www.hadoukenshoryuken.com div { display: flex; } p { word-wrap: break-word; } a { /* rien */ } j’ai réduit ma fenêtre

Slide 70

Slide 70 text

http://www.hadouken
 shoryuken.com div { display: flex; } p { word-wrap: break-word; min-width: 0; } a { /* rien */ } Codepen or didn’t happen

Slide 71

Slide 71 text

To provide a more reasonable default minimum size for flex items, this specification introduces a new auto value as the initial value of the min-width and min-height ‟ — les spécifications W3C

Slide 72

Slide 72 text

QUI ? http://www.alsacreations.com/ • éléments « remplacés » : • • • • éléments de formulaire : • • • et aussi : • , • mot longs (URL) les flex-items

Slide 73

Slide 73 text

LARGEURS FAUSSÉES lorem elsass ipsum bière choucroute picon kouglof carola wurscht knacks grumbere hopla gal ! lorem elsass ipsum bière choucroute picon kouglof carola wurscht picon kouglof carola wurscht picon kouglof lorem elsass ipsum bière choucroute picon kouglof carola wurscht

Slide 74

Slide 74 text

.flex-container { display: flex; } .premier { /* rien de spécial */ } .deuxieme { /* rien de spécial */ } .flex-container .deuxieme .premier lorem elsass ipsum bière choucroute picon kouglof carola wurscht knacks grumbere hopla gal ! lorem elsass ipsum bière choucroute picon kouglof carola wurscht picon kouglof carola wurscht picon kouglof lorem elsass ipsum bière choucroute picon kouglof carola wurscht choucroute picon kouglof carola wurscht

Slide 75

Slide 75 text

lorem elsass ipsum bière choucroute picon kouglof carola wurscht knacks grumbere hopla gal ! lorem elsass ipsum bière choucroute picon kouglof carola wurscht picon kouglof carola wurscht picon kouglof lorem elsass ipsum bière choucroute picon kouglof carola wurscht choucroute picon kouglof carola wurscht .flex-container { display: flex; } .premier { /* rien de spécial */ } .deuxieme { width: 50%; } flex: 0 1 auto; flex: 0 1 auto 50%;

Slide 76

Slide 76 text

.flex-container { display: flex; } .premier { flex: 1; } .deuxieme { width: 50%; } flex: 1 1 auto 0; flex: 0 1 auto 50%; lorem elsass ipsum bière choucroute picon kouglof carola wurscht knacks grumbere hopla gal ! lorem elsass ipsum bière choucroute picon kouglof carola wurscht picon kouglof carola wurscht picon kouglof lorem elsass ipsum bière choucroute picon kouglof carola wurscht choucroute picon kouglof carola wurscht

Slide 77

Slide 77 text

c’est pas tous les jours facile, hein ? :p ‟ — les spécifications W3C (libre interprétation)

Slide 78

Slide 78 text

bon alors pourquoi Flexbox c’est quand même vachement bien ?

Slide 79

Slide 79 text

FLEXBOX ET LES GRILLES source

Slide 80

Slide 80 text

Salade Tomate Oignon Picon bière .flex-container { display: block; }

Slide 81

Slide 81 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; }

Slide 82

Slide 82 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; } .flex-item { flex: 1; }

Slide 83

Slide 83 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; } .flex-item { flex: 1; } .flex-item:not(:first-child) { margin-left: 1rem; } ⚠ pas de multi-lignes possible

Slide 84

Slide 84 text

flex: 1; est une méthode idéale pour une disposition mono-ligne. ‟ — moi, à l’instant

Slide 85

Slide 85 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; } (je veux 2 colonnes) .flex-item { flex-basis: calc(100% / 2); }

Slide 86

Slide 86 text

Salade Tomate Oignon Picon bière .flex-container { display: flex; flex-wrap: wrap; } .flex-item { flex-basis: calc(100% / 2); } (je veux 2 colonnes)

Slide 87

Slide 87 text

.flex-container { display: flex; flex-wrap: wrap; } .flex-item { flex-basis: calc(100% / 3); } (je veux 3 colonnes) Salade Tomate Oignon Picon bière ❤ pas de whitespace
 ❤ pas de sortie du flux

Slide 88

Slide 88 text

‟Les grilles Flexbox, c’est pas parfait mais c’est toujours mieux que float et inline- block. — moi, mais je dis ça je dis rien

Slide 89

Slide 89 text

No content

Slide 90

Slide 90 text

https://github.com/Heydon/fukol-grids la grille de 93 octets .fukol-grid { display: flex; flex-wrap: wrap; margin: -0.5em;
 } .fukol-grid > * { flex: 1 0 10em; margin: 0.5em; }

Slide 91

Slide 91 text

FLEXBOX ET LES PATTERNS

Slide 92

Slide 92 text

SPACE-BETWEEN 1

Slide 93

Slide 93 text

.media { display: flex; justify-content: space-between; } Flexbox et space-between :

Slide 94

Slide 94 text

.header { display: flex; justify-content: space-between; } SPACE-BETWEEN ❤

Slide 95

Slide 95 text

L’OBJET « MEDIA » 2

Slide 96

Slide 96 text

source : philipwalton

Slide 97

Slide 97 text

‟L’objet « media » a fait économiser des 100aines de lignes de code sur Facebook. — Nicole Sullivan, OOCSS source

Slide 98

Slide 98 text

source : dna.fr (2012)

Slide 99

Slide 99 text

source : lemonde.fr (2016)

Slide 100

Slide 100 text

.media { display: flex; align-items: flex-start; } .media-body{ flex: 1; } Objet « Media » en Flexbox : .media--reverse { flex-direction: row-reverse; } .media-figure--center { align-self: center; } Objet « Media » (variantes) :

Slide 101

Slide 101 text

L’OBJET « AUTOGRID » 3

Slide 102

Slide 102 text

démo : CodePen article sur CSS-tricks

Slide 103

Slide 103 text

No content

Slide 104

Slide 104 text

ENCORE !

Slide 105

Slide 105 text

.autogrid { display: flex; } .autogrid > * { flex: 1; } Objet « Autogrid » : .autogrid--gutter > *:not(:first-child) { margin-left: 1rem; } .autogrid-cell--big { flex: 2; } Objet « Autogrid » (variantes) :

Slide 106

Slide 106 text

‟L’objet « autogrid » a sauvé 1337 claviers et conservé 300000 cheveux de développeurs. — Moi, parce que j’adore m’auto-citer

Slide 107

Slide 107 text

IL VOIT DU FLEXBOX PARTOUT !

Slide 108

Slide 108 text

PERNOD-RICARD .header { display: flex; justify-content: space-between; }

Slide 109

Slide 109 text

CDISCOUNT - YAHOO! .header { display: flex; justify-content: space-between; } .search{ display: flex; } .search-input{ flex: 1; min-width: 0; } .media{ /* toi-même tu sais */ }

Slide 110

Slide 110 text

ASANA .task-header { display: flex; justify-content: space-between; } .push-right { margin-left: auto; } .task-item { display: flex; align-items: center; } .task-item--is-important{ order: -1; }

Slide 111

Slide 111 text

TWEETDECK .col-header { display: flex; justify-content:
 space-between; } .nav-footer{ margin-top: auto; } .media{ /* toi-même tu sais */ }

Slide 112

Slide 112 text

3000% DE TEMPS ÉCONOMISÉ FLEX: 1 SPACE-BETWEEN + MARGIN AUTO + OBJET MEDIA + OBJET AUTOGRID + (source : Francis Lalanne)

Slide 113

Slide 113 text

.flex-container { display: flex; flex-flow: column nowrap; align-items: space-between; flex-direction: row; }
 .flex-item { flex: 1; display: block; align-content: center; flex-shrink: 1; float: left; clear: both; z-index: -1; bottom: 1em; vertical-align: top; width: 250px; height: 250px; } QUIZ ! quelles déclarations n’ont aucun effet ? 
 (= ne s’appliquent pas, ou ne changent pas les valeurs par défaut)

Slide 114

Slide 114 text

OK maintenant I know Flexbox … jusqu’à demain

Slide 115

Slide 115 text

RESSOURCES

Slide 116

Slide 116 text

LIVRE FLEXBOX http://goetter.fr/livres/flexbox/ ben ouais fallait bien le caser

Slide 117

Slide 117 text

https://github.com/afonsopacifer/awesome-flexbox toutes les ressources Flexbox AWESOME FLEXBOX

Slide 118

Slide 118 text

FLEXIBILITY https://github.com/10up/flexibility .container { -js-display: flex; display: flex; } Flexbox pour IE8 - IE9

Slide 119

Slide 119 text

FLEXBOX PATTERNS http://www.flexboxpatterns.com/ composants avec Flexbox

Slide 120

Slide 120 text

un micro-grille en Flexbox GRILLADE http://grillade.knacss.com/

Slide 121

Slide 121 text

UNE FORMATION ? formations.alsacreations.fr

Slide 122

Slide 122 text

MERCI ! @goetter alsacreations.fr