CSS Grids or: How I Learned to Stop Worrying and Love the new spec By Ariel Wiznia
Hello! - I'm a frontend developer currently working at R/GA, Buenos Aires - I've been working on the web since the marvelous Flash years - I survived the table layout... - Embraced the new div way to build websites... - and now I'm ready for the future!
So...what's the future? GRIDS!
Grids are a new way of organizing a layout via CSS on a page It allows us to define a structure in which you can control what goes into each row or column and in what order.
Standard grid
Grid lines
Grid lines (highlighted)
Grid track
Grid cell
Grid area
Defining a grid HTML:
Header
Content
Aside
Footer
CSS: .container { display: grid; }
Setting grid layout CSS: .container { display: grid; gridtemplaterows: 200px 35px 420px 35px 200px; gridtemplatecolumns: 740px 35px 185px; margin: auto; maxwidth: 960px; } .container div { border: 2px solid #c7c7c7; backgroundcolor: #fff; display: flex; alignitems: center; justifycontent: center; font: bold 30px/1 'Montserrat', Helvetica, sansserif; }
Defining where each content will be placed CSS: .header { gridcolumnstart: 1; gridcolumnend: 4; gridrowstart: 1; gridrowend: 2; } .main { gridcolumnstart: 1; gridcolumnend: 2; gridrowstart: 3; gridrowend: 4; } .aside { gridcolumnstart: 3; gridcolumnend: 4; gridrowstart: 3; gridrowend: 4; } .footer {
View on CodePen
Grid column / grid row simplified: .header { gridcolumn: 1 / 4; gridrow: 1 / 2; } .main { gridcolumn: 1 / 2; gridrow: 3 / 4; } .aside { gridcolumn: 3 / 4; gridrow: 3 / 4; } .footer { gridcolumn: 1 / 4; gridrow: 5 / 6; }
View on CodePen
Grid column / grid row even more simplified: .header { gridarea: 1 / 1 / 2 / 4; } .main { gridarea: 3 / 1 / 4 / 2; } .aside { gridarea: 3 / 3 / 4 / 4; } .footer { gridarea: 5 / 1 / 6 / 4; }
View on CodePen
Grid layout without gaps: .container { display: grid; gridtemplaterows: 200px 35px 420px 35px 200px; gridtemplatecolumns: 740px 35px 185px; margin: auto; maxwidth: 960px; }
Setting grid layout (with gaps!) CSS: .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridgap: 35px; margin: auto; maxwidth: 960px; }
CSS: .header { gridcolumn: 1 / 3; gridrow: 1 / 2; } .main { gridcolumn: 1 / 2; gridrow: 2 / 3; } .aside { gridcolumn: 2 / 3; gridrow: 2 / 3; } .footer { gridcolumn: 1 / 3; gridrow: 3 / 4; }
View on CodePen
Adding the "span" keyword: .header { gridcolumn: 1 / span 2; gridrow: 1; } .main { gridcolumn: 1; gridrow: 2; } .aside { gridcolumn: 2; gridrow: 2; } .footer { gridcolumn: 1 / span 2; gridrow: 3; }
View on CodePen
Adding name based grid lines: .container { display: grid; gridtemplaterows: [row1start] 200px [row2start] 420px [row3start] 200px [row gridtemplatecolumns: [col1start] 740px [col2start] 185px [col2end]; gridgap: 35px; margin: auto; maxwidth: 960px; }
Adding name based grid lines (extended): .header { gridcolumn: col1start / col2end; gridrow: row1start; } .main { gridcolumn: col1start; gridrow: row2start; } .aside { gridcolumn: col2start; gridrow: row2start; } .footer { gridcolumn: col1start / col2end; gridrow: row2end; }
View on CodePen
Defining the same name for every row/col: .container { display: grid; gridtemplaterows: [row] 200px [row] 420px [row] 200px [row]; gridtemplatecolumns: [col] 740px [col] 185px [col]; gridgap: 35px; margin: auto; maxwidth: 960px; }
Specifying each row/col: .header { gridcolumn: col 1 / 3; gridrow: row; } .main { gridcolumn: col 1; gridrow: row 2; } .aside { gridcolumn: col 2; gridrow: row 2; } .footer { gridcolumn: col 1 / 3; gridrow: row 3; }
View on CodePen
Explicit vs Implicit grid
Nested Grids HTML:
Header
Subcontent 1
Subcontent 2
Subcontent 3
Aside
Footer
CSS: .main { gridcolumn: col 1; gridrow: row 2; display: grid; padding: 10px; gridgap: 10px; gridtemplatecolumns: 50% 50%; } .subcontent1 { gridcolumn: 1 / 3; gridrow: 1; } .subcontent2 { gridcolumn: 1; gridrow: 2; } .subcontent3 { gridcolumn: 2; gridrow: 2;
View on CodePen
Grid auto rows/columns .container { display: grid; gridtemplaterows: [row] 200px [row] 420px [row] 200px [row]; gridtemplatecolumns: [col] 740px [col] 185px; gridgap: 35px; gridautorows: 500px; gridautocolumns: 200px; margin: auto; maxwidth: 960px; }
View on CodePen
Grid areas CSS: .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; } .header { gridarea: header; } .main { gridarea: content; } .aside {
View on CodePen
Defining grid placement based on grid area name HTML:
Header
Content
Aside
Footer
Overlay
CSS: .container .overlay { backgroundcolor: #ff0000; gridcolumn: contentstart / contentend; gridrow: headerstart / contentend; }
View on CodePen
Align items / Justify items There are 4 possible values for this properties: start end stretch center .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; alignitems: center; }
View on CodePen
.container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; alignitems: start; }
View on CodePen
.container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; alignitems: end; }
View on CodePen
.container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; alignitems: stretch; }
View on CodePen
Align items / Justify items .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; justifyitems: center; }
View on CodePen
Align items / Justify items .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; justifyitems: start; }
View on CodePen
Align items / Justify items .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; justifyitems: end; }
View on CodePen
Align items / Justify items .container { display: grid; gridtemplaterows: 200px 420px 200px; gridtemplatecolumns: 740px 185px; gridtemplateareas: "header header" "content aside" "footer footer"; gridgap: 35px; margin: auto; maxwidth: 960px; justifyitems: stretch; }
View on CodePen
So..what about the real world?
Grid support: not much...for now!
Enabling grid support on the browser: Firefox
Enabling grid support on the browser: Chrome
Files on https://github.com/wiznia/grids Download talk on PDF at: https://raw.githubusercontent.com/wizni a/grids/master/css-grids.pdf Codepen examples from this talk at: http://codepen.io/wiznia/ My Twitter: @wiznia
Thank you!