css day: css grid layout

122
CSS Grid Layout Rachel Andrew CSS Day, June 2015

Upload: rachel-andrew

Post on 28-Jul-2015

2.077 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: CSS Day: CSS Grid Layout

CSS Grid Layout

Rachel Andrew

CSS Day, June 2015

Page 2: CSS Day: CSS Grid Layout

Rachel Andrew

http://rachelandrew.co.uk

@rachelandrew

http://grabaperch.com

Page 3: CSS Day: CSS Grid Layout

The trouble with CSS layout

• Floats and clearfix hacks

• Absolute positioning means elements are taken out of document flow and risk overlaps

• Redundant markup and positioning oddities with display: table

• White space issues with inline-block

Page 4: CSS Day: CSS Grid Layout

https://www.flickr.com/photos/zervas/2810241612

Flexbox?

Page 5: CSS Day: CSS Grid Layout

Seeing Flexbox as the silver bullet for layout issues is likely to lead us down

another path of layout hacks.

Page 6: CSS Day: CSS Grid Layout

The cost of taming layout methods

• Developer hours spent learning non-obvious concepts.

• Compromises in terms of document semantics in order to achieve responsive layouts.

• Needing to lean on frameworks to help with complex math.

• Adding markup to create grids

• Using preprocessors to abstract layout hacks

Page 7: CSS Day: CSS Grid Layout

We need a designed for purpose layout system for the sites and applications we develop today.

Page 8: CSS Day: CSS Grid Layout

CSS Grid Layout

Page 9: CSS Day: CSS Grid Layout

Our HTML consists of a div with a class of wrapper and six child elements.

<div class="wrapper"> <div class="a">A</div> <div class="b">B</div> <div class="c">C</div> <div class="d">D</div> <div class="e">E</div> <div class="f">F</div> </div>

Page 10: CSS Day: CSS Grid Layout

To create a grid we use a new value of the display property.

display: grid

.wrapper { display: grid;

}

Page 11: CSS Day: CSS Grid Layout

We describe the grid using the new properties:

grid-template-columns

grid-template-rows

.wrapper { display: grid; grid-template-columns: 100px 10px 100px 10px 100px; grid-template-rows: auto 10px auto; }

Page 12: CSS Day: CSS Grid Layout

We position items using the new properties:

grid-column-startgrid-column-endgrid-row-startgrid-row-end

.a { grid-column-start: 1; grid-column-end: 2; grid-row-start: 1; grid-row-end: 2; }

Page 13: CSS Day: CSS Grid Layout

To position an item bottom centre, I start at column line 3, this is the line after the gutter track.

.b { grid-column-start: 3; grid-column-end: 4; grid-row-start: 3; grid-row-end: 4; }

Page 14: CSS Day: CSS Grid Layout

To span more tracks we just change the end row or column line.

.b { grid-column-start: 3; grid-column-end: 6; grid-row-start: 3; grid-row-end: 4; }

Page 15: CSS Day: CSS Grid Layout

The longhand for line-based placement means up to 4 properties to position each element. .a {

grid-column-start: 1; grid-column-end: 2; grid-row-start: 1; grid-row-end: 2; }

.b { grid-column-start: 3; grid-column-end: 4; grid-row-start: 3; grid-row-end: 4; }

Page 16: CSS Day: CSS Grid Layout

Declare start and end values with grid-column and grid-row.

Values are separated by a / symbol.

.a { grid-column: 1 / 2; grid-row: 1 / 2; }

.b { grid-column: 3 / 6; grid-row: 3 / 4; }

Page 17: CSS Day: CSS Grid Layout

Declare all 4 values using the grid-area property.

.a { grid-area: 1 / 1 / 2 / 2; }

.b { grid-area: 3 / 3 / 4 / 6; }

Page 18: CSS Day: CSS Grid Layout

Grid lines relate to writing mode. In a right to left language such as

Arabic the first column line is the right-hand line.

Page 19: CSS Day: CSS Grid Layout

Grid Terminology

Page 20: CSS Day: CSS Grid Layout

Grid Lines

Lines can be horizontal or vertical. They are referred to by number and can be

named.

Highlighted is Column Line 2.

