Designing Layouts: The New Superpowers of CSS

A presentation at An Event Apart - Boston 2017 in May 2017 in Boston, MA, USA by Jen Simmons

Slide 1

Slide 1

DESIGNING LAYOUTS: THE NEW SUPERPOWERS OF CSS WITH JEN SIMMONS

Slide 2

Slide 2

Slide 3

Slide 3

Slide 4

Slide 4

The Cheongju Early Printing Museum, Korea — lindagoeseast.com/2015/09/14/a-visit-to-the-cheongju-early-printing-museum

Slide 5

Slide 5

Slide 6

Slide 6

Slide 7

Slide 7

Slide 8

Slide 8

Slide 9

Slide 9

Slide 10

Slide 10

Slide 11

Slide 11

Slide 12

Slide 12

Slide 13

Slide 13

Slide 14

Slide 14

Slide 15

Slide 15

Slide 16

Slide 16

Slide 17

Slide 17

Slide 18

Slide 18

Slide 19

Slide 19

Slide 20

Slide 20

Slide 21

Slide 21

Slide 22

Slide 22

Slide 23

Slide 23

Slide 24

Slide 24

Slide 25

Slide 25

Slide 26

Slide 26

Slide 27

Slide 27

Slide 28

Slide 28

Slide 29

Slide 29

Slide 30

Slide 30

Slide 31

Slide 31

Slide 32

Slide 32

Slide 33

Slide 33

Slide 34

Slide 34

Slide 35

Slide 35

Slide 36

Slide 36

Slide 37

Slide 37

Slide 38

Slide 38

Slide 39

Slide 39

Slide 40

Slide 40

Slide 41

Slide 41

Slide 42

Slide 42

Slide 43

Slide 43

Slide 44

Slide 44

Slide 45

Slide 45

Slide 46

Slide 46

Slide 47

Slide 47

Slide 48

Slide 48

Slide 49

Slide 49

Slide 50

Slide 50

Hot metal composition: Pasteup :: Floats : CSS Grid

Slide 51

Slide 51

Toda y’s Plan

Slide 52

Slide 52

9:00 – now Intro now – 10:00 Writing Modes 10:00 – 10:10 Break 10:10 – 11:00 Alignment, Logical Properties & bit for Flexbox 11:00 – 11:10 Break 11:10 - 12:00 Intro to CSS Grid 12:00 – 1:00 Lunch 1:00 – 2:00 CSS Grid 2:00 - 2:10 Break 2:10 – 3:00 More CSS Grid 3:00 – 3:10 Break 3:10 - 4:00 More bits

Slide 53

Slide 53

labs.jensimmons.com/2017/aeabos

Slide 54

Slide 54

Slide 55

Slide 55

Wr iting Modes

Slide 56

Slide 56

Slide 57

Slide 57

“ — Bruce Lawson It ’s

the World Wide Web, not the Wealthy Western Web.

Slide 58

Slide 58

Slide 59

Slide 59

drafts.csswg.org/css-writing-modes

Slide 60

Slide 60

direction writing-mode text-orientation

Slide 61

Slide 61

inline direction When I’m writing or reading this is the way the characters flow

Slide 62

Slide 62

<p > <p > <p > <p > block flow direction

Slide 63

Slide 63

div {
display: block; }

<div > <div > <div > <div >

Slide 64

Slide 64

div {
display: inline; }

<div > <div > <div > <div >

Slide 65

Slide 65

div {
display: inline-block; }

<div > <div > <div > <div >

Slide 66

Slide 66

display: block; display: inline; display: inline-block;

Slide 67

Slide 67

developer.mozilla.org/docs/Web/CSS/display

Slide 68

Slide 68

display: block; div h1 p figure figcaption header main aside display: inline; span i em a img Default CSS on HTML elements

Slide 69

Slide 69

block
direction

Slide 70

Slide 70

inline direction

Slide 71

Slide 71

A character orientation

Slide 72

Slide 72

block
direction inline direction A character orientation

Slide 73

Slide 73

LATIN-LIKE SYSTEMS block
direction inline direction A character orientation

Slide 74

Slide 74

Slide 75

Slide 75

ARABIC-LIKE SYSTEMS inline direction block
direction A character orientation

Slide 76

Slide 76

direction

Slide 77

Slide 77

.foo { direction: ltr; }

.foo { direction: rtl; }

Slide 78

Slide 78

Slide 79

Slide 79

<!DOCTYPE html> <html lang="en-US" dir="ltr" > <head> … </head> <body> … </body> </html>

Slide 80

Slide 80

< p>English words</p>

<p><bdo dir=" rtl"> . ﺔﯿﺑﺮﻌﻟا

تﺎﻤﻠﻜﻟا

</bdo></p>

Slide 81

Slide 81

<p>English words in this paragraph. <bdi dir="rtl">. تﺎﻤﻠﻜﻟ

</bdi> Some

more LTR words, same paragraph.</p>

Slide 82

Slide 82

LATIN-LIKE SYSTEMS ARABIC-LIKE SYSTEMS block
direction inline direction block
direction inline direction .css {direction: ltr;}

<html dir="ltr" > <bdo dir="ltr" > <bdi dir="ltr" > .css {direction: rtl;} <html dir="rtl" > <bdo dir="rtl" > <bdi dir="rtl" >

Slide 83

Slide 83

Slide 84

Slide 84

MONGOLIAN-LIKE SYSTEMS block
direction inline direction

Slide 85

Slide 85

MONGOLIAN-LIKE SYSTEMS block
direction inline direction

Slide 86

Slide 86

HAN-LIKE SYSTEMS block
direction inline direction *Chinese, Japanese, Korean & more

