CSS GRID a most excellent adventure!

A presentation at WP Hooked Meetup in February 2021 in by Kirsty Burgoine

Slide 1

Slide 1

Kirst y’s In CSS Grid WP Hooked 2021 - @kirstyburgoine - kirstyburgoine.co.uk

Slide 2

Slide 2

Kirst y’s In CSS Grid WP Hooked 2021 - @kirstyburgoine - kirstyburgoine.co.uk

Slide 3

Slide 3

Layouts from hell… Tables https://thehistoryoftheweb.com/tables-layout-absurd/

Slide 4

Slide 4

Layouts from hell… Frames https://thehistoryoftheweb.com/tables-layout-absurd/

Slide 5

Slide 5

Bulletproof Web Design: Improving flexibility and protecting against worst-case scenarios with XHTML and CSS Published Aug 2007 There is a slightly newer version now: Bulletproof Web Design: Improving flexibility and protecting against worst-case scenarios with HTML5 and CSS3. Published Dec 2011.

Slide 6

Slide 6

http://www.csszengarden.com/ Screenshot circa 2007

Slide 7

Slide 7

CSS3 display: block; display: flex; display: grid;

Slide 8

Slide 8

CSS3 display: block; 100% Stats taken from caniuse.com display: flex; 98.72% display: grid; 94.47%

Slide 9

Slide 9

Getting started CSS Grid.

Slide 10

Slide 10

“A grid is an intersecting set of horizontal and vertical lines – one set defining columns, and the other, rows. Elements can be placed onto the grid, within these column and row lines.” ~ MDN Web Docs.

Slide 11

Slide 11

“A grid is an intersecting set of horizontal and vertical lines – one set defining columns, and the other, rows. Elements can be placed onto the grid, within these column and row lines.” ~ MDN Web Docs.

Slide 12

Slide 12

“A grid is an intersecting set of horizontal and vertical lines – one set defining columns, and the other, rows. Elements can be placed onto the grid, within these column and row lines.” ~ MDN Web Docs.

Slide 13

Slide 13

“A grid is an intersecting set of horizontal and vertical lines – one set defining columns, and the other, rows. Elements can be placed onto the grid, within these column and row lines.” ~ MDN Web Docs.

Slide 14

Slide 14

Getting started Implicit Grid.

Slide 15

Slide 15

Implicit grid

<div class=”grid__container”> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> </div> codepen.io/collection/AvJKoR

Slide 16

Slide 16

Implicit grid