Page 21: CSS Day: CSS Grid Layout

Grid Track

A Grid Track is the space between two Grid Lines. Tracks can be horizontal or

vertical (rows or columns).

The highlighted Grid Track is between Row Lines 2 and 3.

Page 22: CSS Day: CSS Grid Layout

Grid Cell

The smallest unit on our grid, a Grid Cell is the space between four Grid Lines. It’s

just like a table cell.

The highlighted Grid Cell is between row lines 2 and 3 and column lines 2 and 3.

Page 23: CSS Day: CSS Grid Layout

Grid Area

Any area of the Grid bound by 4 Grid Lines. It can contain many Grid Cells.

The highlighted Grid Area is between row lines 1 and 3, column lines 2 and 4.

Page 24: CSS Day: CSS Grid Layout

All examples can be found at http://gridbyexample.com. Use Chrome. Enable “Experimental Web Platform Features” flag.

Page 25: CSS Day: CSS Grid Layout

Line-based placement

Page 26: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/layout9.html

Page 27: CSS Day: CSS Grid Layout

The HTML around my page content.

The various areas of my page are child elements of a div with a class of wrapper.

<div class="wrapper">

<header class="mainheader"></header>

<div class="panel"></div>

<div class="content"></div>

</div>

Page 28: CSS Day: CSS Grid Layout
Page 29: CSS Day: CSS Grid Layout

Declaring a grid on wrapper.

The grid has three columns, and four rows.

.wrapper { width: 100%; max-width: 960px; margin: 0 auto; display: grid; grid-template-columns: 30% 5% 65%; grid-template-rows: 40px auto 20px auto; }

Page 30: CSS Day: CSS Grid Layout
Page 31: CSS Day: CSS Grid Layout

Positioning our elements using the grid-column and grid-row shorthand.

This is all we need to do to create our layout.

.mainheader { grid-column: 1 / 4; grid-row: 2 / 3; }

.panel { grid-column: 1 / 2; grid-row: 4 / 5; }

.content { grid-column: 3 / 4; grid-row: 4 / 5; }

Page 32: CSS Day: CSS Grid Layout
Page 33: CSS Day: CSS Grid Layout
Page 34: CSS Day: CSS Grid Layout

I can add a footer to this layout.

<div class="wrapper">

<header class="mainheader"></header>

<div class="panel"></div>

<div class="content"></div>

<footer class="mainfooter"></footer>

</div>

Page 35: CSS Day: CSS Grid Layout

Positioning the footer between row lines five and six.

.mainfooter { grid-column: 1 / 4; grid-row: 5 / 6; }

Page 36: CSS Day: CSS Grid Layout
Page 37: CSS Day: CSS Grid Layout

Our grid only has 5 row lines specified - yet we placed an item between row lines 5 and 6.

Grid creates an implicit grid line for us.

.wrapper { display: grid; grid-template-columns: 30% 5% 65%; grid-template-rows: 40px auto 20px auto; }

.mainfooter { grid-column: 1 / 4; grid-row: 5 / 6; }

Page 38: CSS Day: CSS Grid Layout

Grid lines can be explicit or implicit

• Explicit grid lines are those specified using grid-template-rows or grid-template-columns.

• Implicit lines are created when you place something into a row or column track outside of the explicit grid.

• Default behaviour is those tracks are auto sized. You can specify a size with the grid-auto-columns and grid-auto-rows properties.

Page 39: CSS Day: CSS Grid Layout

Grid is “table like” however …

• Unlike a table for layout Grid does not rely on your content being a particular order in the source.

• Being entirely described in CSS we can move things around the Grid at different breakpoints, introduce or redefine a Grid for any breakpoint.

Page 40: CSS Day: CSS Grid Layout

Power and Responsibility

• As with Flexbox you can use your ability to change how things are ordered for good or evil.

• Good = creating the most accessible source order and using Grid to get the optimal display for each device.

• Bad = using Grid as an excuse to forget about the source.

• Terrible - stripping out semantic elements to make everything a child of the grid.

Page 41: CSS Day: CSS Grid Layout

Using Grid to order the page elements in a single column for narrow screen widths.