Slide 87

Slide 87

HAN-LIKE SYSTEMS block
direction inline direction block
direction inline direction *Chinese, Japanese, Korean & more

Slide 88

Slide 88

Slide 89

Slide 89

Slide 90

Slide 90

Slide 91

Slide 91

Slide 92

Slide 92

HAN-BASED SYSTEMS block
direction inline direction block
direction inline direction *Chinese, Japanese, Korean & more

Slide 93

Slide 93

writing-mode

Slide 94

Slide 94

THREE OPTIONS FOR WRITING-MODE writing-mode:
vertical-lr; writing-mode:
vertical-rl; toggle w/
dir writing-mode:
horizontal-tb;

Slide 95

Slide 95

Slide 96

Slide 96

chenhuijing.com/zh-type

Slide 97

Slide 97

chenhuijing.com/blog/chinese-web-typography

Slide 98

Slide 98

Slide 99

Slide 99

Slide 100

Slide 100

Slide 101

Slide 101

h1:nth-child(2) { writing-mode: vertical-rl; }

Slide 102

Slide 102

NOPE!

  1. text flowing
  2. like this writing-mode: vertical-lr;
  3. text flowing
  4. like this writing-mode: vertical-rl;

Slide 103

Slide 103

MONGOLIAN -LIKE SYSTEMS

Slide 104

Slide 104

MONGOLIAN -LIKE SYSTEMS

Slide 105

Slide 105

Top of
page Top of
(Latin-like) characters hello A

Slide 106

Slide 106

  1. like this
  2. text flowing
  3. text flowing
  4. like this MONGOLIAN -LIKE SYSTEMS HAN-LIKE SYSTEMS

Slide 107

Slide 107

THREE OPTIONS FOR WRITING-MODE direction block inline direction writing-mode:
vertical-lr; block
direction inline direction writing-mode:
vertical-rl; block
direction inline direction toggle w/
dir writing-mode:
horizontal-tb; creates a vertical

typographic mode

Slide 108

Slide 108

TWO MORE (FUTURE) OPTIONS FOR WRITING-MODE block direction inline direction writing-mode:
sideways-lr; block
direction inline direction writing-mode:
sideways-rl; creates a horizontal

typographic mode only A A

Slide 109

Slide 109

block
direction inline direction writing-mode:
sideways-rl; block
direction inline direction writing-mode:
vertical-rl; A

È

Slide 110

Slide 110

direction block inline direction writing-mode:
vertical-lr; block direction inline direction writing-mode:
sideways-lr; A

Slide 111

Slide 111

creates a vertical

typographic mode THREE OPTIONS FOR WRITING-MODE direction block inline direction writing-mode:
vertical-lr; block
direction inline direction writing-mode:
vertical-rl; block
direction inline direction toggle w/
dir writing-mode:
horizontal-tb;

Slide 112

Slide 112

Slide 113

Slide 113

My Cool Website

Slide 114

Slide 114

My Cool Website how?

Slide 115

Slide 115

My Cool Website writing-mode: vertical-rl; transform: rotate(180deg) ; text-orientation: sideways; (needed to fix punctuation / underlining) text-align: right;

Slide 116

Slide 116

text-orientation

Slide 117

Slide 117

HAN-LIKE SYSTEMS

È

Slide 118

Slide 118

Slide 119

Slide 119

options for vertical writing modes text-orientation:
mixed; text-orientation:
upright; text-orientation:
sideways; THREE OPTIONS FOR TEXT-ORIENTATION

Slide 120

Slide 120

Slide 121

Slide 121

Slide 122

Slide 122

block
direction inline direction writing-mode:
sideways-rl; block
direction inline direction writing-mode:
vertical-rl; text-orientation: mixed; creates a horizontal

typographic mode creates a vertical

typographic mode

Slide 123

Slide 123

My Cool Website writing-mode: vertical-rl; transform: rotate(180deg) ; text-orientation: sideways; (needed to fix punctuation / underlining) text-align: right;

Slide 124

Slide 124

SUMMARY

Slide 125

Slide 125

block
direction inline direction A character orientation

Slide 126

Slide 126

LATIN-LIKE SYSTEMS A

Slide 127

Slide 127

ARABIC-LIKE SYSTEMS A

Slide 128

Slide 128

HAN-LIKE SYSTEMS *Chinese, Japanese, Korean & more

È

È

Slide 129

Slide 129

MONGOLIAN-LIKE SYSTEMS

Slide 130

Slide 130

dir writing-mode text-orientation

Slide 131

Slide 131

LATIN-LIKE SYSTEMS ARABIC-LIKE SYSTEMS block
direction inline direction block
direction inline direction .css {direction: ltr;}

<html dir="ltr" > <bdo dir="ltr" > <bdi dir="ltr" > .css {direction: rtl;} <html dir="rtl" > <bdo dir="rtl" > <bdi dir="rtl" > A A

Slide 132

Slide 132

THREE OPTIONS FOR WRITING-MODE direction block inline direction writing-mode:
vertical-lr; block
direction inline direction writing-mode:
vertical-rl; block
direction inline direction toggle w/
direction writing-mode:
horizontal-tb; creates a vertical

typographic mode

È

È A

Slide 133

Slide 133

TWO MORE (FUTURE) OPTIONS FOR WRITING-MODE block direction inline direction writing-mode:
sideways-lr; block
direction inline direction writing-mode:
sideways-rl; creates a horizontal

typographic mode only A A

Slide 134

Slide 134

options for vertical writing modes text-orientation:
mixed; text-orientation:
upright; text-orientation:
sideways; THREE OPTIONS FOR TEXT-ORIENTATION

Slide 135

