Status: ED ED: http://dev.w3.org/csswg/css-grid/ TR: http://www.w3.org/TR/css3-grid-layout/ Previous version: http://www.w3.org/TR/2013/WD-css3-grid-layout-20130402/ Previous version: http://www.w3.org/TR/2012/WD-css3-grid-layout-20121106/ Shortname: css-grid Level: 1 Editor: Tab Atkins Jr., Google, http://www.xanthir.com/contact/ Editor: fantasai, Mozilla, http://fantasai.inkedblade.net/contact Editor: Rossen Atanassov, Microsoft, ratan@microsoft.com Previous editors: Alex Mogilevsky, Microsoft Corporation Previous editors: Phil Cupp, Microsoft Corporation Issues list: In Bugzilla Abstract: This CSS module defines a two-dimensional grid-based layout system, optimized for user interface design. In the grid layout model, the children of a grid container can be positioned into arbitrary slots in a flexible or fixed predefined layout grid. Ignored Terms: column-*, justify-*, containing block,, indefinite, block-start, block-end, inline-start, inline-end, end, max-content, grid-field, auto Link Defaults: css21 (property) margin
Grid layout contains features targeted at web application authors. The grid can be used to achieve many different layouts. It excels at dividing up space for major regions of an application, or defining the relationship in terms of size, position, and layer between parts of a control built from HTML primitives.
Like tables, grid layout enables an author to align elements into columns and rows, but unlike tables, grid layout doesn't have content structure, and thus enables a wide variety of layouts not possible with tables. For example, the children of a grid container can position themselves such that they overlap and layer similar to positioned elements.
In addition, the absence of content structure in grid layout helps to manage changes to layout by using fluid and source order independent layout techniques. By combining media queries with the CSS properties that control layout of the grid container and its children, authors can adapt their layout to changes in device form factors, orientation, and available space, without needing to alter the semantic nature of their content.
Application layout example requiring horizontal and vertical alignment.
As websites evolved from simple documents into complex, interactive applications, tools for document layout, e.g. floats, were not necessarily well suited for application layout. By using a combination of tables, JavaScript, or careful measurements on floated elements, authors discovered workarounds to achieve desired layouts. Layouts that adapted to the available space were often brittle and resulted in counter-intuitive behavior as space became constrained. As an alternative, authors of many web applications opted for a fixed layout that cannot take advantage of changes in the available rendering space on a screen.
The capabilities of grid layout address these problems. It provides a mechanism for authors to divide available space for layout into columns and rows using a set of predictable sizing behaviors. Authors can then precisely position and size the building block elements of their application by into grid areas defined by these columns and rows. Figure 1 illustrates a basic layout which can be achieved with grid layout.
Five grid items arranged according to content size and available space.
Growth in the grid due to an increase in available space.
Grid layout can be used to intelligently reflow elements within a webpage. Figure 2 represents a game with five major areas in the layout: the game title, stats area, game board, score area, and control area. The author's intent is to divide the space for the game such that:
As an alternative to using script to control the absolute position, width, and height of all elements, the author can use grid layout, as shown in Figure 3. The following example shows how an author might achieve all the sizing, placement, and alignment rules declaratively.
Note that there are multiple ways to specify the structure of the grid and to position and size grid items, each optimized for different scenarios. This example illustrates one that an author may use to define the position and space for each grid item using the 'grid-template-rows' and 'grid-template-columns' properties on the grid container, and the 'grid-row' and 'grid-column' properties on each grid item.
<style type="text/css">
#grid {
display: grid;
/* Two columns: the first sized to content, the second receives
* the remaining space, but is never smaller than the minimum
* size of the board or the game controls, which occupy this
* column. */
grid-template-columns: auto minmax(min-content, 1fr);
/* Three rows: the first and last sized to content, the middle
* row receives the remaining space, but is never smaller than
* the minimum height of the board or stats areas. */
grid-template-rows: auto minmax(min-content, 1fr) auto
}
/* Each part of the game is positioned between grid lines by
* referencing the starting grid line and then specifying, if more
* than one, the number of rows or columns spanned to determine
* the ending grid line, which establishes bounds for the part. */
#title { grid-column: 1; grid-row: 1 }
#score { grid-column: 1; grid-row: 3 }
#stats { grid-column: 1; grid-row: 2; justify-self: start }
#board { grid-column: 2; grid-row: 1 / span 2; }
#controls { grid-column: 2; grid-row: 3; align-self: center }
</style>
<div id="grid">
<div id="title">Game Title</div>
<div id="score">Score</div>
<div id="stats">Stats</div>
<div id="board">Board</div>
<div id="controls">Controls</div>
</div>
An arrangement suitable for ''portrait'' orientation.
An arrangement suitable for ''landscape'' orientation.
Continuing the prior example, the author also wants the game to adapt to the space available on traditional computer monitors, handheld devices, or tablet computers. Also, the game should optimize the placement of the components when viewed either in landscape or portrait orientation (Figures 4 and 5). By combining grid layout with media queries, the author is able to use the same semantic markup, but rearrange the layout of elements independent of their source order, to achieve the desired layout in both orientations.
The following example leverages grid layout’s ability to name the space which will be occupied by a grid item. This allows the author to avoid rewriting rules for grid items as the grid’s definition changes.
<style type="text/css">
@media (orientation: portrait) {
#grid {
display: grid;
/* The rows, columns and areas of the grid are defined visually
* using the grid-template-areas property. Each string is a row, and
* each word an area. The number of words in a string
* determines the number of columns. Note the number of words
* in each string must be identical. */
grid-template-areas: "title stats"
"score stats"
"board board"
"ctrls ctrls";
/* Columns and rows created with the template property can be
* assigned a sizing function with the grid-template-columns
* and grid-template-rows properties. */
grid-template-columns: auto minmax(min-content, 1fr);
grid-template-rows: auto auto minmax(min-content, 1fr) auto
}
}
@media (orientation: landscape) {
#grid {
display: grid;
/* Again the template property defines areas of the same name,
* but this time positioned differently to better suit a
* landscape orientation. */
grid-template-areas: "title board"
"stats board"
"score ctrls";
grid-template-columns: auto minmax(min-content, 1fr);
grid-template-rows: auto minmax(min-content, 1fr) auto
}
}
/* The grid-area property places a grid item into a named
* region (area) of the grid. */
#title { grid-area: title }
#score { grid-area: score }
#stats { grid-area: stats }
#board { grid-area: board }
#controls { grid-area: ctrls }
</style>
<div id="grid">
<div id="title">Game Title</div>
<div id="score">Score</div>
<div id="stats">Stats</div>
<div id="board">Board</div>
<div id="controls">Controls</div>
</div>
A control composed of layered HTML elements.
In the example shown in Figure 6, the author is creating a custom slider control. The control has six parts. The lower and upper labels align to the left and right edges of the control. The track of the slider spans the area between the labels. The lower and upper fill parts touch beneath the thumb, and the thumb is a fixed width and height that can be moved along the track by updating the two flex-sized columns.
Prior to the introduction of grid layout, the author would have likely used absolute positioning to control the top and left coordinates, along with the width and height of each HTML element that comprises the control. By leveraging grid layout, the author can instead limit script usage to handling mouse events on the thumb, which snaps to various positions along the track as the 'grid-template-columns' property of the grid container is updated.
<style type="text/css">
#grid {
display: grid;
/* The grid-template-columns and rows properties also support
* naming grid lines which can then be used to position grid
* items. The line names are assigned on either side of a column
* or row sizing function where the line would logically exist. */
grid-template-columns:
(start) auto
(track-start) 0.5fr
(thumb-start) auto
(fill-split) auto
(thumb-end) 0.5fr
(track-end) auto
(end);
}
/* The grid-placement properties accept named lines. Below the
* lines are referred to by name. Beyond any
* semantic advantage, the names also allow the author to avoid
* renumbering the grid-column-start and grid-row-start properties of the
* grid items. This is similar to the concept demonstrated in the
* prior example with the grid-template-areas property during orientation
* changes, but grid lines can also work with layered grid items
* that have overlapping areas of different shapes like the thumb
* and track parts in this example. */
#lower-label { grid-column-start: start }
#track { grid-column: track-start / track-end; align-self: center }
#upper-label { grid-column-end: end; }
/* Fill parts are drawn above the track so set z-index to 5. */
#lower-fill { grid-column: track-start / fill-split;
align-self: end;
z-index: 5 }
#upper-fill { grid-column: fill-split / track-end;
align-self: start;
z-index: 5 }
/* Thumb is the topmost part; assign it the highest z-index value. */
#thumb { grid-column: thumb-start / thumb-end; z-index: 10 }
</style>
<div id="grid">
<div id="lower-label">Lower Label</div>
<div id="upper-label">Upper Label</div>
<div id="track">Track</div>
<div id="lower-fill">Lower Fill</div>
<div id="upper-fill">Upper Fill</div>
<div id="thumb">Thumb</div>
</div>
In grid layout, the content of a grid container is laid out by positioning and aligning it into a grid. The grid is an intersecting set of horizontal and vertical grid lines that divides the grid container’s space into grid areas, into which grid items (representing the grid container’s content) can be placed. There are two sets of grid lines: one set defining columns that run along the block axis (the column axis, and an orthogonal set defining rows along the inline axis (the row axis). [[!CSS3-WRITING-MODES]]
Grid lines: Three in the block axis and four in the inline axis.
Grid track is a generic term for a grid column or grid row—in other words, it is the space between two adjacent grid lines. Each grid track is assigned a sizing function, which controls how wide or tall the column or row may grow, and thus how far apart its bounding grid lines are.
A grid cell is the similar term for the full grid—it is the space between two adjacent row and two adjacent column grid lines. It is the smallest unit of the grid that can be referenced when positioning grid items.
In the following example there are two columns and three rows. The first column is fixed at 150px. The second column uses flexible sizing, which is a function of the unassigned space in the Grid, and thus will vary as the width of the grid container changes. If the used width of the grid container is 200px, then the second column 50px wide. If the used width of the grid container is 100px, then the second column is 0px and any content positioned in the column will overflow the grid container.
<style type="text/css">
#grid {
display: grid;
grid-template-columns: 150px 1fr; /* two columns */
grid-template-rows: 50px 1fr 50px /* three rows */
}
</style>
Grid lines are the horizontal and vertical dividing lines of the grid. A grid line exists on either side of a column or row. They can be referred to by numerical index, or by an author-specified name. A grid item references the grid lines to determine its position within the grid using the grid-placement properties.
The following two examples create three column grid lines and four row grid lines. The first example demonstrates how an author would position a grid item using grid line numbers. The second example uses explicitly named grid lines.
<style type="text/css">
#grid {
display: grid;
grid-template-columns: 150px 1fr;
grid-template-rows: 50px 1fr 50px
}
#item1 { grid-column: 2;
grid-column-start: 1; grid-column-end: 1; }
</style>
<style type="text/css">
/* equivalent layout to the prior example, but using named lines */
#grid {
display: grid;
grid-template-columns: 150px (item1-start) 1fr (item1-end);
grid-template-rows: (item1-start) 50px 1fr 50px (item1-end);
}
#item1 {
grid-column: item1-start / item1-end;
grid-row: item1-start / item1-end
}
</style>
A grid area is the logical space used to lay out one or more grid items. It is bound by four grid lines, one on each side of the grid area, and participates in the sizing of the grid tracks it intersects. A grid area can be named explicitly using the 'grid-template-areas' property of the grid container, or referenced implicitly by its bounding grid lines. A grid item is assigned to a grid area using the grid-placement properties.
<style type="text/css">
/* using the template syntax */
#grid {
display: grid;
grid-template-areas: ". a"
"b a"
". a";
grid-template-columns: 150px 1fr;
grid-template-rows: 50px 1fr 50px
}
#item1 { grid-area: a }
#item2 { grid-area: b }
#item3 { grid-area: b }
/* Align items 2 and 3 at different points in the Grid Area "b". */
/* By default, Grid Items are stretched to fit their Grid Area */
/* and these items would layer one over the other. */
#item2 { align-self: head }
#item3 { justify-self: end; align-self: foot }
</style>
A grid item’s grid area forms the containing block into which it is laid out. Percentage lengths specified on a grid item resolve against this containing block. Percentages specified for 'margin-top', 'padding-top', 'margin-bottom', and 'padding-bottom' on a grid item resolve against the height of its containing block, rather than the width (as for blocks).
Grid items placed into the same grid area do not directly affect each other's layout. Indirectly, a grid item can affect the position of a grid line in a column or row that uses a contents-based relative size, which in turn can affect the position or size of another grid item.
Name: display New Values: grid | inline-grid
A grid container establishes a new grid formatting context for its contents. This is the same as establishing a block formatting context, except that grid layout is used instead of block layout: floats do not intrude into the grid container, and the grid container's margins do not collapse with the margins of its contents. Grid containers form a containing block for their contents exactly like block containers do. [[!CSS21]] The 'overflow' property applies to grid containers.
Grid containers are not block containers, and so some properties that were designed with the assumption of block layout don't apply in the context of grid layout. In particular:
If an element's specified 'display' is ''inline-grid'' and the element is floated or absolutely positioned, the computed value of 'display' is grid. The table in CSS 2.1 Chapter 9.7 is thus amended to contain an additional row, with ''inline-grid'' in the "Specified Value" column and grid in the "Computed Value" column.
The contents of a grid container consists of zero or more grid items: each child of a grid container becomes a grid item, and each contiguous run of text that is directly contained inside a grid container is wrapped in an anonymous grid item. However, an anonymous grid item that contains only white space is not rendered, as if it were ''display:none''.
A grid item establishes a new formatting context for its contents. The type of this formatting context is determined by its 'display' value, as usual. The computed 'display' of a grid item is determined by applying the table in CSS 2.1 Chapter 9.7. However, grid items are grid-level boxes, not block-level boxes: they participate in their container's grid formatting context, not in a block formatting context.
Examples of grid items:
<div style="display:grid"> <!-- grid item: block child --> <div id="item1">block</div> <!-- grid item: floated element; floating is ignored --> <div id="item2" style="float: left;">float</div> <!-- grid item: anonymous block box around inline content --> anonymous item 3 <!-- grid item: inline child --> <span> item 4 <!-- grid items do not split around blocks --> <div id=not-an-item>item 4</div> item 4 </span> </div>
Some values of 'display' trigger the generation of anonymous boxes. For example, a misparented ''table-cell'' child is fixed up by generating anonymous ''table'' and ''table-row'' elements around it. [[!CSS21]] This fixup must occur before a grid container’s children are promoted to grid items. For example, given two contiguous child elements with ''display:table-cell'', an anonymous table wrapper box around them becomes the grid item.
Future display types may generate anonymous containers (e.g. ruby) or otherwise mangle the box tree (e.g. run-ins). It is intended that grid item determination run after these operations.
An absolutely-positioned child element of a grid container does not participate directly in grid layout. Its static position is ???
The static position is affected by the alignment properties, as if it was a 0x0 thing floating around in the containing block. (Defaults to the start/start corner, since ''stretch'' can't do anything to it.)
If an absolutely positioned element's containing block is generated by a grid container, the grid-placement properties can be used to constrain it to a particular grid area, similar to how they affect regular grid items. In this case, an auto value for a grid-placement property indicates the corresponding padding edge of the grid container.
Absolute positioning can allow an element to “skip past” intervening grid containers, and resolve its grid-placement properties against a grid container other than its closest ancestor. However, as in other forms of CSS layout, elements that are absolutely-positioned to a grid container do not take up space or otherwise participate in the layout of the grid.
We want the ability to collapse grid tracks (similar to collapsing flex items or table rows/columns), but we're not sure exactly how to do it. Ideas welcome, please post them to the list.
The 'order' property also applies to grid items. It affects their auto-placement and painting order.
The three properties 'grid-template-rows', 'grid-template-columns', and 'grid-template-areas' together define the explicit grid of a grid container. The 'grid-template' property is a shorthand that sets all three at the same time. The final grid may end up larger due to grid items placed outside the explicit grid; in this case, any implicit tracks are sized by the 'grid-auto-rows' and 'grid-auto-columns' properties.
The size of the explicit grid is determined by the larger of the number of rows/columns defined by 'grid-template-areas' and the number of rows/columns sized by 'grid-template-rows'/'grid-template-columns'. Any rows/columns defined by 'grid-template-areas' but not sized by 'grid-template-rows'/'grid-template-columns' take their size from the 'grid-auto-rows'/'grid-auto-columns' properties.
Numeric indexes in the grid-placement properties count from the edges of the explicit grid, starting from 1. Positive indexes count from the before/start side, while negative indexes count from the after/end side.
Name: grid-template-columns, grid-template-rows Value: none | <> | subgrid < >* Initial: none Applies to: grid containers Inherited: no Percentages: n/a Media: visual Computed value: As specified, except for auto (see prose)
These properties specify, as a space-separated track list, the line names and track sizing functions of the grid. Each sizing function can be specified as a length, a percentage of the grid container’s size, a measurement of the contents occupying the column or row, or a fraction of the free space in the grid. It can also be specified as a range using the ''minmax()'' notation, which can combine any of the previously mentioned mechanisms to define a min and max size for the column or row.
The 'grid-template-columns' property specifies the track list for the grid's columns, while 'grid-template-rows' specifies the track list for the grid's rows. The syntax of a track list is:
<track-list> = [ <>? [ < > | < > ] ]+ < >? <track-size> = minmax( < > , < > ) | auto | < > <track-breadth> = < > | < > | < > | min-content | max-content <line-names> = ( < >* )
Where:
The none value indicates that there is no explicit grid; any rows/columns will be implicitly generated, and their size will be determined by the 'grid-auto-rows' and 'grid-auto-columns' properties.
The subgrid value indicates that the grid will align to its parent grid in that axis. Rather than specifying the sizes of rows/columns explicitly, they'll be taken from the parent grid's definition. If the grid container is not a grid item, this value computes to none. See the Subgrids section for more detail.
Given the following 'grid-template-columns' declaration:
grid-template-columns: 100px 1fr max-content minmax(min-content, 1fr);
Five grid lines are created:
If the non-flexible sizes
(''100px'', ''max-content'', and ''min-content'')
sum to larger than the grid container’s width,
the final grid line will be a distance equal to their sum away from the start edge of the grid container
(the ''1fr'' sizes both resolve to ''0'').
If the sum is less than the grid container’s width,
the final grid line will be exactly at the end edge of the grid container.
This is true in general whenever there's at least one <
Additional examples of valid grid track definitions:
/* examples of valid track definitions */ grid-template-rows: 1fr minmax(min-content, 1fr); grid-template-rows: 10px repeat(2, 1fr auto minmax(30%, 1fr)); grid-template-rows: calc(4em - 5px)
While grid lines can always be referred to by their numerical index, named lines can make the grid-placement properties easier to understand and maintain. Lines can be explicitly named in the 'grid-template-rows' and 'grid-template-columns' properties, or implicitly named by creating named grid areas with the 'grid-template-areas' property.
For example, the following code gives meaningful names to all of the lines in the grid. Note that some of the lines have multiple names.
<style>
#grid {
display: grid;
grid-template-columns: (first nav) 150px (main) 1fr (last);
grid-template-rows: (first header) 50px (main) 1fr (footer) 50px (last);
}
</style>
Named Grid Lines.
The ''repeat()'' notation represents a repeated fragment of the track list. This is just a syntactic shorthand that allows writing a large number of columns or rows that exhibit a recurring pattern in a more compact form. The syntax of the ''repeat()'' notation is:
repeat() = repeat( <> , [ < >? < > ]+ < >? )
The first argument specifies the number of repetitions. The second argument is a track list, which is repeated that number of times. The ''repeat()'' notation cannot be nested; doing so makes the declaration invalid.
This example shows two equivalent ways of writing the same grid definition. Both ways produce a grid with a single row and four "main" columns, each 250px wide, surrounded by 10px "gutter" columns.
<style>
#grid {
display: grid;
grid-template-columns: 10px (col-start) 250px (col-end)
10px (col-start) 250px (col-end)
10px (col-start) 250px (col-end)
10px (col-start) 250px (col-end) 10px;
grid-template-rows: 1fr;
}
/* Equivalent definition. */
#grid {
display: grid;
grid-template-columns: repeat(4, 10px (col-start) 250px (col-end)) 10px;
grid-template-rows: 1fr;
}
</style>
A flexible length or <
The distribution of free space occurs after all non-flexible sizing functions have reached their maximum. The total size of such rows or columns is subtracted from the available space, yielding the free space, which is then divided among the flex-sized rows and columns in proportion to their flex factor.
Flexible lengths in a track list work similarly to flexible lengths with a zero base size in [[CSS3-FLEXBOX]].
Each column or row's share of the free space can be computed as the column or row's
<flex> * <free space> / <sum of all flex factors>.
For the purpose of this calculation,
a flexible length in the min position of a ''minmax()'' function is treated as ''0'' (an inflexible length).
When the available space is infinite (which happens when the grid container’s width or height is indefinite), flex-sized grid tracks are sized to their contents while retaining their respective proportions. The used size of each flex-sized grid track is computed by determining the 'max-content' size of each flex-sized grid track and dividing that size by the respective flex factor to determine a hypothetical 1fr size. The maximum of those is used as the ''1fr'' length, which is then multiplied by each grid track’s flex factor to determine its final size.
A grid item can itself be a grid container by giving it ''display: grid''; in this case the layout of its contents will be independent of the layout of the grid it participates in.
In some cases it might be necessary for the contents of multiple grid items to align to each other. A grid container that is itself a grid item can defer the definition of its rows or columns to its parent grid container by using the subgrid keyword in 'grid-template-rows' and/or 'grid-template-columns', making it a subgrid in that dimension. In this case, the grid items of the subgrid participate in sizing the grid of the parent grid container, allowing the contents of both grids to align.
A subgrid behaves just like a normal grid container except that:
For example, suppose we have a form consisting of a list of inputs with labels:
<ul> <li><label>Name:</label> <input name=fn> <li><label>Address:</label> <input name=address> <li><label>Phone:</label> <input name=phone> </ul>
We want the labels and inputs to align, and we want to style each list item with a border. This can be accomplished with subgrid layout:
ul {
display: grid;
grid-auto-flow: rows;
grid-template-columns: auto 1fr;
}
li {
display: subgrid;
margin: 0.5em;
border: solid;
padding: 0.5em;
}
label {
grid-column: 1;
}
input {
grid-column: 2;
}
Do we want to allow ''repeat()'' when specifying named lines for subgrids?
The resolved value of the 'grid-template-rows' and 'grid-template-columns' properties is the used value, serialized as follows:
<style>
#grid {
width: 500px;
grid-template-columns:
(a) auto
(b) minmax(min-content, 1fr)
(b c d) repeat(2, (e) 40px)
repeat(5, auto);
}
</style>
<div id="grid">
<div style="grid-column-start:1; width:50px"></div>
<div style="grid-column-start:9; width:50px"></div>
</div>
<script>
var gridElement = document.getElementById("grid");
getComputedStyle(gridElement).gridDefinitionColumns;
// (a) 50px (b) 320px (b c d) repeat(2, (e) 40px) repeat(4, 0px) 50px
</script>
In general, resolved values are the computed values, except for a small list of legacy 2.1 properties. Do we really want these properties to return the used value here? Bug about this.
Name: grid-template-areas Value: none | <>+ Initial: none Applies to: grid containers Inherited: no Percentages: n/a Media: visual Computed value: specified value
This property specifies named grid areas, which are not associated with any particular grid item, but can be referenced from the grid-placement properties. The syntax of the 'grid-template-areas' property also provides a visualization of the structure of the grid, making the overall layout of the grid container easier to understand.
Values have the following meanings:
All strings must have the same number of columns, or else the declaration is invalid. If a named grid area spans multiple grid cells, but those cells do not form a single filled-in rectangle, the declaration is invalid. If a string's contents, when parsed as CSS, contain anything other than whitespace, identifiers, or periods, the declaration is invalid.
Non-rectangular or disconnected regions may be permitted in a future version of this module.
In this example, the 'grid-template-areas' property is used to create a page layout
where areas are defined for header content (head),
navigational content (nav),
footer content (foot),
and main content (main).
Accordingly, the template creates three rows and two columns,
with four named grid areas.
The head area spans both columns and the first row of the grid.
<style type="text/css">
#grid {
display: grid;
grid-template-areas: "head head"
"nav main"
"foot . "
}
#grid > header { grid-area: head; }
#grid > nav { grid-area: nav; }
#grid > main { grid-area: main; }
#grid > footer { grid-area: foot; }
</style>
The 'grid-template-areas' property creates implicit named lines from the named grid areas in the template. For each named grid area foo, four implicit named lines are created: two named ''foo-start'', naming the row-start and column-start lines of the named grid area, and two named ''foo-end'', naming the row-end and column-end lines of the named grid area.
These named lines behave just like any other named line, except that they do not appear in the value of 'grid-template-rows'/'grid-template-columns'. Even if an explicit line of the same name is defined, the implicit named lines are just more lines with the same name.
Name: grid-template Value: none | <<'grid-template-columns'>> / <<'grid-template-rows'>> |
[ <> / ]? [ < >? < > [ < > < > ]? ]+ Initial: see individual properties Applies to: grid containers Inherited: see individual properties Percentages: see individual properties Media: visual Computed value: see individual properties
The 'grid-template' property is a shorthand for setting 'grid-template-columns', 'grid-template-rows', and 'grid-template-areas' in a single declaration. It has three distinct syntax forms:
grid-template: auto 1fr auto / auto 1fr;
is equivalent to
grid-template-columns: auto 1fr auto; grid-template-rows: auto 1fr; grid-template-areas: none;
This syntax allows the author to align track names and sizes inline with their respective grid areas.
grid-template: auto 1fr auto /
(header-top) "a a a" (header-bottom)
(main-top) "b b b" 1fr (main-bottom);
is equivalent to
grid-template-columns: auto 1fr auto;
grid-template-rows: (header-top) auto (header-bottom main-top) 1fr (main-bottom);
grid-template-areas: "a a a"
"b b b";
While 'grid-template' and its longhand properties define the explicit grid, grid items can be positioned outside of these bounds. This causes the grid container to generate implicit grid tracks, forming the implicit grid. The 'grid-auto-rows' and 'grid-auto-columns' properties size these implicit grid tracks.
The 'grid-auto-flow' property controls auto-placement of grid items without an explicit position. Once the explicit grid is filled (or if there is no explicit grid) auto-placement will also cause the generation of implicit grid tracks. The 'grid-auto' shorthand can be used to set 'grid-auto-flow', 'grid-auto-rows', and 'grid-auto-columns' together.
Name: grid-auto-columns, grid-auto-rows Value: <> Initial: auto Applies to: grid containers Inherited: no Percentages: see Track Sizing Media: visual Computed value: see Track Sizing
If a grid item is positioned into a row or column that is not explicitly sized by 'grid-template-rows' or 'grid-template-columns', implicit grid tracks are created to hold it. This can happen either by explicitly positioning into a row or column that is out of range, or by the auto-placement algorithm creating additional rows or columns. The 'grid-auto-columns' and 'grid-auto-rows' properties specify the size of such implicitly-created tracks.
This example illustrates the sizing of implicit grid tracks. Note that grid item B is positioned on grid line 5, which automatically creates four implicit grid columns. However, only two of them (the first and the last) are occupied by any grid items, so the two empty grid tracks collapse to zero width.
A Grid with an implicit row and four implicit columns, two of which are zero-sized.
<style type="text/css">
#grid {
display: grid;
grid-template-columns: 20px;
grid-template-rows: 20px }
#A { grid-column: 1; grid-row: 1; }
#B { grid-column: 5; grid-row: 1 / span 2; }
#C { grid-column: 1 / span 2; grid-row: 2; }
</style>
<div id="grid">
<div id="A">A</div>
<div id="B">B</div>
<div id="C">C</div>
</div>
Name: grid-auto-flow Value: [ rows | columns ] && dense? Initial: rows Applies to: grid containers Inherited: no Percentages: n/a Media: visual Computed value: specified value
Grid items that aren't explicitly placed are are automatically placed into an unoccupied space in the grid container. The 'grid-auto-flow' property controls the direction in which the search for unoccupied space takes place, and whether rows or columns are added as needed to accommodate the content.
Add a value for stacking items on top of each other?
Add a value for flowing items together into a single slot?
Auto-placement takes grid items in 'order'-modified document order.
In the following example, there are three columns, each auto-sized to their contents. No rows are explicitly defined. The 'grid-auto-flow' property is rows which instructs the grid to search across its three columns starting with the first row, then the next, adding rows as needed until sufficient space is located to accommodate the position of any auto-placed grid item.
A form arranged using automatic placement.
<style type="text/css">
form {
display: grid;
/* Define three columns, all content-sized,
and name the corresponding lines. */
grid-template-columns: (labels) auto (controls) auto (oversized) auto;
grid-auto-flow: rows;
}
form > label {
/* Place all labels in the "labels" column and
automatically find the next available row. */
grid-column: labels;
grid-row: auto;
}
form > input, form > select {
/* Place all controls in the "controls" column and
automatically find the next available row. */
grid-column: controls;
grid-row: auto;
}
#department {
/* Auto place this item in the "oversized" column
in the first row where an area that spans three rows
won't overlap other explicitly placed items or areas
or any items automatically placed prior to this area. */
grid-column: oversized;
grid-row: span 3;
}
/* Place all the buttons of the form
in the explicitly defined grid area. */
#buttons {
grid-row: auto;
/* Ensure the button area spans the entire grid element
in the row axis. */
grid-column: 1 / -1;
text-align: end;
}
</style>
<form>
<label for="firstname">First name:</label>
<input type="text" id="firstname" name="firstname" />
<label for="lastname">Last name:</label>
<input type="text" id="lastname" name="lastname" />
<label for="address">Address:</label>
<input type="text" id="address" name="address" />
<label for="address2">Address 2:</label>
<input type="text" id="address2" name="address2" />
<label for="city">City:</label>
<input type="text" id="city" name="city" />
<label for="state">State:</label>
<select type="text" id="state" name="state">
<option value="WA">Washington</option>
</select>
<label for="zip">Zip:</label>
<input type="text" id="zip" name="zip" />
<div id="department">
<label for="department">Department:</label>
<select id="department" name="department" multiple>
<option value="finance">Finance</option>
<option value="humanresources">Human Resources</option>
<option value="marketing">Marketing</option>
</select>
</div>
<div id="buttons">
<button id="cancel">Cancel</button>
<button id="back">Back</button>
<button id="next">Next</button>
</div>
</form>
The following summarizes the auto-placement algorithm for Grid items:
Edit the algorithm to allow for dense packing.
Name: grid-auto Value: <<'grid-auto-flow'>> || [ <<'grid-auto-columns'>> [ / <<'grid-auto-rows'>> ]? ] Initial: see individual properties Applies to: grid containers Inherited: see individual properties Percentages: see individual properties Media: visual Computed value: see individual properties
The 'grid-auto' property is a shorthand that sets all three of 'grid-auto-rows', 'grid-auto-columns', and 'grid-auto-flow' in a single declaration. If <<'grid-auto-rows'>> value is omitted, it is set to the value specified for 'grid-auto-columns'. Other omitted values are set to their initial values.
For example, ''grid-auto: 1fr;'' is equivalent to
grid-auto-columns: 1fr; grid-auto-rows: 1fr; grid-auto-flow: rows;
Similarly, ''grid-auto: columns 1fr / auto'' is equivalent to
grid-auto-columns: 1fr; grid-auto-rows: auto; grid-auto-flow: columns;
Put in "common uses" section, like 'flex' has, to describe what you would use 'grid-area' for, etc.
Name: grid-row-start, grid-column-start, grid-row-end, grid-column-end Value: <> Initial: auto Applies to: grid items Inherited: no Percentages: n/a Media: visual Computed value: specified value (almost)
<> = auto | <> | [ < > && < >? ] | [ span && [ < > || < > ] ]
The 'grid-row-start', 'grid-column-start', 'grid-row-end', and 'grid-column-end' properties (collectively, the grid-placement properties) determine a grid item’s placement by specifying, respectively, the block-start, inline-start, block-end, and inline-end grid lines of a grid item’s grid area.
A grid item’s placement consists of both a grid position (which can be either definite or automatic) and a grid span (which also can be either definite or automatic). The grid position indicates the item’s location in the grid. The grid span indicates how many grid tracks the grid item occupies. An automatic grid position triggers auto-placement. An automatic grid span causes a subgrid to take its grid span from the size of its implicit grid. (See Subgrids, above.)
Each grid-placement property contributes a line, a span, or nothing (automatic) to the item's row placement or column placement. Values have the following meanings:
Otherwise, if there is a named line with the specified name, contributes a line to the grid item’s placement by specifying the first line of that name.
Otherwise, the property contributes nothing (just as if auto were specified).
If a name is given as an <
If the <
If a name is given as an <
If the <
If 'grid-row-end'/'grid-column-end' specifies a line at or before that specified by 'grid-row-start'/'grid-column-start', it instead contributes nothing.
In each dimension (row or column), if the corresponding pair of properties contributed:
Given a single-row, 8-column grid and the following 9 named lines:
1 2 3 4 5 6 7 8 9 +--+--+--+--+--+--+--+--+ | | | | | | | | | A B C A B C A B C | | | | | | | | | +--+--+--+--+--+--+--+--+
The following declarations place the grid item between the lines indicated by index:
grid-column-start: 4; grid-column-end: auto; /* Line 4 to line 5 */ grid-column-start: auto; grid-column-end: 6; /* Line 5 to line 6 */ grid-column-start: 'C'; grid-column-end: 'C'; /* Line 3 to line 9 */ grid-column-start: 'C'; grid-column-end: span 'C'; /* Line 3 to line 6 */ grid-column-start: span 'C'; grid-column-end: 'C'; /* Line 6 to line 9 */ grid-column-start: span 'C'; grid-column-end: span 'C'; /* Error: both properties compute to auto */ grid-column-start: 5; grid-column-end: 'C'; /* Line 5 to line 9 */ grid-column-start: 5; grid-column-end: span 'C'; /* Line 5 to line 6 */ grid-column-start: 8; grid-column-end: 8; /* Error: line 8 to line 9 */ grid-column-start: 'B' 2; grid-column-end: span 1; /* Line 5 to line 6 */
Name: grid-column, grid-row Value: <> [ / < > ]? Initial: see individual properties Applies to: grid items Inherited: see individual properties Percentages: see individual properties Media: visual Computed value: see individual properties
The 'grid-row' and 'grid-column' properties are shorthands for 'grid-row-start'/'grid-row-end' and 'grid-column-start'/'grid-column-end', respectively.
If two <
When the second value is omitted,
if the first value is an <
If four <
When 'grid-column-end' is omitted,
if 'grid-column-start' is an <
When 'grid-row-end' is omitted,
if 'grid-row-start' is an <
When 'grid-column-start' is omitted,
if 'grid-row-start' is an <
The resolution order for this shorthand is row-start/column-start/row-end/column-end,
which goes CCW for LTR pages,
the opposite direction of the related 4-edge properties using physical directions, like 'margin'.
Should 'grid-area' be 'grid-field'?
After a grid container’s grid tracks have been sized,
and the dimensions of all grid items are finalized,
grid items can be aligned within their grid areas.
The 'margin' properties can be used to align items in a manner similar to,
but more powerful than,
what margins can do in block layout.
Grid items also respect the alignment properties from the Box Alignment spec,
which allow easy keyword-based alignment of items in both the row axis and column axis.
By default,
grid items stretch to fill their grid area.
However, if 'justify-self' or 'align-self' compute to a value other than ''stretch''
or margins are auto,
grid items will auto-size to fit their contents.
This section is non-normative.
The normative definition of how margins affect grid items is in the Grid Layout Algorithm section.
Auto margins on grid items have an effect very similar to auto margins in block flow:
Note that, if free space is distributed to auto margins,
the alignment properties will have no effect in that dimension
because the margins will have stolen all the free space
left over after sizing.
Grid items can be aligned in the inline dimension
by using the 'justify-self' property on the grid item
or 'justify-items' property on the grid container,
as defined in [[!CSS3-ALIGN]].
Grid items can also be aligned in the block dimension
(perpendicular to the inline dimension)
by using the 'align-self' property on the grid item
or 'align-items' property on the grid container,
as defined in [[!CSS3-ALIGN]].
Grid items can overlap when they are positioned into intersecting grid areas.
Grid item boxes in non-intersecting areas can also overlap because of negative margins or positioning.
When grid items overlap,
the 'z-index' property provides control over the drawing order of grid items.
Grid items paint exactly the same as flex items [[!CSS3-FLEXBOX]]:
they use 'order'-modified document order,
and 'z-index' values other than auto create a stacking context even if 'position' is ''static''.
Note: Descendants that are positioned outside a grid item still participate in any stacking context established by the grid item.
The following diagram shows several overlapping grid items,
with a combination of implicit source order
and explicit 'z-index'
used to control their stacking order.
Drawing order controlled by z-index and source order.
The baselines of a grid container are determined as follows:
A grid item participates in baseline alignment in a particular dimension
if its value for 'align-self' or 'justify-self', as appropriate, is ''baseline''
and its inline axis is parallel to that dimension.
'order'-modified grid order is the order in which
grid items are encountered when traversing the grid's grid cells,
in row-major order if calculating the inline-axis baseline,
or in column-major order if calculating the block-axis baseline.
If two items are encountered at the same time,
they are taken in 'order'-modified document order.
When calculating the baseline according to the above rules,
if the box contributing a baseline has an 'overflow' value that allows scrolling,
the box must be treated as being in its initial scroll position
for the purpose of determining its baseline.
When determining the baseline of a table cell,
a grid container provides a baseline just as a line box or table-row does. [[!CSS21]]
This is the core Grid track sizing algorithm. It is run for Grid columns and Grid rows. The goal of the function is to ensure:
For the purposes of resolving the breadth that satisfies the MinTrackSizingFunction and MaxTrackSizingFunction, each Grid track falls into one of three categories:
The breadths which satisfy MinTrackSizingFunctions and MaxTrackSizingFunctions for the first category of Grid tracks are resolved in step 1 during Grid track variable initialization.
The breadths which satisfy the MinTrackSizingFunctions and the MaxTrackSizingFunctions for the second category of content-sized Grid tracks are resolved in step 2. At the end of step 2, the first goal of ComputeUsedBreadthOfGridTracks function has been satisfied:
the UsedBreadth variable of each GridTrack now satisfies its MinTrackSizingFunction. The MaxBreadth variable for each Grid track now contains the resolved value for its MaxTrackSizingFunction.
In step 3, the second goal of this function is satisfied as each (non-flex-sized) Grid track
attempts to grow from the UsedBreadth value to the MaxBreadth value, subject to RemainingSpace.
Finally in step 4, the third category of flex-sized Grid tracks can be resolved using what is now the RemainingSpace having updated the UsedBreadth of each Grid track at the end of step 3.
The purpose of this function is to resolve the contribution that each Grid item makes to any min-content or max-content TrackSizingFunctions for the Grid tracks it covers. There are four permutations: min-content or max-content in either the MinTrackSizingFunction or MaxTrackSizingFunction. MinTrackSizingFunctions are resolved before MaxTrackSizingFunctions, and min-content contributions are resolved before max-content contributions. Note that when resolving min-content contributions they may grow tracks that have either min-content or max-content keywords, as seen in 3.a.i and 3.b.i below.
Currently this algorithm embodies several heuristics which regulate the growth of spanning Grid items to accommodate certain use cases. (E.g. the game example in Figures 2 and 3 above.) These heuristics should be a normative part of this specification to ensure interoperability. To the extent additional use cases can be identified that cannot be satisfied by following the current heuristics, the normative algorithm can be updated, or additional mechanisms can be introduced for fine-grained control of content-based TrackSizingFunction.
The above function, ResolveContentBasedTrackSizingFunctions, groups Grid items based on the number of Grid tracks each Grid item spanned. ResolveContentBasedTrackSizingFunctionsForItems, below, then calls DistributeSpaceToTracks for each Grid item in the
group to determine how much each Grid item needs to grow the Grid tracks that it covers. The maximum contribution made by any Grid item is accumulated into a temporary, per-Grid track variable,
and at the end of the group, the space is recorded into a final Grid track variable as determined by the Accumulator function.
Ensures that for each Grid track in RecipientTracks, a value will be computed, UpdatedTrackBreadth, that represents the Grid track’s share of SpaceToDistribute.
There are two parts to this function. The first for loop in step 2 is giving each Grid track an equal share of the space, but without exceeding their TrackGrowthConstraint values.
Because there are different MaxBreadths assigned to the different Grid tracks, the first loop can result in their uneven growth.
If the first loop completes having grown every Grid track to its TrackGrowthConstraint, and there is still SpaceToDistribute, then SubsetOfTracksForGrowthBeyondTrackGrowthConstraint are further grown equally until SpaceToDistribute is exhausted.
Note that Grid tracks considered by this function may have a TrackGrowthConstraint equal to Infinity, which signals that these tracks have not yet been grown by a Grid item. These tracks can therefore be grown without exceeding the TrackGrowthConstraint of the track. By only growing tracks up to their TrackGrowthConstraint value, we can ensure that the grid remains "tight" - that is, that track breadth is as close to the content size of the Grid items inside as possible. Only once all Grid tracks have a CurrentBreadth equal to a TrackGrowthConstraint do we move to the second for loop and grow tracks further, thereby making the grid container less tight.
The CSS3 Box Model defines the shrink-to-fit behavior of an element as min(max(preferred minimum width, available width), preferred width), with available width defined in the Box Model spec. Accordingly, for the grid container we define the preferred minimum width as the sum of the UsedBreadths of the Grid tracks just before step 3 in ComputeUsedBreadthOfGridTracks, and the preferred width as the sum of the UsedBreadths of the Grid tracks after the entire track sizing algorithm has been run with infinite space.
Fill this in.
This specification is made possible by input from Erik Anderson, Rossen Atanassov, Arron Eicholz, Sylvain Galineau, Markus Mielke, John Jansen, Chris Jones, Kathy Kam, Veljko Miljanic, Peter Salas, Christian Stockwell, Eugene Veselov, and the CSS Working Group members. Thanks to Eliot Graff for editorial input.
The following significant changes were made since the
2 April 2013 Working Draft.
Name: grid-area
Value: <
Gutters
Alignment
Aligning with auto margins
Row-axis Alignment: the 'justify-self' and 'justify-items' properties
TODO: provide example
Column-axis Alignment: the 'align-self' and 'align-items' properties
Z-axis Ordering: the 'z-index' property
<style type="text/css">
#grid {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-rows: 1fr 1fr
}
#A { grid-column: 1 / span 2; grid-row: 2; align-self: foot }
#B { grid-column: 1; grid-row: 1; z-index: 10 }
#C { grid-column: 2; grid-row: 1; align-self: head; margin-left: -20px }
#D { grid-column: 2; grid-row: 2; justify-self: end; align-self: head }
#E { grid-column: 1 / span 2; grid-row: 1 / span 2;
z-index: 5; justify-self: center; align-self: center; }
</style>
<div id="grid">
<div id="A">A</div>
<div id="B">B</div>
<div id="C">C</div>
<div id="D">D</div>
<div id="E">E</div>
</div>
Grid Baselines
Grid Layout Algorithm
Definition of Terms for use in Calculating Grid Track Sizes
Grid Track Sizing Algorithm
Defining the Shrink-to-fit Behavior of Grid Elements
Fragmenting Grid Layout
Acknowledgements
Changes