.wrapper { display: grid; grid-template-rows: 10px auto 10px auto 10px auto 10px auto; } .mainheader { grid-row: 2 / 3; }

.content { grid-row: 4 / 5; }

.panel { grid-row: 6 / 7; }

.mainfooter { grid-row: 8 / 9; }

Page 42: CSS Day: CSS Grid Layout
Page 43: CSS Day: CSS Grid Layout

Redefine the Grid at min-width 550 pixels.

Position items as in the earlier example.

@media (min-width: 550px) { .wrapper { grid-template-columns: 30% 5% 65%; grid-template-rows: 40px auto 20px auto 20px auto; } .mainheader { grid-column: 1 / 4; grid-row: 2 / 3; } .panel { grid-column: 1 / 2; grid-row: 4 / 5; } .content { grid-column: 3 / 4; grid-row: 4 / 5; } .mainfooter { grid-column: 1 / 4; grid-row: 6 / 7; } }

Page 44: CSS Day: CSS Grid Layout

Named Grid Lines

Page 45: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/layout10.html

Page 46: CSS Day: CSS Grid Layout

Name lines with the name in parenthesis.

Remember we name grid lines and not grid tracks.

.wrapper { display: grid; grid-template-rows: 10px [row-header-start] auto [row-header-end] 10px [row-content-start] auto [row-content-end] 10px [row-panel-start] auto [row-panel-end] 10px [row-footer-start] auto [row-footer-end]; }

Page 47: CSS Day: CSS Grid Layout

Here we are positioning based on line numbers.

.mainheader { grid-row: 2 / 3; }

.content { grid-row: 4 / 5; }

.panel { grid-row: 6 / 7; }

.mainfooter { grid-row: 8 / 9; }

Page 48: CSS Day: CSS Grid Layout

Here we are positioning by named lines.

.mainheader { grid-row: row-header-start / row-header-end ; }

.content { grid-row: row-content-start / row-content-end; }

.panel { grid-row: row-panel-start / row-panel-end ; }

.mainfooter { grid-row: row-footer-start / row-footer-end; }

Page 49: CSS Day: CSS Grid Layout

15th May Editor’s Draft

Spec changed to use square brackets instead of parenthesis for named grid

lines. Shipped by Igalia for Blink on June 5th - I’ll update my examples online

once in Chrome.

Page 50: CSS Day: CSS Grid Layout

Named Areas

Page 51: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/layout11.html

Page 52: CSS Day: CSS Grid Layout

We assign a name to the elements on our page.

I am doing this outside of any Media Queries.

.mainheader { grid-area: header; }

.content { grid-area: content; }

.panel { grid-area: sidebar; }

.mainfooter { grid-area: footer; }

Page 53: CSS Day: CSS Grid Layout

Describe the layout on the parent element using the grid-template-areas property.

A period “.” indicates that this grid cell is empty.

.wrapper { display: grid; grid-template-rows: 10px auto 10px auto 10px auto 10px auto; grid-template-areas: "." "header" "." "content" "." "sidebar" "." "footer"; }

Page 54: CSS Day: CSS Grid Layout
Page 55: CSS Day: CSS Grid Layout
Page 56: CSS Day: CSS Grid Layout

Redefining the template areas for the wider layout. @media (min-width: 550px) {

.wrapper { grid-template-columns: 30% 5% 65%; grid-template-rows: 2em auto 1em auto 1em auto; grid-template-areas: ". . ." "header header header" ". . ." "sidebar . content" ". . ." "footer footer footer" } }

Page 57: CSS Day: CSS Grid Layout
Page 58: CSS Day: CSS Grid Layout
Page 59: CSS Day: CSS Grid Layout

Another syntax change!

The May 15th Editor’s Draft allows for multiple full stop characters to be used to indicate an empty cell.

This means you can line up your ascii art more neatly.

@media (min-width: 550px) { .wrapper { grid-template-columns: 30% 5% 65%; grid-template-rows: 2em auto 1em auto 1em auto; grid-template-areas: "....... ...... ......." "header header header " "....... ...... ......." "sidebar ...... content" "....... ...... ......." "footer footer footer " } }

Page 60: CSS Day: CSS Grid Layout

Implicit Named Grid Lines