Slide 135

CODE IT UP

Slide 136

Slide 136

section { direction: ltr;

writing-mode: horizontal-tb;

} (These are all the defaults.
No need to specify them.) Example: Writing Mode 1A

Slide 137

Slide 137

<section><bdo dir="rtl" > ... </bdo></section> Example: Writing Mode 1A

Slide 138

Slide 138

section { writing-mode: vertical-rl;

} (This triggers
text-orientation: mixed
as the default.) Example: Writing Mode 1A

Slide 139

Slide 139

section { writing-mode: vertical-lr;

} Example: Writing Mode 1A

Slide 140

Slide 140

section { writing-mode: sideways-rl;

} Example: Writing Mode 1A

Slide 141

Slide 141

section { writing-mode: sideways-lr;

} Example: Writing Mode 1A

Slide 142

Slide 142

section { writing-mode: vertical-rl;

text-orientation: upright;

} Example: Writing Mode 1A

Slide 143

Slide 143

section { writing-mode: vertical-lr;

text-orientation: upright;

} Example: Writing Mode 1A

Slide 144

Slide 144

QUESTION TIME COMING SOON

Slide 145

Slide 145

h1 { writing-mode: vertical-rl; } Example: Writing Mode 4A

Slide 146

Slide 146

h1 { writing-mode: vertical-rl; transform: rotate(180deg); text-align: right; } Example: Writing Mode 4B

Slide 147

Slide 147

h1 { writing-mode: vertical-rl; text-orientation: upright; text-transform: uppercase; } Example: Writing Mode 4C

Slide 148

Slide 148

h1 { writing-mode: vertical-rl;

text-orientation: upright; text-transform: uppercase; transform: rotate(180deg); } Example: Writing Mode 4D

Slide 149

Slide 149

Slide 150

Slide 150

Slide 151

Slide 151

<main> <h1>
<span>Made</span>

<span>by</span> 

<span>Few</span>
</h1> </main> Example: Writing Mode 3 A

Slide 152

Slide 152

h1 span:nth-child(2) {

writing-mode: vertical-rl;

text-orientation: upright; font-size: 45%; }
Example: Writing Mode 3 A

Slide 153

Slide 153

h1 { display: grid; } h1 span:nth-child(1) {
grid-column: 1 / 3; grid-row: 1 / 2; } h1 span:nth-child(2) {
grid-column: 1 / 2; grid-row: 2 / 3;

}

h1 span:nth-child(3) {
grid-column: 2 / 3; grid-row: 2 / 3; } Example: Writing Mode 3 A

Slide 154

Slide 154

QUESTIONS?

Slide 155

Slide 155

Wr iting Modes

Slide 156

Slide 156

For the rest of today…

Slide 157

Slide 157

block
direction inline direction A character orientation

Slide 158

Slide 158

Start & End

Slide 159

Slide 159

block inline

Slide 160

Slide 160

block end inline
start inline
end block start

Slide 161

Slide 161

block end inline start inline end block start

Slide 162

Slide 162

block start inline start inline end block end

Slide 163

Slide 163

block start inline end inline start block end

Slide 164

Slide 164

end start end start

Slide 165

Slide 165

start start end end

Slide 166

Slide 166

Logical Properties

Slide 167

Slide 167

margin-block-start: 1rem; padding-inline-end: 1rem; border-block-end: 1px solid black; text-align: start; float: inline-start;

Slide 168

Slide 168

Slide 169

Slide 169

drafts.csswg.org/css-logical

Slide 170

Slide 170

Alignment

Slide 171

Slide 171

w3.org/TR/css-align-3

Slide 172

Slide 172

flex-start
flex-end center stretch space-between

space-around

Slide 173

Slide 173

start / flex-start end / flex-end center space-between

space-around space-evenly stretch

Slide 174

Slide 174

flex-start
flex-end center stretch baseline

Slide 175

Slide 175

Slide 176

Slide 176

(put on the container) *-content

effects content group

*-items
effects individual items

(put on item) *-self
effects individual items

Slide 177

Slide 177

Slide 178

Slide 178

Slide 179

Slide 179

Justify vs. Align

Slide 180

Slide 180

block inline

Slide 181

Slide 181

Align

Slide 182

Slide 182

Justify

Slide 183

Slide 183

start center end s t r e t c
h Justify

Slide 184

Slide 184

start center end s t r e t c h Align

Slide 185

Slide 185

cross axis main axis flex-direction: row;

Slide 186

Slide 186

cross axis main axis Justify Align flex-direction: row;

Slide 187

Slide 187

main axis Justify cross axis Align flex-direction: column;

Slide 188

Slide 188

Grid Justify 1 4 5 2 3 6 8 7 9 Align writing-mode: horizontal-tb; grid-auto-flow: row;

Slide 189

Slide 189

Grid Justify 1 4 5 2 3 6 8 7 9 writing-mode: horizontal-tb; grid-auto-flow: column;
Align

Slide 190

Slide 190

Slide 191

Slide 191

Align Justify

Slide 192

Slide 192

w3.org/TR/css-align-3

Slide 193

Slide 193

Slide 194

Slide 194

flexboxdefense.com flexboxfroggy.com

Slide 195

Slide 195

Flexbox

Slide 196

Slide 196

FAQ:

F le x box vs. CSS Grid?

Slide 197

Slide 197

F lex box line s t hings up 
 in one direction

Slide 198

Slide 198

Gr id line s t hings up 
 in two directions

Slide 199

Slide 199

Grid

Slide 200

Slide 200

Grid

Slide 201

Slide 201

Flexbox

Slide 202

Slide 202

Flexbox

Slide 203

Slide 203

Flexbox

