And (CSS) Grid
From Flex to Grid
CSS grid layout (from here on, just
-
A Complete Guide to Grid – CSS Tricks
Thegrid version of theflexbox classic. -
CSS Grid Layout: A New Layout Module for the Web
WebKit (Safari’s) overview, from 2017. -
Basic Concepts of Grid Layout - MDN
Back to MDN. -
Basics of CSS Grid
From web guru Jen Simmons. -
Flexbox vs. CSS Grid
Jen unpacks when to use each regime. -
Grid by Example
Loads of examples. -
Grid Garden
Like the Froggy game, but for grid.
We had some of this two-dimensionality with flex-wrap, but grid offers us
Grid is display: grid; tells its (immediate) children/display: inline-grid; which behaves the same internally—but with the parent behaving as an inline element.
Grid truly supplants many of the previous box model layout approaches (like float, margin-centering, etc.) and, like flex, works much closer to how we
There are many novel, powerful uses for
As in nature, systems of order govern the growth and structure of animate and inanimate matter.
So human activity itself has, since the earliest times, been distinguished by the quest for order.
Grid Terminology
Grid introduces us to some new vocabulary:
- Line
- The dividing lines that define the grid, vertical or horizontal. (Think
gutters .) - Track
- The horizontal or vertical space between the lines. (Think
rows andcolumns .) - Cell
- The intersection of a horizontal and vertical track. This is different from a
grid item —the cell is the spot/placement, the item is the actual element—since as you’ll see, you can positionitems in an arbitrarycell . - Area
- You can combine one or more adjacent grid cells into a rectangular
area. Often you give these a subjective name, for convenience/ergonomics.
New Units and Functions
Grid also introduces some specific new length units:
fr-
This new unit represents a
fraction of the available space in the grid container—usually,inline-size(width ). This is very similar to using whole numbers inflex-basis. It is very handy; you’ll use it a lot with grid:.two-thirds-one-third { display: grid; grid-template-columns: 2fr 1fr; } min-content-
The
intrinsic minimum size of an element. With text, this is the longest single word:.narrow-sidebar { display: grid; grid-template-columns: 1fr min-content; } max-content-
Same for the maximum. With text, this is the whole sentence/line:
.wider-sidebar { display: grid; grid-template-columns: 1fr max-content; } fit-content-
A combo of the min/max. Uses the available space—but never less than
min-contentand never more thanmax-content:.fit-sidebar { display: grid; grid-template-columns: 1fr fit-content; }You can use these last three values in grid properties
( min-,max-, andfit-content) , as we’ll see below—but they are also usable anywhere length units work—likeinline-sizeorblock-size.
…and also functions to use the units:
minmax()-
A function that defines a range for a
track —setting a minimum and maximum lengthtogether . These are really useful for setting reasonable limits on responsive grid designs:.flexible-sidebar { display: grid; grid-template-columns: 1fr minmax(12rem, 25rem); } repeat()-
This function repeats a
track list, so you don’t have to write it over and over:.twelve-columns { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr; /* How many columns is this? 👆 */ } .also-twelve-columns { display: grid; grid-template-columns: repeat(12, 1fr); /* Much better. */ }
Container (Parent) Properties
Again, grid is a lot like flex—primarily properties that are applied on a container/parent element.
grid-template-columns / grid-template-rows
Setting display: grid; won’t do much until you also declare some columns or rows. You can specify grid-template-columns, grid-template-rows, or both. These properties are followed by a
grid-template-columns– MDNgrid-template-rows– MDN
Define yourtracks .
grid-auto-flow: row; is the default setting. The third example sets this to column to make it flow to a new one.
Again like flex, there is similar behavior on the horizontal/vertical
So for many uses, you will only need to specify your column structure—leaving the rows to create themselves, as needed. This is called an
grid-auto-columns / grid-auto-rows
By default, these auto (the largest content), but you can also specify their size—often a grid-auto-rows:
grid-auto-columns– MDNgrid-auto-rows– MDN
Lets the content create thetracks .
The perpendicular grid-auto-columns only comes up if you force the columns to wrap with grid-auto-flow: column; as in the earlier example. Again—height is usually not our main constraint, with scrolling!
gap / column-gap / row-gap
Grid also shares the gap, column-gap, and row-gap properties with flex—to add gutters between the
gap– MDNrow-gap– MDNcolumn-gap– MDN
The exact same as with flex!
grid without a gap.
justify-items
Also like flex (there’s a pattern here), we can position items within the tracks—but now we have control over both axes and the overall placement. To start, justify-items positions all the
justify-items – MDN
This only works with grid.
The terminology here is always a bit confusing, but think of it this way—in grid, the main axis is
align-items
And align-items directly corresponds to the flex values, to position all the
align-items – MDN
Same as flex, again!
auto/content height.
There are also baseline alignment values, to keep text on the same line across your columns:
justify-content / align-content
If the total size of your grid is less than the container (because of your
justify-content– MDNalign-content– MDN
When there is extra space.
Shorthand?
Grid also has shorthand properties for many of these, like just grid, grid-template, place-items, and place-content. However just like everything else, grid is complicated enough as it is! The shorthands really obfuscate the behavior, and aren’t worth the slightly tighter syntax.
Okay, so far this is mostly like flex! To the point where you can often use them interchangeably for some layouts.
But now let’s look at where grid offers more
Using repeat()
Grid’s repeat function is very commonly used to make even-column grids. And of course, they can be made responsive with media queries and CSS variables!
repeat() – MDN
Remember, D.R.Y!
The () indicates this is a calc() ) that you would pass
flex-wrap pseudo-grids.
Flex is sometimes referred to in this way as
auto-fill / auto-fit
You can also use the repeat function without specifying an exact number of columns, instead using auto-fill or auto-fit to automatically define your columns—making a grid inherently responsive without any media queries! These are great for controlling an even-column layout without much overhead:
- Auto-Sizing Columns in CSS Grid – CSS Tricks
Better than MDN, for this.
auto-fill / auto-fit behaviors.
grid-template-areas
Grid is really useful for scaffolding out layouts, and sometimes it is helpful to give your
grid-template-areas – MDN
These are grid’s real designer superpower.
This is done with a bit of ASCII art to reflect the layout! Repeating the name of a
You can also name grid lines with [linename] length syntax, but you don’t see this done as much.
section {
display: grid;
grid-template-columns: 2fr 1fr;
grid-template-areas:
"header header "
"main sidebar"
"footer sidebar";
}
Item (Child) Properties
You can really start to see the power of grid when you use these properties on the individual
grid-area
If you’ve defined grid-template-areas (as above), you can then assign individual children to these areas:
grid-area – MDN
These go on the items/children.
This is the kind of common layout that was
grid-column / grid-row
You can also control grid-column and grid-row properties.
grid-column– MDNgrid-row– MDN
Where should the item go?
These take two values, divided with a / (because CSS is inconsistent), which specify the span value for bridging across tracks:
span multiple tracks, and also that you either add a span These are
You can also leave off the span, regardless of where the item falls in the grid:
grid-auto-flow: dense; to the container—allowing the seventh item to scoot up “before” the bigger one.
And if you specify non-contiguous rows or columns, grid will dutifully create as many
order in flex, this arrangement is only visual! Keep your DOM in a logical, semantic sequence.
Keep in mind that with both grid-area and grid-column / grid-row, you are able to tell multiple z-index to specify which one is visually in front!
justify-self / align-self
Finally, just like flex—you can position individual justify-self and align-self. The syntax is the same as align in flex, again—but as with justify-items / align-items above, you don’t have to flip axes:
justify-self– MDN
Just for grid.align-self– MDN
Same as in flex!
justify/align values, of course!
The grid system is an aid, not a guarantee.
It permits a number of possible uses and each designer can look for a solution appropiate to [their] personal style.
But one must learn how to use the grid; it is an art that requires practice.