Page 61: CSS Day: CSS Grid Layout

Named grid areas create four implicit named lines. You can use these in the same way as lines you have explicitly named.

.wrapper { grid-template-columns: 30% 5% 65%; grid-template-rows: 2em auto 1em auto 1em auto; grid-template-areas: ". . ." "header header header" ". . ." "sidebar . content" ". . ." "footer footer footer" }

.test { z-index: 100; background-color: red; grid-column: content-start / content-end; grid-row: content-start / footer-end; }

Page 62: CSS Day: CSS Grid Layout
Page 63: CSS Day: CSS Grid Layout

Items on the Grid can be layered using the z-index property.

Page 64: CSS Day: CSS Grid Layout

A 12 column, flexible grid

Page 65: CSS Day: CSS Grid Layout

The Bootstrap grid, and those in other frameworks relies on our describing the layout in the markup.

<!-- Stack the columns on mobile by making one full-width and the other half-width --> <div class="row"> <div class="col-xs-12 col-md-8">.col-xs-12 .col-md-8</div> <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div> </div>

<!-- Columns start at 50% wide on mobile and bump up to 33.3% wide on desktop --> <div class="row"> <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div> <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div> <div class="col-xs-6 col-md-4">.col-xs-6 .col-md-4</div> </div>

<!-- Columns are always 50% wide, on mobile and desktop --> <div class="row"> <div class="col-xs-6">.col-xs-6</div> <div class="col-xs-6">.col-xs-6</div> </div>

Page 66: CSS Day: CSS Grid Layout

With CSS Grid Layout we describe the layout in the CSS and can redefine that description at any breakpoint.

Page 67: CSS Day: CSS Grid Layout

getskeleton.com

Page 68: CSS Day: CSS Grid Layout

You can use the repeat keyword to repeat all or part of the grid definition.

This would create 4 200 pixel wide tracks, separated by a 20 pixel wide gutter track.

grid-template-columns: repeat(4, 200px 20px);

Page 69: CSS Day: CSS Grid Layout

The fr unit is a flexible length that represents a fraction of the available space in the grid container.

grid-template-columns: 5fr 1fr 10fr 1fr 5fr;

Page 70: CSS Day: CSS Grid Layout

We can give multiple grid lines the same name.

This means we can use the span keyword to span n number of lines, rather than specifying a specific grid line.

.wrapper { grid-template-columns: repeat(4, [col] 200px [gutter] 20px); }

.content { grid-column: col 2 / span gutter 2; }

Page 71: CSS Day: CSS Grid Layout

The markup used to create the Grid using the Skeleton framework.

Like the Bootstrap Grid and other similar frameworks it requires classes that describe the grid to be added to the markup.

<div class="container"> <h1>Skeleton Grid</h1> <div class="example-grid"> <div class="row"> <div class="four columns">Four columns</div> <div class="four columns">Four columns</div> <div class="four columns">Four columns</div> </div> <div class="row"> <div class="eight columns">Eight columns</div> <div class="four columns">Four columns</div> </div> <div class="row"> <div class="three columns">Three columns</div> <div class="three columns">Three columns</div> <div class="three columns">Three columns</div> <div class="three columns">Three columns</div> </div> <div class="row"> <div class="six columns">Six columns</div> <div class="six columns">Six columns</div> </div> </div>

Page 72: CSS Day: CSS Grid Layout
Page 73: CSS Day: CSS Grid Layout

When using CSS Grid Layout we have no need to describe our grid in markup.

<div class="wrapper skeleton"> <h1 class="header">CSS Grid Layout Version</h1> <div class="box1">Four columns</div> <div class="box2">Four columns</div> <div class="box3">Four columns</div> <div class="box4">Eight columns</div> <div class="box5">Four columns</div> <div class="box6">Three columns</div> <div class="box7">Three columns</div> <div class="box8">Three columns</div> <div class="box9">Three columns</div> <div class="box10">Six columns</div> <div class="box11">Six columns</div> </div>

Page 74: CSS Day: CSS Grid Layout

Defining the 12 column grid.

The repeat keyword repeats the pattern of columns or rows the number of times specified before the comma.