<div class=”grid__container”> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> </div> .grid__container { display: grid; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 17

Slide 17

Implicit grid

<div class=”grid__container”> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> </div> .grid__container { display: grid; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 18

Slide 18

Implicit grid

<div class=”grid__container”> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> </div> .grid__container { display: grid; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 19

Slide 19

Implicit grid

<div class=”grid__container”> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> <div class=”grid__item”></div> </div> .grid__container { display: grid; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 20

Slide 20

Getting started Explicit Grid.

Slide 21

Slide 21

Explicit grid — Setting columns. .grid__container { display: grid; grid-template-columns: 150px 150px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 22

Slide 22

Explicit grid — Setting columns. .grid__container { display: grid; grid-template-columns: 150px 150px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 23

Slide 23

Explicit grid — Setting rows. .grid__container { display: grid; grid-template-columns: 150px 150px; grid-template-rows: 50px 100px 50px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 24

Slide 24

Explicit grid — track lines. .grid__container { display: grid; grid-template-columns: [body-start] 150px [column-middle] 150px [body-end]; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 25

Slide 25

Explicit grid — track lines. [body-start] [body-end] .grid__container { display: grid; grid-template-columns: [body-start] 150px [column-middle] 150px [body-end]; grid-gap: 10px; } [column-middle] codepen.io/collection/AvJKoR

Slide 26

Slide 26

Explicit grid — placement. [body-start] [body-end] .grid__item:nth-child(odd) { grid-column: [body-start] / [column-middle]; } .grid__item:nth-child(even) { grid-column: [column-middle] / [body-end]; } [column-middle] codepen.io/collection/AvJKoR

Slide 27

Slide 27

Explicit grid — placement. [body-start] [body-end] .grid__item:nth-child(5) { grid-column: [body-start] / [body-end]; } [column-middle] codepen.io/collection/AvJKoR

Slide 28

Slide 28

Explicit grid — track lines. 1 3 .grid__item:nth-child(odd) { grid-column: 1 / 2; } .grid__item:nth-child(even) { grid-column: 2 / 3; } 2 codepen.io/collection/AvJKoR

Slide 29

Slide 29

Explicit grid — track lines. 1 3 .grid__item { grid-area: 2 / 1 / span 2 / span 1; } 2 codepen.io/collection/AvJKoR

Slide 30

Slide 30

Getting started Units & Functions.

Slide 31

Slide 31

The fr unit. grid-template-columns: 1fr 1fr; codepen.io/collection/AvJKoR

Slide 32

Slide 32

The fr unit. .grid__container { display: grid; grid-template-columns: 150px 150px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 33

Slide 33

The fr unit. 150px + 10px + 150px === 310px 😞 codepen.io/collection/AvJKoR

Slide 34

Slide 34

The fr unit. .grid__container { display: grid; grid-template-columns: 50% 50%; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 35

Slide 35

The fr unit. 50% + 10px + 50% === 😞 😞 😞 😞 codepen.io/collection/AvJKoR

Slide 36

Slide 36

The fr unit. .grid__container { display: grid; grid-template-columns: 1fr 1fr; grid-column-gap: 10px; } codepen.io/collection/AvJKoR

Slide 37

Slide 37

repeat() grid-template-columns: repeat(2, 1fr); codepen.io/collection/AvJKoR

Slide 38

Slide 38

repeat() .grid__container { display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(3, 50px); grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 39

Slide 39

minmax() grid-template-columns: repeat(2, minmax(20px, 1fr)); codepen.io/collection/AvJKoR

Slide 40

Slide 40

minmax() .grid__container { display: grid; grid-template-columns: 1fr 1fr minmax(150px, 1fr) 1fr; grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 41

Slide 41

minmax() https://tinyurl.com/y2bm7dld

Slide 42

Slide 42

Creating Truly Flexible Layouts.

Slide 43

Slide 43

Creating Truly Flexible Layouts. The no breakpoints approach.

Slide 44

Slide 44

The no breakpoint approach. https://tinyurl.com/y2bm7dld

Slide 45

Slide 45

The no breakpoint approach. .grid__container { display: grid; grid-template-columns: repeat( auto-fill, minmax( 200px, 1fr ) ); grid-gap: 20px; } codepen.io/collection/AvJKoR

Slide 46

Slide 46

The no breakpoint approach. codepen.io/collection/AvJKoR

Slide 47

Slide 47

The no breakpoint approach. // IE Fallbacks 😞 🗑 🔥 .grid__container { display: flex; flex-flow: row wrap; } .grid__container > * { margin: 10px; } codepen.io/collection/AvJKoR

Slide 48

Slide 48

The no breakpoint approach. // IE Fallbacks 😞 🗑 🔥 // Fun Grid Stuff! 🤩 🎉 🧡 .grid__container { @supports ( display: grid ) { .grid__container { display: flex; display: grid; flex-flow: row wrap; } grid-template-columns: .grid__container > * { grid-gap: 20px; repeat( auto-fill, minmax( 200px, 1fr ) ); } margin: 10px; } .grid__container > * { margin: unset; } } codepen.io/collection/AvJKoR

Slide 49

Slide 49

Creating Truly Flexible Layouts. The no .wrapper approach.

Slide 50

Slide 50

The no .wrapper approach. .wrapper { width: 100%; max-width: 1024px; margin: 0 auto; padding: 0 5px; @media ( min-width: 1024px ) { padding: 0 10px; } } codepen.io/collection/AvJKoR

Slide 51

Slide 51

The no .wrapper approach. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] minmax(300px, 1280px) [container-end] minmax(10px, 1fr) [body-end] grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 52

Slide 52

The no .wrapper approach. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] minmax(300px, 1280px) [container-end] minmax(10px, 1fr) [body-end] grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 53

Slide 53

The no .wrapper approach. [body-start] [container-start] codepen.io/collection/AvJKoR [body-end] [container-end]

Slide 54

Slide 54

The no .wrapper approach. codepen.io/collection/AvJKoR

Slide 55

Slide 55

The no .wrapper approach. codepen.io/collection/AvJKoR

Slide 56

Slide 56

The no .wrapper approach. // The old way 😞 🗑 🔥 .fullwidth { width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; } codepen.io/collection/AvJKoR

Slide 57

Slide 57

The no .wrapper approach. // The old way 😞 🗑 🔥 .fullwidth { width: 100vw; position: relative; left: 50%; right: 50%; margin-left: -50vw; margin-right: -50vw; } codepen.io/collection/AvJKoR // Fun Grid Stuff! 🤩 🎉 🧡 .fullwidth { grid-column: [body-start] / [body-end]; }

Slide 58

Slide 58

The no .wrapper approach. codepen.io/collection/AvJKoR

Slide 59

Slide 59

The no .wrapper approach. [body-start] [container-start] codepen.io/collection/AvJKoR [body-end] [container-end]

Slide 60

Slide 60

The no .wrapper approach. https://tinyurl.com/y2bm7dld

Slide 61

Slide 61

The no .wrapper approach. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] minmax(300px, 1280px) [container-end] minmax(10px, 1fr) [body-end] […] codepen.io/collection/AvJKoR

Slide 62

Slide 62

The no .wrapper approach. .grid__container { […] display: grid; grid-template-rows: grid-template-columns: [page-start] [body-start] 1fr minmax(10px, 1fr) [content-start] [container-start] repeat( 3, 3fr ) minmax(300px, 1280px) [content-end] [container-end] 5fr minmax(10px, 1fr) [page-end] [body-end] […] codepen.io/collection/AvJKoR grid-gap: 10px; }

Slide 63

Slide 63

The no .wrapper approach. codepen.io/collection/AvJKoR

Slide 64

Slide 64

Creating Truly Flexible Layouts.

Slide 65

Slide 65

Creating Truly Flexible Layouts. SUB Grid

Slide 66

Slide 66

Sub Grid. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] repeat(3, minmax(0, 400px) [container-end] minmax(10px, 1fr) [body-end] grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 67

Slide 67

Sub Grid. [body-start] [body-end] [container-start] codepen.io/collection/AvJKoR [container-end]

Slide 68

Slide 68

Sub Grid. @media ( min-width: 1024px ) { .grid__item:nth-child(3n + 1) { .grid__item { grid-column: 2 / 3; grid-column-end: span 3; } grid-column: 2 / 5; .grid__item:nth-child(3n + 2) { @media ( min-width: 1024px ) { grid-column: 3 / 4; grid-column-end: span 1; } } .grid__item:nth-child(3n + 3) { } grid-column: 4 / 5; } } codepen.io/collection/AvJKoR

Slide 69

Slide 69

Sub Grid. codepen.io/collection/AvJKoR

Slide 70

Slide 70

Sub Grid. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] repeat(auto-fill, minmax(400px, 1fr) [container-end] minmax(10px, 1fr) [body-end] grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 71

Slide 71

Sub Grid. // Fun Sub Grid Stuff! 🤩 🎉 🧡 .subgrid__container { grid-column: [container-start] / [container-end]; display: grid; grid-template-columns: subgrid; } codepen.io/collection/AvJKoR

Slide 72

Slide 72

Sub Grid. codepen.io/collection/AvJKoR

Slide 73

Slide 73

Sub Grid. .grid__container { display: grid; grid-template-columns: [body-start] minmax(10px, 1fr) [container-start] repeat(auto-fill, minmax(400px, 1fr) // Fun Sub Grid Stuff! 🤩 🎉 🧡 .subgrid__container { grid-column: [container-start] / [container-end]; [container-end] display: grid; minmax(10px, 1fr) [body-end] grid-template-rows: auto; grid-gap: 10px; } codepen.io/collection/AvJKoR grid-template-columns: subgrid; }

Slide 74

Slide 74

e h t g n i Avoid

Slide 75

Slide 75

Gotcha’s Content ordering.

Slide 76

Slide 76

Gotcha’s — Content ordering .grid__container { display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(3, 50px); grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 77

Slide 77

Gotcha’s — Content ordering .grid__item:nth-child(3) { } codepen.io/collection/AvJKoR

Slide 78

Slide 78

Gotcha’s — Content ordering. .grid__item:nth-child(3) { order: 5; } codepen.io/collection/AvJKoR

Slide 79

Slide 79

Gotcha’s — Content ordering and placement. [body-start] [body-end] .grid__item:nth-child(5) { grid-column: [body-start] / [body-end]; } [column-middle] codepen.io/collection/AvJKoR

Slide 80

Slide 80

Gotcha’s — Content ordering and placement. [body-start] [body-end] .grid__item:nth-child(5) { grid-column: [body-start] / [column-middle]; grid-row: 1 / 2; } [column-middle] codepen.io/collection/AvJKoR

Slide 81

Slide 81

Gotcha’s Internet Explorer… 😞🗑🔥

Slide 82

Slide 82

Gotcha’s — Internet Explorer Should I try to use the IE Implementation of CSS Grid. https://rachelandrew.co.uk Published November 2016

Slide 83

Slide 83

Gotcha’s — Internet Explorer Should I try to use the IE version of Grid Layout? Revisited for 2018. https://rachelandrew.co.uk Published July 2018

Slide 84

Slide 84

Gotcha’s — Internet Explorer Prefixing .grid__container { display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(3, 50px); grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 85

Slide 85

Gotcha’s — Internet Explorer Prefixing 😞 🗑 🔥 .grid__container { display: grid; display: -ms-grid; grid-template-columns: repeat(2, 1fr); -ms-grid-columns: 1fr 1fr; grid-template-rows: repeat(3, 50px); -ms-grid-rows: 50px 50px 50px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 86

Slide 86

Gotcha’s — Internet Explorer repeat() 😞🗑🔥 grid-template-columns: repeat(2, 1fr); -ms-grid-columns: 1fr 1fr; codepen.io/collection/AvJKoR

Slide 87

Slide 87

Gotcha’s — Internet Explorer Auto-placement .grid__container { display: grid; display: -ms-grid; grid-template-columns: repeat(2, 1fr); -ms-grid-columns: 1fr 1fr; grid-template-rows: repeat(3, 50px); -ms-grid-rows: 50px 50px 50px; grid-gap: 10px; } codepen.io/collection/AvJKoR

Slide 88

Slide 88

Gotcha’s — Internet Explorer .grid__item:nth-child(1) { -ms-grid-column: 1; -ms-grid-column-span: 2; -ms-grid-row: 1; -ms-grid-row-span: 2; } 😞🗑🔥 .grid__item:nth-child(4) { -ms-grid-column: 2; -ms-grid-column-span: 3; -ms-grid-row: 2; -ms-grid-row-span: 3; } .grid__item:nth-child(2) { -ms-grid-column: 2; -ms-grid-column-span: 3; -ms-grid-row: 1; -ms-grid-row-span: 2; } .grid__item:nth-child(5) { -ms-grid-column: 1; -ms-grid-column-span: 2; -ms-grid-row: 3; -ms-grid-row-span: 4; } .grid__item:nth-child(3) { -ms-grid-column: 1; -ms-grid-column-span: 2; -ms-grid-row: 2; -ms-grid-row-span: 3; } .grid__item:nth-child(6) { -ms-grid-column: 2; -ms-grid-column-span: 3; -ms-grid-row: 3; -ms-grid-row-span: 4; } codepen.io/collection/AvJKoR 😞🗑🔥

Slide 89

Slide 89

Gotcha’s — Internet Explorer Grid child placement mixin. 😞 🗑 🔥 @mixin grid-child( $col-start, $col-end, $row-start, $row-end ) { -ms-grid-column: $col-start; -ms-grid-column-span: $col-end; grid-column: #{$col-start} / #{$col-end}; -ms-grid-row: $row-start; -ms-grid-row-span: $row-end; grid-row: #{$row-start} / #{$row-end}; } codepen.io/collection/AvJKoR

Slide 90

Slide 90

Gotcha’s — Internet Explorer Grid child placement mixin. 😞 🗑 🔥 .grid__item:nth-child(1) { @include grid-child(1, 2, 1, 2); } .grid__item:nth-child(4) { @include grid-child(1, 2, 2, 3); } .grid__item:nth-child(2) { @include grid-child(2, 3, 1, 2); } .grid__item:nth-child(5) { @include grid-child(2, 3, 2, 3); } .grid__item:nth-child(3) { @include grid-child(1, 2, 2, 3); } .grid__item:nth-child(6) { @include grid-child(3, 4, 2, 3); } codepen.io/collection/AvJKoR

Slide 91

Slide 91

Gotcha’s — Internet Explorer New Autoprefixer! https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/

Slide 92

Slide 92

Gotcha’s — Internet Explorer New Autoprefixer! .grid__container { display: grid; display: -ms-grid; grid-template-columns: repeat(2, 1fr); -ms-grid-columns: 1fr 1fr; grid-template-rows: repeat(3, 50px); -ms-grid-rows: 50px 50px 50px; grid-gap: 10px; } https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/ .grid__item:nth-child(1) { @include grid-child(1, 2, 1, 2); } .grid__item:nth-child(2) { @include grid-child(2, 3, 1, 2); } .grid__item:nth-child(3) { @include grid-child(1, 2, 2, 3); }

Slide 93

Slide 93

Gotcha’s — Internet Explorer New Autoprefixer! .grid__container { display: grid; display: -ms-grid; grid-gap: 10px; grid-template: “a a a” 40px “b c c” 40px “b c c” 40px / 1fr 1fr 1fr; } .grid__item:nth-child(1) { grid-area: a; } https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/

Slide 94

Slide 94

Gotcha’s — Internet Explorer New Autoprefixer! .grid__container { display: grid; display: -ms-grid; grid-gap: 10px; -ms-grid-columns: 1fr 10px 1fr 10px 1fr; -ms-grid-rows: 40px 10px 40px 10px 40px; grid-template: “a a a” 40px “b c c” 40px “b c c” 40px / 1fr 1fr 1fr; } https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/ .grid__item:nth-child(1) { grid-area: a; -ms-grid-column: 1; -ms-grid-row: 1; }

Slide 95

Slide 95

Gotcha’s — Internet Explorer New Autoprefixer! .grid__container { display: grid; display: -ms-grid; grid-gap: 10px; -ms-grid-columns: 1fr 10px 1fr 10px 1fr; -ms-grid-rows: 40px 10px 40px 10px 40px; grid-template: “a a a” 40px “b c c” 40px “b c c” 40px / 1fr 1fr 1fr; } https://css-tricks.com/css-grid-in-ie-css-grid-and-the-new-autoprefixer/ .grid__item:nth-child(1) { grid-area: a; -ms-grid-column: 1; -ms-grid-column-span: 3; -ms-grid-row: 1; }

Slide 96

Slide 96

Gotcha’s — Internet Explorer // IE Fallbacks 😞 🗑 🔥 // Fun Grid Stuff! 🤩 🎉 🧡 .grid__container { @supports ( display: grid ) { .grid__container { display: flex; display: grid; flex-flow: row wrap; } grid-template-columns: .grid__container > * { grid-gap: 20px; repeat( auto-fill, minmax( 200px, 1fr ) ); } margin: 10px; } .grid__container > * { margin: unset; } } codepen.io/collection/AvJKoR kirstyburgoine.co.uk

Slide 97

Slide 97

Conclusion CSS Grid is 🤩🎉🧡

Slide 98

Slide 98

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system.

Slide 99

Slide 99

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup.

Slide 100

Slide 100

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup. - We can allow content to flow within a given space.

Slide 101

Slide 101

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup. - We can allow content to flow within a given space.

  • CSS Grid is supported by 94.47% of browsers

Slide 102

Slide 102

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup. - We can allow content to flow within a given space.

  • CSS Grid is supported by 91.89% of browsers - Internet Explorer should not be a reason to avoid using grid anymore.

Slide 103

Slide 103

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup. - We can allow content to flow within a given space.

  • CSS Grid is supported by 91.89% of browsers - Internet Explorer should not be a reason to avoid using grid anymore. - Sub Grid will be even more awesome

Slide 104

Slide 104

Conclusion CSS Grid is 🤩🎉🧡 - Grid is a two dimensional layout system. - We can control entire page layouts with far less CSS and html markup. - We can allow content to flow within a given space.

  • CSS Grid is supported by 91.89% of browsers - Internet Explorer should not be a reason to avoid using grid anymore. - Sub Grid will be even more awesome

Slide 105

Slide 105

Thanks for listening. All of the examples shown can be found in a CodePen collection here: codepen.io/collection/AvJKoR WP Hooked 2021 - @kirstyburgoine - kirstyburgoine.co.uk