Slide 204

Slide 204

Grid Flexbox

Slide 205

Slide 205

Grid

Slide 206

Slide 206

Slide 207

Slide 207

Bot h super powers are u se ful . Which do you want?

Slide 208

Slide 208

CSS Grid yet?

Slide 209

Slide 209

w3.org/TR/css-grid-1

Slide 210

Slide 210

Slide 211

Slide 211

Slide 212

Slide 212

Slide 213

Slide 213

Slide 214

Slide 214

Yo u m u s t s u p p o r t
browsers that 
 do not understand 
 CSS Grid.

Slide 215

Slide 215

Works Doesn’t
work

Slide 216

Slide 216

Use It Don’t Use It

Slide 217

Slide 217

Works Doesn’t
work Use It Don’t
Use It

Slide 218

Slide 218

Works Doesn’t
work Use It Don’t
Use It

Slide 219

Slide 219

Works Doesn’t
work Use It Don’t
Use It

Slide 220

Slide 220

Works Doesn’t
work Use It Don’t
Use It Fired.

Slide 221

Slide 221

Works Doesn’t
work Use It Don’t
Use It Fired.

Slide 222

Slide 222

Works Doesn’t
work Use It Don’t
Use It Fired. ✔

Slide 223

Slide 223

Works Doesn’t
work Use It Don’t
Use It

Slide 224

Slide 224

Works and
Doesn’t Work Use It and
Don’t Use It Don’t
Use It

Slide 225

Slide 225

X Works and
Doesn’t Work Use It and
Don’t Use It Don’t
Use It

Slide 226

Slide 226