.wrapper { display: grid; grid-template-columns: repeat(11, [col] 4fr [gutter] 3.5fr ) [col] 4fr [gutter]; grid-template-rows: auto repeat(4, [row] auto [gutter] 15px); }

Page 75: CSS Day: CSS Grid Layout

Placing box1 on the grid.

Multiple lines have the same name. This means we can use the span keyword. Here I place box1 starting at the first line named col, spanning to the 4th line named gutter.

In the first row named row, spanning to the first line named gutter.

.box1 { grid-column: col / span gutter 4; grid-row: row / span gutter; }

Page 76: CSS Day: CSS Grid Layout

Placing box8 on the grid.

Starting on column line 7, spanning 3 gutter lines.

In the 3rd row named row, spanning 1 gutter line.

.box8 { grid-column: col 7 / span gutter 3; grid-row: row 3 / span gutter; }

Page 77: CSS Day: CSS Grid Layout
Page 78: CSS Day: CSS Grid Layout

With Grid Layout we can easily span rows just like columns.

.box1b { grid-column: col / span gutter 4; grid-row: row / span gutter 2; }

.box2b { grid-column: col 5 / span gutter 4; grid-row: row / span gutter 3; }

Page 79: CSS Day: CSS Grid Layout
Page 80: CSS Day: CSS Grid Layout

The header and footer span the full grid.

The content and panel display side by side.

.mainheader { grid-column: col / span gutter 12; grid-row: row /span gutter; }

.mainfooter { grid-column: col / span gutter 12; grid-row: row 3 /span gutter; }

.content { grid-column: col 5 / span gutter 8; grid-row: row 2 / span gutter; }

.panel { grid-column: col / span gutter 4; grid-row: row 2 / span gutter; }

Page 81: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/layout13.html

Page 82: CSS Day: CSS Grid Layout

The header and footer span the full grid.

The content and panel display side by side.

.mainheader { grid-column: col / span gutter 12; grid-row: row /span gutter; }

.mainfooter { grid-column: col / span gutter 12; grid-row: row 3 /span gutter; }

.content { grid-column: col 5 / span gutter 8; grid-row: row 2 / span gutter; }

.panel { grid-column: col / span gutter 4; grid-row: row 2 / span gutter; }

Page 83: CSS Day: CSS Grid Layout

I change three values to make our panel extend to the foot of the page.

.mainheader { grid-column: col / span gutter 12; grid-row: row /span gutter; }

.mainfooter { grid-column: col 5 / span gutter 8; grid-row: row 3 /span gutter; }

.content { grid-column: col 5 / span gutter 8; grid-row: row 2 / span gutter; }

.panel { grid-column: col / span gutter 4; grid-row: row 2 / span gutter 2; }

Page 84: CSS Day: CSS Grid Layout
Page 85: CSS Day: CSS Grid Layout

Grid Item Placement Algorithm

Page 86: CSS Day: CSS Grid Layout

http://dev.w3.org/csswg/css-grid/#grid-item-placement-algorithm

“The following grid item placement algorithm resolves automatic positions of grid items into definite positions, ensuring that every grid item has a well-defined grid area to lay out into.”

Page 87: CSS Day: CSS Grid Layout
Page 88: CSS Day: CSS Grid Layout

My markup is an unordered list with a class of wrapper.

The first list item contains text. The rest an image.

Two list items have a class of ‘wide’.

<ul class="wrapper"> <li class="text"><p>…</p></li> <li><img src="../images/balloon1.jpg" alt="hot air balloon" /> <p>Balloons 1</p></li> <li><img src="../images/balloon2.jpg" alt="hot air balloon" /> <p>Balloons 2</p></li> <li><img src="../images/balloon3.jpg" alt="hot air balloon" /> <p>Balloons 3</p></li> <li class="wide"><img src="../images/balloon4.jpg" alt="hot air balloon" /> <p>Balloons 4</p></li> <li><img src="../images/balloon5.jpg" alt="hot air balloon" /> <p>Balloons 5</p></li> <li><img src="../images/balloon6.jpg" alt="hot air balloon" /> <p>Balloons 6</p></li> <li class="wide"><img src="../images/balloon7.jpg" alt="hot air balloon" /> <p>Balloons 7</p></li> <li><img src="../images/balloon8.jpg" alt="hot air balloon" /> <p>Balloons 8</p></li> </ul>

