CSS Grid Changes Everything - Keynote at WebCamp Zagreb 2017
- 33. 1990 20031996 2015
Web Standards
Period
-
Floats
Clears
Blogs
“Web 2.0”
CSS layout hell
Web
as
text
period
1994
DarkAges
Wild West
period
-
Tables
Frames
Flash
“Pixel-perfect”
UncertaintyPeriod
- 39. 1990 20031996 2015
Web Standards
Period
-
Floats
Clears
Blogs
“Web 2.0”
CSS layout hell
Web
as
text
period
1994
DarkAges
Wild West
period
-
Tables
Frames
Flash
“Pixel-perfect”
UncertaintyPeriod
2017
Web
as
Layout
Surface
- 59. <div class="MomentsGuidePage-capsules">
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummary--hero"></div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
</div>
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
- 66. Since the beginning of (web) time,
web layouts have been broken.
We’ve just refined
how we break them.
- 70. .main-content .sidebar
.wrap.wrap {
border: 5px solid red;
}
.main-content {
width: 45%;
float: left;
background: blue;
}
.sidebar {
width: 45%;
float: right;
background: green;
}
/* Clearfix */
.wrap:after {
content: "";
display: table;
clear: both;
}
- 74. .main-content .sidebar
.wrap.wrap {
display: flex;
justify-content:
space-between;
border: 5px solid red;
}
.container {
width: 45%;
}
.main-content {
background: blue;
}
.other-content {
background: purple;
}
.sidebar {
width: 45%;
background: green;
}
.container
.other-content
- 75. This is a hack.
float and flex force us
to create HTML clutter in
the form of wrappers
like the .container
element in this example.
.main-content .sidebar
.wrap
.container
.other-content
- 76. This is web
layouts today.
float and flex have
been the two only
options for creating
horizontal layouts
resulting in the web
suffering from a severe
case of Divitis.
.main-content .sidebar
.wrap
.container
.other-content
- 80. Me, every time I build a new site
What if
we didn’t have to do this
any more…
- 81. <div class="MomentsGuidePage-capsules">
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummary--hero"></div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
</div>
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
- 84. <div class="MomentsGuidePage-capsules">
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummary--hero"></div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
</div>
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
- 85. <div class="MomentsGuidePage-capsules">
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummary--hero"></div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
</div>
<div class="MomentsCapsuleSummaryGroup">
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
<div class="MomentsCapsuleSummaryGroup-list">
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
- 86. <div class="MomentsGuidePage-capsules">
<div class="MomentsCapsuleSummary--hero"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
<div class="MomentsCapsuleSummary--portrait"></div>
</div>
- 87. <ul class="MomentsGuidePage-capsules">
<li class="MomentsCapsuleSummary--hero"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
<li class="MomentsCapsuleSummary"></li>
</ul>
- 88. Problem:
Current tools for web
layout are
content-out and
one-dimensional.
Solution:
Two-dimensional
layout-in tool to
separate content
from presentation.
- 95. • Grid container
• Grid item
• Grid line
• Grid cell
• Grid track
• Grid area
• Grid gap
CSS Grid
Terminology:
- 96. Element containing a grid,
defined by setting
display: grid;
Grid container <div class="site">
<header class="masthead">
</header>
<h1 class="page-title">
</h1>
<main class="main-content">
</main>
<aside class="sidebar">
</aside>
<footer class="footer">
</footer>
</div><!-- .site -->
- 97. Element that is a direct
descendant of the grid
container.
Grid item <div class="site">
<header class="masthead">
</header>
<h1 class="page-title">
</h1>
<main class="main-content">
</main>
<aside class="sidebar">
</aside>
<footer class="footer">
</footer>
</div><!-- .site -->
- 99. Grid lines are referenced
by number, starting and
ending with the outer
borders of the grid.
Grid line 1
2
3
4
5
6
1 2 3 4 5 6
- 102. The space between two or
more adjacent grid lines.
Row tracks are horizontal,
Column tracks vertical.
Grid track
- 103. Empty space between grid
tracks (shown in blue).
Commonly called gutters.
Grid gap 1
2
3
4
5
6
1 2 3 4 5 6
- 105. 1. Define a grid.
2. Place items within the grid.
3. Make world peace.
CSS Grid
in a
Nutshell:
- 109. .site
2 fractions 1 fraction each
2fr 1fr 1fr
Draws grid lines. Takes list
of length values (em, px, %,
fr, etc.) denoting the
distance between each line.
grid-template-columns:
2fr 1fr 1fr;
- 110. .site
Fit content
auto
1 fraction
1fr
3 fractions
3fr
Draws grid lines. Takes list
of length values (em, px, %,
fr, etc.) denoting the
distance between each line.
grid-template-rows:
auto 1fr 3fr;
- 112. .site
1 2 3 4
.masthead
grid-column: 2/4;
grid-row: 2/3;
Applied to grid items. Defines
the start and end grid lines
for columns and rows.
- 113. .site
1 2 3 4
Start at column line 2.
End at column line 4.
.masthead
grid-column: 2/4;
grid-row: 2/3;
- 115. .site.site {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
grid-template-rows: auto 1fr 3fr;
}
.masthead {
grid-column: 2/4;
grid-row: 2/3;
}
.page-title {
grid-column: 1/4;
grid-row: 1/2;
}
.main-content {
grid-column: 1/2;
grid-row: 2/4;
}
/* etc etc */
1
2
3
4
1 2 3 4
.page-title
.main-content
.sidebar .footer
.masthead
- 116. Naysayer to your left
Looks promising, but
remembering what lines to
target seems tricky… especially
when the site is responsive.
- 120. title title title
main
main
header header
sidebar footer
.page-title
.main-content
.sidebar .footer
.masthead
.site.site {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
grid-template-rows: auto 1fr 3fr;
grid-template-areas:
"title title title"
"main header header"
"main sidebar footer";
}
.masthead {
grid-area: header;
}
.page-title {
grid-area: title;
}
.main-content {
grid-area: main;
}
/* etc etc */
- 121. .site {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: auto 1fr 3fr;
grid-template-areas:
"title title"
"main header"
"main sidebar";
}
.masthead {
grid-area: header;
}
.page-title {
grid-area: title;
}
.main-content {
grid-area: main;
}
.sidebar {
grid-area: sidebar;
}
.footer {
grid-area: footer;
}
@media screen and (min-width: 34em) {
.site {
grid-template-columns: 2fr 1fr 1fr;
grid-template-areas:
"title title title"
"main header header"
"main sidebar footer";
}
}
- 123. Girds are not inherited by
child elements. Instead we
create nested grids.
Nested grids
- 127. Use CSS Grid any time you work with
two-dimensional layouts.
- 137. Creates as many 10em columns as will fit
within the grid container.
Will create empty columns.
grid-template-columns:
repeat(auto-fill, 10em);
- 138. Creates as many 10em columns as will fit
within the grid container.
Does not create empty columns.
grid-template-columns:
repeat(auto-fit, 10em);
- 143. Internet Explorer 101 and Edge2 lag behind*
1 IE10 uses the original Grid specification.
2 Edge is adopting the modern specification October 17th.
* Fun fact: CSS Grid was invented by Microsoft for IE10.
- 144. Use feature queries to test for grid support
in the current browser.
@supports (display: grid) { … }
Current recommendation:
- 149. Responsive Web Design means
we’ve been serving up
different layouts for different browsers
since 2010.
- 157. 1. Build accessible mobile-first
layout without grid.
2. Use mobile-first layout as
fallback for all browsers.
3. Use @supports to detect grid
support.
4. At the appropriate
breakpoint, create layout
with grid and grid-areas.
5. Explore new layouts as
viewport widens.
CSS Grid:
A Practical
Approach
for Today
- 164. Mozilla also has
a demo site with
has exhaustive
documentation.
https://goo.gl/wa0Fk9
- 165. CSS Tricks has a
Complete Guide
to CSS Grid.
https://goo.gl/Z01gjF
- 170. 1. Make it accessible.
2. Make it fancy.
3. Make sure the fancy
doesn’t break
accessibility.