When
grid-template-areas:
"....... header header"
"sidebar content content";
is changed to:
grid-template-areas:
"....... header header"
"sidebar header content";
Everything falls apart.
How can I achieve the same effect with CSS Grid layout?
body {
margin: 40px;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.header {
grid-area: header;
}
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 120px 120px 120px;
grid-template-areas: "....... header header" "sidebar content content";
background-color: #fff;
color: #444;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 20px;
font-size: 150%;
}
.header {
background-color: #999;
}
<div class="wrapper">
<div class="box header">Header</div>
<div class="box sidebar">Sidebar</div>
<div class="box content">Content</div>
</div>
https://codepen.io/rachelandrew/pen/oXKgoQ
The problem is that you are applying the grid-template-columns property to grid items. This is a grid container property. It will be ignored on grid items (unless they are also grid containers). Instead use the grid-column and grid-row properties, which apply to grid items.
The initial value of grid-template-columns and grid-template-rows is none . So to reset the properties (meaning there are no explicit tracks created), you would switch to grid-template-columns: none in your media query. You can also switch to grid-template-columns: 1fr , which creates a grid with one explicit column.
A CSS grid template area makes a visual representation of the grid using both columns and rows. This makes for a faster design process than when line-based placement or grid-column and grid-row values are used.
Using transitions is one way to animate your grid rows and columns. If your design adjusts the grid structure to cater to different viewports, as long as the number of rows and columns remain the same throughout, you'll see the rows and columns animate to their new sizes.
When it comes to using ASCII art with the grid-template-areas
property, there is an important limitation currently in place: Named grid areas must be rectangular.
In other words, tetris-shaped grid areas of the same name are not allowed.
This behavior is defined in two parts of the spec.
7.3. Named Areas:
the grid-template-areas
propertyIf a named grid area spans multiple grid cells, but those cells do not form a single filled-in rectangle, the declaration is invalid.
Non-rectangular or disconnected regions may be permitted in a future version of this module.
Every grid item has a grid area, a rectangular set of grid cells that the grid item occupies.
In your first example, all grid areas form rectangles. So the rule is valid.
grid-template-areas:
"....... header header"
"sidebar content content";
In your second example, the header
area forms a non-rectangular shape. So the rule is invalid.
grid-template-areas:
"....... header header"
"sidebar header content";
(Note that a period (.
) or series of connected periods (...
) form an unnamed grid area, to which the rule above does not apply (spec reference).)
Fortunately, Grid provides multiple methods for laying out grid items.
Instead of grid-template-areas
, you can use line-based placement.
.wrapper {
display: grid;
grid-gap: 10px;
grid-template-columns: 120px 120px 120px;
grid-auto-rows: 100px;
background-color: #fff;
color: #444;
}
.header {
grid-column: 2 / 4;
grid-row: 1 / 3;
}
.sidebar {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.content {
grid-column: 3 / 4;
grid-row: 2 / 3;
}
.box {
background-color: #444;
color: #fff;
border-radius: 5px;
padding: 20px;
font-size: 150%;
}
.header {
background-color: #999;
}
body {
margin: 40px;
}
<div class="wrapper">
<div class="box header">Header</div>
<div class="box sidebar">Sidebar</div>
<div class="box content">Content</div>
</div>
ALSO, note that all string values of grid-template-areas
must have the same number of columns. See this post for more details:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With