Page 89: CSS Day: CSS Grid Layout
Page 90: CSS Day: CSS Grid Layout

Narrow screen layout, before any media queries.

A single column, single row grid.

Grid layout will create implicit rows for any additional list items.

.wrapper { display: grid; grid-template-columns: 1fr; grid-template-rows: auto; grid-auto-flow: dense; }

Page 91: CSS Day: CSS Grid Layout
Page 92: CSS Day: CSS Grid Layout

At a 460 pixel breakpoint we redefine the grid to have two equal columns.

With grid-auto-flow set to dense gaps are not left in the grid if they can be filled.

@media (min-width: 460px) { .wrapper { grid-template-columns: 1fr 1fr; } .text { grid-column: 1 / 3; } .wide { grid-column: auto / span 2; } }

Page 93: CSS Day: CSS Grid Layout
Page 94: CSS Day: CSS Grid Layout

We move to 4 equal columns at 660 pixels.

I position the li with a class of text between column lines 2 and 4, and row lines 1 and 3.

@media (min-width: 660px) { .wrapper { grid-template-columns: 1fr 1fr 1fr 1fr; }

.text { grid-column: 2 / 4; grid-row: 1 / 3; } }

Page 95: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/layout8.html

Page 96: CSS Day: CSS Grid Layout

The complete CSS for this grid.

.wrapper { display: grid; max-width: 960px; grid-template-columns: 1fr; grid-template-rows: auto; grid-auto-flow: dense; }

@media (min-width: 460px) { .wrapper { grid-template-columns: 1fr 1fr; } .text { grid-column: 1 / 3; } .wide { grid-column: auto / span 2; } }

@media (min-width: 660px) { .wrapper { grid-template-columns: 1fr 1fr 1fr 1fr; } .text { grid-column: 2 / 4; grid-row: 1 / 3; } }

Page 97: CSS Day: CSS Grid Layout

We change the value of grid-auto-flow to sparse.

.wrapper { display: grid; max-width: 960px; grid-template-columns: 1fr; grid-template-rows: auto; grid-auto-flow: sparse; }

@media (min-width: 460px) { .wrapper { grid-template-columns: 1fr 1fr; } .text { grid-column: 1 / 3; } .wide { grid-column: auto / span 2; } }

@media (min-width: 660px) { .wrapper { grid-template-columns: 1fr 1fr 1fr 1fr; } .text { grid-column: 2 / 4; grid-row: 1 / 3; } }

Page 98: CSS Day: CSS Grid Layout
Page 99: CSS Day: CSS Grid Layout

Grid Gotchas

Page 100: CSS Day: CSS Grid Layout

The Gutter Problem

Page 101: CSS Day: CSS Grid Layout
Page 102: CSS Day: CSS Grid Layout

Defining the 12 column grid.

We define Grid Tracks that will be used as columns, preceded by a line named ‘col’ and those used as gutters, preceded by a line named ‘gutter’.

.wrapper { display: grid; grid-template-columns: repeat(11, [col] 4fr [gutter] 3.5fr ) [col] 4fr [gutter]; grid-template-rows: auto repeat(4, [row] auto [gutter] 15px); }

Page 103: CSS Day: CSS Grid Layout
Page 104: CSS Day: CSS Grid Layout

A proposal for column-gap and row-gap has been shifted to Level 2 of the CSS

Grid Specification.

Page 105: CSS Day: CSS Grid Layout

With dynamic content we may not know how many rows we will need in a Grid. Grid will create implicit row lines for extra content - but won’t add a gutter track for us.

.wrapper { display: grid; grid-template-columns: repeat(11, [col] 4fr [gutter] 3.5fr ) [col] 4fr [gutter]; grid-template-rows: auto repeat(4, [row] auto [gutter] 15px); }

Page 106: CSS Day: CSS Grid Layout

Level 1 includes the ability to repeat a pattern auto number of times.

This is currently not implemented.

.wrapper { display: grid; grid-template-columns: repeat(11, [col] 4fr [gutter] 3.5fr ) [col] 4fr [gutter]; grid-template-rows: auto repeat(auto, [row] auto [gutter] 15px); }

