Properties for the Parent
(Grid Container)
display
Defines the element as a grid container and establishes a new grid formatting context for its contents.
Values:
- grid - generates a block-level grid
- inline-grid - generates an inline-level grid
Note: The ability to pass grid parameters down through nested elements (aka subgrids) has been moved to level 2 of the CSS Grid specification. Here's a quick explanation.
grid-template-columns
grid-template-rows
Defines the columns and rows of the grid with a space-separated list of values. The values represent the track size, and the space between them represents the grid line.
Values:
- <track-size> - can be a length, a percentage, or a fraction of the free space in the grid (using the
fr
unit) - <line-name> - an arbitrary name of your choosing
Examples:
When you leave an empty space between the track values, the grid lines are automatically assigned positive and negative numbers:
But you can choose to explicitly name the lines. Note the bracket syntax for the line names:
Note that a line can have more than one name. For example, here the second line will have two names: row1-end and row2-start:
If your definition contains repeating parts, you can use the
repeat()
notation to streamline things:
Which is equivalent to this:
If multiple lines share the same name, they can be referenced by their line name and count.
The
fr
unit allows you to set the size of a track as a fraction of the free space of the grid container. For example, this will set each item to one third the width of the grid container:
The free space is calculated after any non-flexible items. In this example the total amount of free space available to the
fr
units doesn't include the 50px:grid-template-areas
Defines a grid template by referencing the names of the grid areas which are specified with the
grid-area
property. Repeating the name of a grid area causes the content to span those cells. A period signifies an empty cell. The syntax itself provides a visualization of the structure of the grid.
Values:
- <grid-area-name> - the name of a grid area specified with
grid-area
- . - a period signifies an empty grid cell
- none - no grid areas are defined
Example:
That'll create a grid that's four columns wide by three rows tall. The entire top row will be comprised of the header area. The middle row will be comprised of two main areas, one empty cell, and one sidebar area. The last row is all footer.
Each row in your declaration needs to have the same number of cells.
You can use any number of adjacent periods to declare a single empty cell. As long as the periods have no spaces between them they represent a single cell.
Notice that you're not naming lines with this syntax, just areas. When you use this syntax the lines on either end of the areas are actually getting named automatically. If the name of your grid area is foo, the name of the area's starting row line and starting column line will be foo-start, and the name of its last row line and last column line will be foo-end. This means that some lines might have multiple names, such as the far left line in the above example, which will have three names: header-start, main-start, and footer-start.
grid-template
A shorthand for setting
grid-template-rows
, grid-template-columns
, and grid-template-areas
in a single declaration.
Values:
- none - sets all three properties to their initial values
- <grid-template-rows> / <grid-template-columns> - sets
grid-template-columns
andgrid-template-rows
to the specified values, respectively, and setsgrid-template-areas
tonone
It also accepts a more complex but quite handy syntax for specifying all three. Here's an example:
That's equivalent to this:
Since
grid-template
doesn't reset the implicit grid properties (grid-auto-columns
, grid-auto-rows
, and grid-auto-flow
), which is probably what you want to do in most cases, it's recommended to use the grid
property instead of grid-template
.
grid-column-gap
grid-row-gap
Specifies the size of the grid lines. You can think of it like setting the width of the gutters between the columns/rows.
Values:
- <line-size> - a length value
Example:
The gutters are only created between the columns/rows, not on the outer edges.
Note: The
grid-
prefix will be removed and grid-column-gap
and grid-row-gap
renamed to column-gap
and row-gap
. The unprefixed properties are already supported in Chrome 68+, Safari 11.2 Release 50+ and Opera 54+.grid-gap
A shorthand for
grid-row-gap
and grid-column-gap
Values:
- <grid-row-gap> <grid-column-gap> - length values
Example:
If no
grid-row-gap
is specified, it's set to the same value as grid-column-gap
Note: The
grid-
prefix will be removed and grid-gap
renamed to gap
. The unprefixed property is already supported in Chrome 68+, Safari 11.2 Release 50+ and Opera 54+.justify-items
Aligns grid items along the inline (row) axis (as opposed to
align-items
which aligns along the block (column) axis). This value applies to all grid items inside the container.
Values:
- start - aligns items to be flush with the start edge of their cell
- end - aligns items to be flush with the end edge of their cell
- center - aligns items in the center of their cell
- stretch - fills the whole width of the cell (this is the default)
Examples:
This behavior can also be set on individual grid items via the
justify-self
property.align-items
Aligns grid items along the block (column) axis (as opposed to
justify-items
which aligns along the inline (row) axis). This value applies to all grid items inside the container.
Values:
- start - aligns items to be flush with the start edge of their cell
- end - aligns items to be flush with the end edge of their cell
- center - aligns items in the center of their cell
- stretch - fills the whole height of the cell (this is the default)
Examples:
This behavior can also be set on individual grid items via the
align-self
property.place-items
place-items
sets both the align-items
and justify-items
properties in a single declaration.
Values:
- <align-items> / <justify-items> - The first value sets
align-items
, the second valuejustify-items
. If the second value is omitted, the first value is assigned to both properties.
All major browsers except Edge support the
place-items
shorthand property.
For more details, see align-items and justify-items.
justify-content
Sometimes the total size of your grid might be less than the size of its grid container. This could happen if all of your grid items are sized with non-flexible units like
px
. In this case you can set the alignment of the grid within the grid container. This property aligns the grid along the inline (row) axis (as opposed to align-content
which aligns the grid along the block (column) axis).
Values:
- start - aligns the grid to be flush with the start edge of the grid container
- end - aligns the grid to be flush with the end edge of the grid container
- center - aligns the grid in the center of the grid container
- stretch - resizes the grid items to allow the grid to fill the full width of the grid container
- space-around - places an even amount of space between each grid item, with half-sized spaces on the far ends
- space-between - places an even amount of space between each grid item, with no space at the far ends
- space-evenly - places an even amount of space between each grid item, including the far ends
Examples:
align-content
Sometimes the total size of your grid might be less than the size of its grid container. This could happen if all of your grid items are sized with non-flexible units like
px
. In this case you can set the alignment of the grid within the grid container. This property aligns the grid along the block (column) axis (as opposed to justify-content
which aligns the grid along the inline (row) axis).
Values:
- start - aligns the grid to be flush with the start edge of the grid container
- end - aligns the grid to be flush with the end edge of the grid container
- center - aligns the grid in the center of the grid container
- stretch - resizes the grid items to allow the grid to fill the full height of the grid container
- space-around - places an even amount of space between each grid item, with half-sized spaces on the far ends
- space-between - places an even amount of space between each grid item, with no space at the far ends
- space-evenly - places an even amount of space between each grid item, including the far ends
Examples:
place-content
place-content
sets both the align-content
and justify-content
properties in a single declaration.
Values:
- <align-content> / <justify-content> - The first value sets
align-content
, the second valuejustify-content
. If the second value is omitted, the first value is assigned to both properties.
All major browsers except Edge support the
place-content
shorthand property.
For more details, see align-content and justify-content.
grid-auto-columns
grid-auto-rows
Specifies the size of any auto-generated grid tracks (aka implicit grid tracks). Implicit tracks get created when there are more grid items than cells in the grid or when a grid item is placed outside of the explicit grid. (see The Difference Between Explicit and Implicit Grids)
Values:
- <track-size> - can be a length, a percentage, or a fraction of the free space in the grid (using the
fr
unit)
To illustrate how implicit grid tracks get created, think about this:
This creates a 2 x 2 grid.
But now imagine you use
grid-column
and grid-row
to position your grid items like this:
We told .item-b to start on column line 5 and end at column line 6, but we never defined a column line 5 or 6. Because we referenced lines that don't exist, implicit tracks with widths of 0 are created to fill in the gaps. We can use
grid-auto-columns
and grid-auto-rows
to specify the widths of these implicit tracks:grid-auto-flow
If you have grid items that you don't explicitly place on the grid, the auto-placement algorithm kicks in to automatically place the items. This property controls how the auto-placement algorithm works.
Values:
- row - tells the auto-placement algorithm to fill in each row in turn, adding new rows as necessary (default)
- column - tells the auto-placement algorithm to fill in each column in turn, adding new columns as necessary
- dense - tells the auto-placement algorithm to attempt to fill in holes earlier in the grid if smaller items come up later
Note that dense only changes the visual order of your items and might cause them to appear out of order, which is bad for accessibility.
Examples:
Consider this HTML:
You define a grid with five columns and two rows, and set
grid-auto-flow
to row
(which is also the default):
When placing the items on the grid, you only specify spots for two of them:
Because we set
grid-auto-flow
to row
, our grid will look like this. Notice how the three items we didn't place (item-b, item-c and item-d) flow across the available rows:
If we instead set
grid-auto-flow
to column
, item-b, item-c and item-d flow down the columns:grid
A shorthand for setting all of the following properties in a single declaration:
grid-template-rows
, grid-template-columns
, grid-template-areas
, grid-auto-rows
, grid-auto-columns
, and grid-auto-flow
(Note: You can only specify the explicit or the implicit grid properties in a single grid declaration).
Values:
- none - sets all sub-properties to their initial values.
- <grid-template> - works the same as the
grid-template
shorthand. - <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>? - sets
grid-template-rows
to the specified value. If theauto-flow
keyword is to the right of the slash, it setsgrid-auto-flow
tocolumn
. If thedense
keyword is specified additionally, the auto-placement algorithm uses a “dense” packing algorithm. Ifgrid-auto-columns
is omitted, it is set toauto
. - [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns> - sets
grid-template-columns
to the specified value. If theauto-flow
keyword is to the left of the slash, it setsgrid-auto-flow
torow
. If thedense
keyword is specified additionally, the auto-placement algorithm uses a “dense” packing algorithm. Ifgrid-auto-rows
is omitted, it is set toauto
.
Examples:
The following two code blocks are equivalent:
The following two code blocks are equivalent:
The following two code blocks are equivalent:
And the following two code blocks are equivalent:
It also accepts a more complex but quite handy syntax for setting everything at once. You specify
grid-template-areas
, grid-template-rows
and grid-template-columns
, and all the other sub-properties are set to their initial values. What you're doing is specifying the line names and track sizes inline with their respective grid areas. This is easiest to describe with an example:
That's equivalent to this:
Properties for the Children
(Grid Items)
Note:
float
, display: inline-block
, display: table-cell
, vertical-align
and column-*
properties have no effect on a grid item.
grid-column-start
grid-column-end
grid-row-start
grid-row-end
Determines a grid item's location within the grid by referring to specific grid lines.
grid-column-start
/grid-row-start
is the line where the item begins, and grid-column-end
/grid-row-end
is the line where the item ends.
Values:
- <line> - can be a number to refer to a numbered grid line, or a name to refer to a named grid line
- span <number> - the item will span across the provided number of grid tracks
- span <name> - the item will span across until it hits the next line with the provided name
- auto - indicates auto-placement, an automatic span, or a default span of one
Examples:
If no
grid-column-end
/grid-row-end
is declared, the item will span 1 track by default.
Items can overlap each other. You can use
z-index
to control their stacking order.
grid-column
grid-row
Values:
- <start-line> / <end-line> - each one accepts all the same values as the longhand version, including span
Example:
If no end line value is declared, the item will span 1 track by default.
grid-area
Gives an item a name so that it can be referenced by a template created with the
grid-template-areas
property. Alternatively, this property can be used as an even shorter shorthand for grid-row-start
+ grid-column-start
+ grid-row-end
+ grid-column-end
.
Values:
- <name> - a name of your choosing
- <row-start> / <column-start> / <row-end> / <column-end> - can be numbers or named lines
Examples:
As a way to assign a name to the item:
justify-self
Aligns a grid item inside a cell along the inline (row) axis (as opposed to
align-self
which aligns along the block (column)axis). This value applies to a grid item inside a single cell.
Values:
- start - aligns the grid item to be flush with the start edge of the cell
- end - aligns the grid item to be flush with the end edge of the cell
- center - aligns the grid item in the center of the cell
- stretch - fills the whole width of the cell (this is the default)
Examples:
To set alignment for all the items in a grid, this behavior can also be set on the grid container via the
justify-items
property.align-self
Aligns a grid item inside a cell along the block (column) axis (as opposed to
justify-self
which aligns along the inline (row)axis). This value applies to the content inside a single grid item.
Values:
- start - aligns the grid item to be flush with the start edge of the cell
- end - aligns the grid item to be flush with the end edge of the cell
- center - aligns the grid item in the center of the cell
- stretch - fills the whole height of the cell (this is the default)
Examples:
To align all the items in a grid, this behavior can also be set on the grid container via the
align-items
property.place-self
place-self
sets both the align-self
and justify-self
properties in a single declaration.
Values:
- auto - The “default” alignment for the layout mode.
- <align-self> / <justify-self> - The first value sets
align-self
, the second valuejustify-self
. If the second value is omitted, the first value is assigned to both properties.
Examples:
All major browsers except Edge support the
place-self
shorthand property.