.box { background: #bbb; border: 10px solid black; border-radius: 50px; }

Slide 227

Slide 227

Slide 228

Slide 228

.box { background: #bbb; border: 10px solid black; border-radius: 50px; }

Slide 229

Slide 229

.box { background: #bbb; border: 10px solid black; border-radius: 50px; } .box { background: #bbb; border: 10px solid black; border-radius: 50px; } Opera Mini IE8 IE7 IE6 Firefox Safari Chrome IE9+ Edge (on all operating systems)

Slide 230

Slide 230

Slide 231

Slide 231

Slide 232

Slide 232

img {

width: 200px;

margin: 0 1.5em 0.5em 0;

float: left; shape-outside: circle() ; } There is a prefix: -webkit-shape-outside: circle(); *

Slide 233

Slide 233

img {

width: 200px;

margin: 0 1.5em 0.5em 0;

float: left; shape-outside: circle() ; } There is a prefix: -webkit-shape-outside: circle(); *

Slide 234

Slide 234

Slide 235

Slide 235

Slide 236

Slide 236

Slide 237

Slide 237

p::first-letter {

color: rgba(255,190,150,0.9);

font-weight: bold;

margin-right: 0.5em;

-webkit-initial-letter: 4; initial-letter: 4;

}

Slide 238

Slide 238

p::first-letter {

color: rgba(255,190,150,0.9);

font-weight: bold;

margin-right: 0.5em;

-webkit-initial-letter: 4; initial-letter: 4;

}

Slide 239

Slide 239

@supports (initial-letter: 4 ) or (-webkit-initial-letter: 4 ) { p::first-letter {

color: rgba(255,190,150,0.9); 
font-weight: bold; 
margin-right: 0.5em;

-webkit-initial-letter: 4; initial-letter: 4; }

}

Slide 240

Slide 240

@supports (foo: value) {

// some code here

}

Slide 241

Slide 241

hacks.mozilla.org/2016/08/using-feature-queries-in-css

Slide 242

Slide 242

jensimmons.com/ presentation/ progressing-our- layouts

Slide 243

Slide 243

// simplified layout // for older browsers @supports (display: grid) {

// code for newer browsers

// including overrides }

Slide 244

Slide 244

Slide 245

Slide 245

Slide 246

Slide 246

Slide 247

Slide 247

Slide 248

Slide 248

Slide 249

Slide 249

// simplified layout // for older browsers @supports (display: grid) {

// code for newer browsers

// including overrides }

Slide 250

Slide 250

Slide 251

Slide 251

Slide 252

Slide 252

Slide 253

Slide 253

Slide 254

Slide 254

Slide 255

Slide 255

Yo u h a v e t w o c h o i c e s fo r

 Internet Explorer (& Edge):

  1. Leverage the 2012 Grid implementation.
  2. Pretend IE has no Grid.

Slide 256

Slide 256

Yo u h a v e t w o c h o i c e s fo r

 Internet Explorer (& Edge):

  1. Use old -ms-* syntax.
  2. Or don’t.

Slide 257

Slide 257

display: grid; grid-template-columns: repeat(4, 100px) ; display: -ms-grid; -ms-grid-columns: (100px)[4] ;

Slide 258

Slide 258

Slide 259

Slide 259

rachelandrew.co.uk/archives/2016/11/26/should-i-tr y- to-use-the-ie-implementation-of-css-grid-layout

Slide 260

Slide 260

autoprefixer

Slide 261

Slide 261

// for non-Grid browsers

@supports (display: grid) or (display: -ms-grid) { // for IE, Edge // and for modern-Grid-supporting

}

Slide 262

Slide 262

// for non-Grid browsers

@supports (display: grid) {

// for modern-Grid-supporting }

@supports (display: -ms-grid) {

// for IE, Edge }

Slide 263

Slide 263

Edge is coming

Slide 264

Slide 264

CSS Grid

Slide 265

Slide 265

w3.org/TR/css-grid-1

Slide 266

Slide 266

Slide 267

Slide 267

Slide 268

Slide 268

Grid Container

Slide 269

Slide 269

Grid Items

Slide 270

Slide 270

<main> <div>item</div> <div>item </div> <div>item </div> this is an anonymous grid item <div>item </div> hello world <section>more stuff</section > <footer>conclusion</footer> </main> <ul> <li> <li> <li> <li> <li> <li> <li> <li> </ul> <body> <header> <main> <article> <h1> <p> <figure> <aside> <footer> </body>

Slide 271

Slide 271

<body> <header>…</header> <main> <article> <h1> <p> <p> <p> <figure> <p> </article> </main> <aside>…</aside> <footer>…</footer> </body> body { display: grid; }

Slide 272

Slide 272

<body> <header>…</header> <main> <article> <h1> <p> <p> <p> <figure> <p> </article> </main> <aside>…</aside> <footer>…</footer> </body> body { display: grid; } article { display: grid; }

Slide 273

Slide 273

<body> <header>…</header> <main> <article> <h1> <p> <p> <p> <figure> <p> </article> </main> <aside>…</aside> <footer>…</footer> </body> body { display: grid; } main { display: subgrid; } article { display: subgrid; }

Slide 274

Slide 274

<body> <header>…</header> <main> <article> <h1> <p> <p> <p> <figure> <p> </article> </main> <aside>…</aside> <footer>…</footer> </body> body { display: grid; } article { display: grid; }

Slide 275

Slide 275

<ul> <li>…</li> <li> <h1>…</h1> <img> <p>…</p> </li> <li>…</li> <li>…</li>
<li>…</li>

<li>…</li>

<li>…</li> 

<li>…</li>

<li>…</li> 
</ul> ul { display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); grid-gap: 0.5rem 1rem; } li { // are Grid items display: flex; flex-flow: column; } img { order: -1; }

Slide 276

Slide 276

Headline Here This is teaser text. It
comes in different lengths. Headline Here This is teaser text. It
comes in different lengths.
Here we see more content filling the box up all the way. Headline This is teaser text. Headline That is Longer & Wraps This is teaser text. It
comes in different lengths. Headline This Headline This is teaser text. It
comes in different lengths.

Slide 277

Slide 277

Headline Here This is teaser text. It
comes in different lengths. Headline Here This is teaser text. It
comes in different lengths.
Here we see more content filling the box up all the way. Headline This is teaser text. Headline That is Longer & Wraps This is teaser text. It
comes in different lengths. Headline This Headline This is teaser text. It
comes in different lengths.

Slide 278

Slide 278

Headline Here This is teaser text. It
comes in different lengths. Headline Here This is teaser text. It
comes in different lengths.
Here we see more content filling the box up all the way. Headline This is teaser text. Headline That is Longer & Wraps This is teaser text. It
comes in different lengths. Headline This Headline This is teaser text. It
comes in different lengths.

Slide 279

Slide 279

Headline Here This is teaser text. It
comes in different lengths. Headline Here This is teaser text. It
comes in different lengths.
Here we see more content filling the box up all the way. Headline This is teaser text. Headline That is Longer & Wraps This is teaser text. It
comes in different lengths. Headline This Headline This is teaser text. It
comes in different lengths.

Slide 280

Slide 280

Headline Here This is teaser text. It
comes in different lengths. Headline Here This is teaser text. It
comes in different lengths.
Here we see more content filling the box up all the way. Headline This is teaser text. Headline That is Longer & Wraps This is teaser text. It
comes in different lengths. Headline This Headline This is teaser text. It
comes in different lengths.

Slide 281

Slide 281

Slide 282

Slide 282

Slide 283

Slide 283

Container Item Item Item

Slide 284

Slide 284

Ter minology

Slide 285

Slide 285

Grid Container

Slide 286

Slide 286

Grid Items

Slide 287

Slide 287

Grid Area Grid Line Grid Track Grid Track Grid Cell Grid Line Grid Line Grid Line Grid Line

Slide 288

Slide 288

Grid Area Grid Track Grid Track Grid Cell Grid Line Grid Line Grid Line Grid Line Grid Line Grid Gap Grid Gap Grid Gap

Slide 289

Slide 289

The Grid vs. The Content

Slide 290

Slide 290

• Exists in HTML • Can be styled, 
 like anything in HTML

Slide 291

Slide 291

• Exists in CSS • Can NOT be styled • It doesn’t exist 
 in the DOM

Slide 292

Slide 292

labs.jensimmons.com

Slide 293

Slide 293

labs.jensimmons.com/2017/01-003.html

Slide 294

Slide 294

Slide 295

Slide 295

Slide 296

Slide 296

Slide 297

Slide 297

Slide 298

Slide 298

Slide 299

Slide 299

ul {

display: grid; grid-template-columns:

repeat(4, 100px); grid-gap: 4px;

} li {

// nothing

}

Slide 300

Slide 300

Slide 301

Slide 301

Slide 302

Slide 302

<ul> <li><img src="/file1.jpg" ></li> <li><img src="/file2.jpg" ></li> <li><img src="/file3.jpg" ></li> <li><img src="/file4.jpg" ></li> <li><img src="/file5.jpg" ></li> <li><img src="/file6.jpg" ></li> <li><img src="/file7.jpg" ></li> </ul>

Slide 303

Slide 303

ul {

display: grid; grid-template-columns: repeat(4, 100px); grid-gap: 4px;

} li { // nothing } img { display: block; width: 100%; }

Slide 304

Slide 304

Slide 305

Slide 305

ul {

display: grid; grid-template-columns: repeat(4, 100px); grid-gap: 4px;

} /*
or */

ul {

display: grid; grid-template-columns: 100px 100px 100px 100px; grid-gap: 4px;

}

Slide 306

Slide 306

Slide 307

Slide 307

Slide 308

Slide 308

ul {

display: grid; grid-template-columns: repeat(5, 1fr ); grid-gap: 0.25em;

} /*
or */

ul {

display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr ; grid-gap: 0.25em;

}

Slide 309

Slide 309

fr unit = “fraction”

Slide 310

Slide 310

10 0 % 31. 6 6 6 % 31. 6 6 6 % 31. 6 6 6% 2.5% 2.5% 100% – 5% = 95% = 31.666666666666666% 3 3

Slide 311

Slide 311

10 0 % 1fr 1fr 1fr 2em 2em

Slide 312

Slide 312

1fr 1fr 1fr 1fr + 1fr + 1fr = 3fr total therefore, 1fr = 1/3 of the space

Slide 313

Slide 313

1fr 1fr 1fr 1fr + 1fr + 1fr + 1fr = 4fr total therefore, now 1fr = 1/4 of the space 1fr

Slide 314

Slide 314

2fr + 1.5fr + 1fr = 4.5fr total therefore, now 1fr = 2/9ths of the space 2fr 1fr

  1. 5 f r

Slide 315

Slide 315

2fr 1fr 50px 1fr min-content

Slide 316

Slide 316

ul {

display: grid; grid-template-columns: repeat(5, 1fr ); grid-gap: 0.25em;

} /*
or */

ul {

display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr ; grid-gap: 0.25em;

}

Slide 317

Slide 317

Comma , or not to comma?

Slide 318

Slide 318

grid-template-columns: repeat(5, 1fr ); grid-template-columns: 1fr 1fr 1fr 1fr 1fr;

Slide 319

Slide 319

Slide 320

Slide 320

ul { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); grid-gap: 0.25rem; }

Slide 321

Slide 321

ul { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); grid-gap: 0.25rem; } /*
or */

ul {

display: grid; grid-template-columns: repeat(auto-fill , minmax(120px, 1fr)); grid-gap: 0.25rem;

}

Slide 322

Slide 322

auto-fi t

auto-fi ll

Slide 323

Slide 323

gridbyexample.com/video/series-auto-fill-auto-fit

Slide 324

Slide 324

Slide 325

Slide 325

Options for grid-template-columns grid-template-rows

Slide 326

Slide 326

.grid-container { display: grid; grid-template-columns: 1fr 1fr 1fr; } some other syntax options (each with different results)

grid-template-columns: 1fr 5fr 2.5fr; grid-template-columns: 8em 1fr 300px; grid-template-columns: 1fr 1fr 2fr 3fr 5fr 8fr 13fr 21fr 34fr ; grid-template-columns: repeat(7, 1fr); grid-template-columns: repeat(3, 200px 1fr 25%); grid-template-columns: repeat(auto-fill, 10rem); grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-template-columns: 4rem 2fr repeat(5, 1fr) 300px;

Slide 327

Slide 327

Units for setting Grid Track Sizes ‣ length: px, em, rem, vw, vh ‣ percent ‣ fraction unit: 1fr ‣ minmax(); ‣ size of content:
min-content / max-content / fit-content ‣ auto

Slide 328

Slide 328

ul { display: grid; grid-template-columns:
repeat(auto-fit,
minmax(120px, 1fr)); grid-gap: 0.25rem; // nothing about rows } li { // nothing needed }

Slide 329

Slide 329

explicit vs. implicit

Slide 330

Slide 330

You define
! e size and/or
number of rows
and/or
columns Let ! e browser
define number or
size of rows or columns

Slide 331

Slide 331

P lace each " em 
 into a specific 
 cell or area Let ! e browser
place every ! ing
using
auto-placement
a lgor " hm

Slide 332

Slide 332

Slide 333

Slide 333

Slide 334

Slide 334

ul {

display: grid; grid-template-columns:

         repeat(4, 1fr);

}

Slide 335

Slide 335

li:nth-child(1) {

grid-column: 2 / 3;

grid-row: 1 / 2; }

Slide 336

Slide 336

li:nth-child(1) {

grid-column: 2 / 3;

grid-row: 1 / 2; }

li:nth-child(2) {

grid-column: 4 / 5;

grid-row: 2 / 3; }

li:nth-child(3) {

grid-column: 3 / 4;

grid-row: 3 / 4; }

li:nth-child(4) {…}

li:nth-child(5) { …}

Slide 337

Slide 337

.item { grid-row-start: 1; grid-row-end: 3; grid-column-start: 2; grid-column-end: 4; } .item { grid-row: 1 / 3;
grid-column: 2 / 4; } .item { grid-area: 1 / 2 / 3 / 4;
} 1 2 3 4 grid-column: 2 / 4; grid-row: 1 / 3; 1 2 3 4 5

Slide 338

Slide 338

TRY IT OUT

Slide 339

Slide 339

Exercises Set 1

Slide 340

Slide 340

Exercises Set 1

Slide 341

Slide 341

display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-columns: 2fr 4fr 3fr 1fr; grid-template-columns: repeat(auto-fill, minmax(200px,1fr));

grid-gap: 1rem;

grid-auto-flow: dense;

li:nth-child(2) { }

grid-row: 1 / 2; grid-column: 1 / 2; grid-row: span 2; grid-column: span 2; Some bits for the Exercises

Slide 342

Slide 342

Line Numbers

Slide 343

Slide 343

1 2 3 4 5 6 Grid Line Numbers Line Numbers, not track numbers — different than what
we are used to! 1 2 3 4 5

Slide 344

Slide 344

1 6 6 lines 5 tracks 4 gaps 2 3 4 5

Slide 345

Slide 345

1 2 3 4 5 6 grid-row: 1 / 2; grid-column: 1 / 2; grid-row: 1 / 2;

grid-column: 5 / 6; grid-row: 2 / 3;

grid-column: 2 / 4; grid-row: 3 / 5;

grid-column: 3 / 5; 1 2 3 4 5 grid-row: 4 / 5;

grid-column: 1 / 2;

Slide 346

Slide 346

.item-A { grid-row: 1 / 3;
grid-column: 2 / 4; } .item-B { grid-row: 4 / 5;
grid-column: 1 / 2; } .item-C { grid-row: 4;
grid-column: 3; } 1 2 3 4 grid-row: 1 / 3;

grid-column: 2 / 4; 1 2 3 4 5 grid-row: 4 / 5;

grid-column: 1 / 2; grid-row: 4;

grid-column: 3;

Slide 347

Slide 347

.item { grid-area: 1 / 2 / 3 / 4; } .item { grid-row-start: 1; grid-column-start: 2; grid-row-end: 3; grid-column-end: 4; } 1 2 3 4 1 2 3 4 5

Slide 348

Slide 348

.item { grid-area: 1 / 2 / 3 / 4; } 1 2 3 4 1 2 3 4 5 first second third fourth

Slide 349

Slide 349

Slide 350

Slide 350

.item { grid-area: 1 / 2 / 3 / 4; } .item-B { grid-area: 4 / 1; } 1 2 3 4 1 2 3 4 5 first second third fourth

Slide 351

Slide 351

ul {

display: grid; grid-template-columns:

    4fr 2fr 2fr 3fr 6fr

; }

Slide 352

Slide 352

Slide 353

Slide 353

li:nth-child(1) { grid-row: 1 / 3 ; grid-column: 1 / 3;

z-index: 2;

}

li:nth-child(2 ) { grid-row: 2 / 6 ; grid-column: 2 / 5;

}

li:nth-child(3 ) { grid-row: 4 / 7 ; grid-column: 4 / 6;

z-index: 2;

}

Slide 354

Slide 354

li:nth-child(1) { grid-row: 1 / span 2 ; grid-column: 1 / span 2;

z-index: 2;

}

li:nth-child(2 ) { grid-row: 2 / span 4 ; grid-column: 2 / span 3;

}

li:nth-child(3 ) { grid-row: 4 / span 3 ; grid-column: 4 / span 2;

z-index: 2;

}

Slide 355

Slide 355

These all have the same results: grid-column: 1 / 4; // starts at line 1, goes to line 4
grid-column: 1 / span 3; // starts at line 1, spans 4 cells grid-column: span 3 / 4; // spans 3 cells, ends at line 4 1 2 3 4 5 1 2

Slide 356

Slide 356

.grid-item { grid-column: 1 / 5; // goes from vertical line 1 to 5 grid-row: 3 / 5 // goes from horizontal line 3 to 5

} some other syntax options (with some different results)

grid-column: 3 / 5; // starts at line 3, goes to line 5
grid-column: 3 / span 2; // starts at line 3, spans 2 cells grid-column: span 2 / 5; // spans 2 cells, ends at line 5 grid-column: span 2; // spans 2 cells, placed by algorithm grid-column: 4; // starts at line 4, spans 1 cell grid-column: 1 / -1; // starts at line 1, goes to line -1
grid-column: horse / pig;

Slide 357

Slide 357

TRY IT OUT

Slide 358

Slide 358

Exercises Set 2

Slide 359

Slide 359

display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-columns: 2fr 4fr 3fr 1fr; grid-template-columns: repeat(auto-fill, minmax(200px,1fr));

grid-gap: 1rem;

grid-auto-flow: dense;

li:nth-child(2) { }

grid-row: 1 / 2; grid-column: 1 / 2; grid-row: span 2; grid-column: span 2; Some bits for the Exercises

Slide 360

Slide 360

Line Numbers

Slide 361

Slide 361

Grid Line Numbers 1 2 3 4 5 6 -5 -4 -3 -2 -1 -6 -5 -4 -3 -2 -1 1 2 3 4 5

Slide 362

Slide 362

main { display: grid; grid-template-columns: repeat(5, 1fr); grid-template-rows: repeat(4, 1fr); } aside { grid-column: 1 / 3; grid-row: 1 / -1;

background: yellow; }

Slide 363

Slide 363

Grid Auto Flow

Slide 364

Slide 364

15 16 17 12 4 3 13 11 8 9 10 6 5 1 2 auto placement algorithm 7 14 .container {grid-auto-flow: row;}

Slide 365

Slide 365

15 10 6 2 14 7 16 17 12 4 3 13 11 8 9 5 1 grid-auto-flow: column;

Slide 366

Slide 366

Grid Justify 1 4 5 2 3 6 8 7 9 writing-mode: horizontal-tb; grid-auto-flow: column;
Align

Slide 367

Slide 367

Row Column writing-mode: horizontal-tb;

Slide 368

Slide 368

Column Row writing-mode: vertical-*;

Slide 369

Slide 369

15 10 6 2 14 7 16 17 12 4 3 13 11 8 9 5 1 grid-auto-flow: column; writing-mode: horizontal-tb;

Slide 370

Slide 370

15 16 17 12 4 3 13 11 8 9 10 6 5 1 2 7 14 grid-auto-flow: row; writing-mode: horizontal-tb;

Slide 371

Slide 371

13 11 8 9 10 7 6 5 1 2 3 4 12 grid-auto-flow: row; grid-column: span 2; grid-row: span 2; grid-column: span 2; grid-row: span 2; grid-column: span 2;

Slide 372

Slide 372

13 11 8 9 10 7 6 5 1 2 3 4 12 grid-auto-flow: dense;

Slide 373

Slide 373

grid-auto-flow: row; grid-auto-flow: column; grid-auto-flow: dense; grid-auto-flow: row dense;

grid-auto-flow: column dense;

Slide 374

Slide 374

Slide 375

Slide 375

Slide 376

Slide 376

Slide 377

Slide 377

TRY IT OUT

Slide 378

Slide 378

Exercises Set 3

Slide 379

Slide 379

display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; grid-template-columns: 2fr 4fr 3fr 1fr; grid-template-columns: repeat(auto-fill, minmax(200px,1fr));

grid-gap: 1rem;

grid-auto-flow: dense;

li:nth-child(2) { }

grid-row: 1 / 2; grid-column: 1 / 2; grid-row: span 2; grid-column: span 2; Some bits for the Exercises

Slide 380

Slide 380

Named Lines

Slide 381

Slide 381

.container { grid-template-rows: 1fr 1fr 1fr;

}

Slide 382

Slide 382

.container { grid-template-rows:[cow] 1fr [horse] 1fr [dog] 1fr [pig];

}

Slide 383

Slide 383

1 2 3 4 1 2 3 4 5 cow horse dog pig .container { grid-template-rows:[cow] 1fr

[horse] 

1fr [dog] 1fr [pig]; }
.item { grid-row: 3; grid-column: horse / pig; }

Slide 384

Slide 384

grid-template-rows: 1fr 1fr 1fr; grid-template-rows:[cow] 1fr [horse] 1fr [dog] 1fr [pig];

grid-template-rows:[cow truck] 1fr [horse car] 1fr [dog boat];

grid-template-rows: repeat(auto-fit, 200px 1fr); grid-template-rows: repeat(auto-fit, [dog] 200px [cat] 1fr); grid-template-rows: repeat(4, 
 [ even-start even-end] 80px [odd-start odd-end] 80px);

Slide 385

Slide 385

.container { grid-template-rows:[main-start] 1fr [main-end];

}

Slide 386

Slide 386

Grid Areas

Slide 387

Slide 387

Grid Area Grid Line Grid Track Grid Track Grid Cell Grid Line Grid Line Grid Line Grid Line

Slide 388

Slide 388

<body> <header>…</header> <main>…</main> <aside>…</aside> <footer>…</footer> </body> ~25% ~75%

Slide 389

Slide 389

header { grid-area: header;

} main { grid-area: content;

} aside { grid-area: sidebar;

} footer { grid-area: footer;

} ‘header’ ‘sidebar’ ‘content’ ‘footer’

Slide 390

Slide 390

header { grid-area: header; } main { grid-area: main;
} aside { grid-area: aside;
} footer { grid-area: footer; }

body {

display: grid;

grid-template-columns: 3fr 1fr;

grid-gap: 2rem;

grid-template-areas:

  "header  

header" "content sidebar " "footer footer" ;
} ‘header’ ‘aside’ 1fr ‘main’ 3fr ‘footer’

Slide 391

Slide 391

body {

display: grid;

grid-gap: 2rem; grid-template-areas:

"header" "content"

"sidebar

" "footer" ;
} @media (min-width: 800px) { body {

grid-template-columns: 

   3fr 1fr;

grid-template-areas: 

  

"header header" "content sidebar " "footer footer" ;
}

}

Slide 392

Slide 392

Slide 393

Slide 393

Media Query

Slide 394

Slide 394

@media (min-width: 800px) { // something that happens once the // browser window is wider than 800px }

Slide 395

Slide 395

// Default layout for skinniest devices @media (min-width: 800px) { // something that happens once the // browser window is wider than 800px }

Slide 396

Slide 396

@media (max-width: 800px) { // something that only happens when the // browser window is narrower than 800px }

Slide 397

Slide 397

@media (max-width: 300px) { … } @media (min-width: 300px) and
(max-width: 800px) { … } @media (min-width: 800px) { … }

Slide 398

Slide 398

@media (min-height: 600px) { … }

Slide 399

Slide 399

Slide 400

Slide 400

Explicit Grid vs

Implicit Grid

Slide 401

Slide 401

by Manuel Rego Casasnovas http://blogs.igalia.com/mrego/2016/02/01/deep-dive-into-grid-layout-placement/

Slide 402

Slide 402

display: flow-root;

Slide 403

Slide 403

Slide 404

Slide 404

Slide 405

Slide 405

Slide 406

Slide 406

Slide 407

Slide 407

Slide 408

Slide 408

Slide 409

Slide 409

Slide 410

Slide 410

Slide 411

Slide 411

Flexbox as intended

Slide 412

Slide 412

Slide 413

Slide 413

flex: initial; (do not grow, do shrink) flex: auto; (grow and shrink) flex: none; (do not grow or shrink) flex: <#>; (distribute space by portions) flex: 0 1 auto;

flex: 1 1 auto;

flex: 0 0 auto;

flex: <#> 1 0;

Slide 414

Slide 414

Slide 415

Slide 415

Multic olumn

Slide 416

Slide 416

Slide 417

Slide 417

Slide 418

Slide 418

article { max-width: 500px; margin: 0 auto; }

Slide 419

Slide 419

article { column-count: 2; column-gap: 2em; }

Slide 420

Slide 420

Slide 421

Slide 421

article { // column-count: 2; column-width: 200px; column-gap: 2em; }

Slide 422

Slide 422

Slide 423

Slide 423

Slide 424

Slide 424

img { width: 100%; } article { column-width: 200px; column-gap: 2em;
column-rule: 
 1px solid #444; }

Slide 425

Slide 425

Slide 426

Slide 426

THE END