Page 107: CSS Day: CSS Grid Layout

Nested Grids and Subgrids

Page 108: CSS Day: CSS Grid Layout

In this markup the boxes e, f and g are children of the element with a class of d.

<div class="wrapper"> <div class="box a">A</div> <div class="box b">B</div> <div class="box c">C</div> <div class="box d"> <div class="box e">E</div> <div class="box f">F</div> <div class="box g">G</div> </div> </div>

Page 109: CSS Day: CSS Grid Layout

I have declared a grid on the wrapper div, and positioned the immediate children - the elements with classes a to d.

.wrapper { display: grid; grid-template-columns: repeat(4, [col] 150px [gutter] 10px); grid-template-rows: repeat(2, [row] auto [gutter] 10px ); } .a { grid-column: col / span gutter 2; grid-row: row; } .b { grid-column: col 3 / span gutter 2; grid-row: row; } .c { grid-column: col / span gutter 2; grid-row: row 2; } .d{ grid-column: col 3 / span gutter 2; grid-row: row 2; }

Page 110: CSS Day: CSS Grid Layout
Page 111: CSS Day: CSS Grid Layout

To make box d a grid itself I declare a grid as normal then position the children of this element.

They take their grid lines from the grid declared on box d.

.d{ grid-column: col 3 / span gutter 2; grid-row: row 2; display: grid; grid-template-columns: 1fr 10px 1fr; grid-template-rows: auto 10px auto; }

.e { grid-column: 1 / 4; grid-row: 1; }

.f { grid-column: 1; grid-row: 3; }

.g { grid-column: 3; grid-row: 3; }

Page 112: CSS Day: CSS Grid Layout

http://gridbyexample.com/examples/code/example21.html

Page 113: CSS Day: CSS Grid Layout

Declaring a subgrid

Page 114: CSS Day: CSS Grid Layout

In our existing layout we are creating a completely new grid on box d.

.d{ grid-column: col 3 / span gutter 2; grid-row: row 2; display: grid; grid-template-columns: 1fr 10px 1fr; grid-template-rows: auto 10px auto; }

Page 115: CSS Day: CSS Grid Layout

If we declare that this grid is a subgrid, we can then position the children of this element on the same grid their parent is placed on. .d{

grid-column: col 3 / span gutter 2; grid-row: row 2; display: grid; grid-template-columns: subgrid; grid-template-rows: subgrid; }

Page 116: CSS Day: CSS Grid Layout

http://dev.w3.org/csswg/css-grid/

“The following features are at-risk, and may be dropped during the CR period:

the subgrid value of grid-template-columns and grid-template-rows, and its component parts individually”

Page 117: CSS Day: CSS Grid Layout

Without subgrid we create the potential for accessibility problems. Authors may remove semantic markup in order to use grid layout.

Page 118: CSS Day: CSS Grid Layout

http://fantasai.inkedblade.net/style/discuss/subgrid-markup/

Page 119: CSS Day: CSS Grid Layout

Grid needs your feedback!

Enable Experimental Web Platform Features in Chrome.

Play with my examples and think up ways you would use Grid.

Follow the CSS Grid conversation on www-style by searching for [css-grid].

See the current issues in the Editor’s Draft http://dev.w3.org/csswg/css-grid/#issues-index

Page 120: CSS Day: CSS Grid Layout

Browser SupportAll my examples work in Chrome unprefixed - you need to enable the Experimental Web Platform Features flag.

You can also use Webkit nightlies, with the -webkit prefix.

The work in Blink and Webkit is being done by Igalia, sponsored by Bloomberg.

IE10 and up has support for the old syntax, with an -ms prefix.

Mozilla are currently implementing Grid in Firefox.

There is a Polyfill under active development: https://github.com/FremyCompany/css-grid-polyfill/

Page 121: CSS Day: CSS Grid Layout

All examples can be found at http://gridbyexample.com. Use Chrome. Enable “Experimental Web Platform Features” flag.

Page 122: CSS Day: CSS Grid Layout

Thank you!

http://rachelandrew.co.uk/presentations/css-grid

@rachelandrew