CSS グリッドレイアウト モジュール レベル 2

W3C候補勧告ドラフト,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/CRD-css-grid-2-20250326/
最新公開版:
https://www.w3.org/TR/css-grid-2/
編集者ドラフト:
https://drafts.csswg.org/css-grid-2/
履歴:
https://www.w3.org/standards/history/css-grid-2/
実装レポート:
https://wpt.fyi/results/css/css-grid/subgrid
フィードバック:
CSSWG Issues リポジトリ
CSSWG GitHub
仕様内インライン
編集者:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (Apple)
(Microsoft)
(Igalia)
この仕様への編集提案:
GitHub 編集ページ

概要

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 predefined flexible or fixed-size layout grid. Level 2 expands Grid by adding “subgrid” capabilities for nested grids to participate in the sizing of their parent grids.

CSS は、構造化文書(HTML や XML など)のレンダリングを画面や紙などに記述するための言語です。

この文書の状態

このセクションは、本書の公開時点での状態を説明します。 現在の W3C 出版物の一覧とこの技術報告書の最新改訂は、W3C standards and drafts index at https://www.w3.org/TR/.にあります。

本文書はCSS Working Groupによって、Candidate Recommendation Draftとして、Recommendation trackを用いて公開されました。 Candidate Recommendation としての公開は、W3C およびそのメンバーによる支持を意味するものではありません。 Candidate Recommendation Draft は、作業部会が次の Candidate Recommendation Snapshot に含めることを意図している、以前の Candidate Recommendation からの変更を統合したものです。

これはドラフト文書であり、いつでも更新、置換、または他の文書によって無効にされる可能性があります。 本文書を作業途中以外のものとして引用するのは適切ではありません。

フィードバックは、GitHub での issue 提出(推奨)によって送ってください。 タイトルに仕様コード「css-grid」を含め、たとえば次のようにしてください: “[css-grid] …コメントの要約…”。 すべての issue とコメントは アーカイブされています。 あるいは、(アーカイブされている)公開メーリングリスト www-style@w3.org に送ることもできます。

本書は 2023年11月03日付 W3C プロセス文書 に従って管理されています。

本書は W3C 特許ポリシー の下で運営されているグループによって作成されました。 W3C は、当該グループの成果物に関連して行われた 特許の公開 の公開リストを維持しています; そのページには特許を公開するための手順も含まれています。 個人が実際に特許を知っており、その特許が 必須クレーム を含むと信じる場合、 その情報は W3C 特許ポリシーのセクション6 に従って開示しなければなりません。

このグリッドレイアウトモジュールと フレキシブルボックスレイアウトモジュール の間に矛盾があることに気付いた場合は、それはおそらく誤りなので CSSWG に報告してください。

1. 導入

このセクションは規範的ではありません。

グリッドレイアウトは、ボックスとその内容のサイズ決定および配置を強力に制御するための CSS のレイアウトモデルです。 単一軸指向の フレキシブルボックスレイアウト(Flexbox)とは異なり、 グリッドレイアウトは 2 次元レイアウトに最適化されています: 両方向でのコンテンツの整列が望まれる場合です。

フレックスレイアウトの例:二行のアイテム、最初は各々がスペースの3分の1を占める3つのアイテム、2行目は各々がスペースの5分の1を占める5つのアイテム。したがって“行”方向での整列はあるが、“列”方向での整列はない。
代表的なフレックスレイアウトの例
グリッドレイアウトの例:二行のアイテム、最初の行は4つのアイテム—最後のアイテムは両行にまたがる、2行目は2つのアイテム—最初のアイテムは最初の2列にまたがる—加えて最初の行からのまたがったアイテムがある。
代表的なグリッドレイアウトの例

さらに、アイテムをグリッド上の明示的なスロットに配置できる能力により、 グリッドレイアウトはマークアップの対応する変更を必要とせずに視覚的なレイアウト構造を大きく変えることを可能にします。 メディアクエリとグリッドコンテナおよびその子のレイアウトを制御する CSS プロパティを組み合わせることで、 著者はデバイスのフォームファクター、向き、利用可能なスペースの変化にレイアウトを適応させつつ、 プレゼンテーション全体でのより理想的な意味的構造を維持できます。

多くのレイアウトは Grid でも Flexbox でも表現できますが、それぞれ得意分野があります。 グリッドは 2 次元の整列を強制し、 上から下へのアプローチでレイアウトを行い、 アイテムの明示的な重なりを許可し、 より強力なスパン機能を持ちます。 フレックスボックスは軸内のスペース分配に集中し、 より単純な下から上へのアプローチを用い、 二次軸を制御するためにコンテンツサイズに基づく折り返しシステムを使用でき、 マークアップの階層に依存してより複雑なレイアウトを構成します。 両者は CSS 著者にとって有用かつ補完的なツールであると期待されます。

Grid Level 2 は サブグリッド 機能を追加します: サブグリッド化された軸は、そのグリッド線を要素の親のグリッドの線に合わせ、 親グリッドとの統合を通じてトラックのサイズを導出する軸です。

1.1. 背景と動機

画像: 水平および垂直の整列が必要なアプリケーションレイアウトの例。
水平および垂直の整列が必要なアプリケーションレイアウトの例

ウェブサイトが単純な文書から複雑でインタラクティブなアプリケーションへと進化するにつれて、 例えばフロートのような文書向けのレイアウト技術は必ずしもアプリケーションレイアウトに適しているとは限りませんでした。 テーブル、JavaScript、またはフロート要素に対する慎重な測定の組み合わせを使って、 著者は望ましいレイアウトを実現するための回避策を見出しました。 利用可能なスペースに適応するレイアウトはしばしば脆弱であり、 スペースが制約されると直感に反する動作を引き起こしました。 代替として、多くのウェブアプリケーションの著者は固定レイアウトを選び、 画面上の利用可能なレンダリングスペースの変化を利用できなくしていました。

グリッドレイアウトの機能はこれらの問題に対処します。 予測可能なサイズ指定動作のセットを使用して、レイアウト用の利用可能なスペースを列と行に分割する機構を著者に提供します。 著者はその後、アプリケーションの構成要素を、これらの列と行の交差で定義される グリッド領域 に正確に位置付けおよびサイズ指定できます。 以下の例は、グリッドレイアウトの適応能力とコンテンツとスタイルのより明確な分離をどのように可能にするかを示しています。

1.1.1. 利用可能なスペースへのレイアウトの適応

ゲームのレイアウトを2列3行で考える:左上にゲームタイトル、下にメニュー、左下にスコア、右側は上と中のセルを占めるゲームボード、下はゲームコントロールが配置される。左列はその内容(ゲームタイトル、メニュー項目、スコア)にちょうど合うようにサイズされ、右列は残りのスペースを埋める。
コンテンツサイズと利用可能なスペースに応じて配置された5つのグリッドアイテム
より大きな画面でより多くのスペースが利用可能になると、中間行/右列がそのスペースを埋めるために拡張される。
利用可能なスペースの増加によるグリッドの成長

グリッドレイアウトは、ウェブページ内の要素を賢くリサイズするために使用できます。 隣接する図は、レイアウトに5つの主要コンポーネント(ゲームタイトル、統計領域、ゲームボード、スコア領域、コントロール領域)を持つゲームを表しています。 著者の意図は、次のようにゲームのためのスペースを分割することです:

次のグリッドレイアウトの例は、著者がすべてのサイズ指定、配置、および整列のルールを宣言的にどのように達成できるかを示しています。

/**
 * Define the space for each grid item by declaring the grid
 * on the grid container.
 */
#grid {
  /**
   * Two columns:
   *  1. the first sized to content,
   *  2. 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 [Figure 4])
   *
   * Three rows:
   *  3. the first sized to content,
   *  4. the middle row receives the remaining space
   *     (but is never smaller than the minimum height
   *      of the board or stats areas)
   *  5. the last sized to content.
   */
  display: grid;
  grid-template-columns:
    /* 1 */ auto
    /* 2 */ 1fr;
  grid-template-rows:
    /* 3 */ auto
    /* 4 */ 1fr
    /* 5 */ auto;
}

/* Specify the position of each grid item using coordinates on
 * the 'grid-row' and 'grid-column' properties of each grid item.
 */
#title    { grid-column: 1; grid-row: 1; }
#score    { grid-column: 1; grid-row: 3; }
#stats    { grid-column: 1; grid-row: 2; align-self: start; }
#board    { grid-column: 2; grid-row: 1 / span 2; }
#controls { grid-column: 2; grid-row: 3; justify-self: center; }
<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>

注: グリッドの構造を指定し、グリッドアイテム の配置やサイズを指定する方法は複数あり、それぞれ異なるシナリオに最適化されています。

1.1.2. ソース順序の独立性

画像: 縦向き(ポートレート)に適した配置の例。
「ポートレート」向けに適した配置
画像: 横向き(ランドスケープ)に適した配置の例。
「ランドスケープ」向けに適した配置

前述の例を続けると、著者はゲームを異なるデバイスに適応させたいと考えています。 また、ゲームはポートレートとランドスケープのいずれの向きでもコンポーネントの配置を最適化するべきです(図6および図7)。 グリッドレイアウトとメディアクエリを組み合わせることで、 著者は同じ意味的なマークアップを使用しつつ、ソース順序に依存せずに要素のレイアウトを並べ替えることができ、 両方の向きで望ましいレイアウトを実現できます。

次の例は、グリッドレイアウトがグリッドアイテムが占める領域に名前を付ける能力を使用している例です。 これにより、グリッド定義が変更されても著者はグリッドアイテムのルールを書き換える必要を避けられます(grid items)。

@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";

    /* The way to size columns and rows can be assigned with the
     * grid-template-columns and grid-template-rows properties. */
    grid-template-columns: auto 1fr;
    grid-template-rows: auto auto 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 1fr;
    grid-template-rows: auto 1fr auto;
  }
}

/* The grid-area property places a grid item into a named
 * area of the grid. */
#title    { grid-area: title }
#score    { grid-area: score }
#stats    { grid-area: stats }
#board    { grid-area: board }
#controls { grid-area: ctrls }
<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>

注: グリッドレイアウトの並べ替え機能は意図的に 視覚的なレンダリングのみ に影響し、音声順序やナビゲーションはソース順序に基づきます。 これにより、著者は視覚的なプレゼンテーションを操作しつつ、ソース順序を非 CSS ユーザーエージェントや音声/逐次ナビゲーションのような線形モデルに最適化されたままにできます。

グリッドアイテムの配置と並べ替えは正しいソース順序の代替として使用してはなりません。そうすると文書のアクセシビリティが損なわれる可能性があります。

1.2. 値の定義

この仕様は、CSS プロパティ定義の慣習[CSS2])に従い、値の定義構文[CSS-VALUES-3])を使用しています。 本仕様で定義されていない値の型は CSS Values & Units [CSS-VALUES-3] に定義されています。 他の CSS モジュールとの組み合わせにより、これらの値型の定義が拡張されることがあります。

各プロパティの定義に列挙されているプロパティ固有の値に加えて、 本仕様で定義されるすべてのプロパティは CSS-wide keywords もプロパティ値として受け入れます。 可読性のためにそれらはここでは繰り返して明示していません。

2. 概要

このセクションは規範的ではありません。

グリッドレイアウトは、グリッドを用いて コンテンツの配置を制御します: 水平線と垂直線が交差して、グリッドコンテナの 内容のためのサイズおよび配置の座標系を作り出します。 グリッドレイアウトの特徴は次のとおりです:

グリッドコンテナはネストしたり、 必要に応じてフレックスコンテナと組み合わせてより複雑なレイアウトを作成できます。

2.1. グリッドの宣言

グリッドのトラック)は、グリッド上で 明示的に 明示的グリッド のプロパティを通じて宣言およびサイズ指定されるか、 アイテムが明示的グリッドの外に配置されるときに暗黙的に作成されます。 grid ショートハンドとそのサブプロパティがグリッドのパラメータを定義します。§ 7 グリッドの定義

以下はいくつかのグリッド宣言の例です:

2.2. アイテムの配置

グリッドコンテナの内容は、 個々のグリッドアイテムフレックスアイテムに相当)に整理され、 それらはグリッド内の定義済みの領域に割り当てられます。 アイテムはgrid-placement プロパティを通じて座標で明示的に配置することも、 自動配置を用いて空き領域に暗黙的に配置することもできます。 § 8 グリッドアイテムの配置

以下は grid-area ショートハンドを使用したグリッド配置宣言の例です:
grid-area: a;          /* Place into named grid area “a”     */
grid-area: auto;       /* Auto-place into next empty area    */
grid-area: 2 / 4;      /* Place into row 2, column 4         */
grid-area: 1 / 3 / -1; /* Place into column 3, span all rows */
grid-area: header-start / sidebar-start / footer-end / sidebar-end;
                       /* Place using named lines            */

これらは次の grid-row + grid-column 宣言と等価です:

grid-row: a;                         grid-column: a;
grid-row: auto;                      grid-column: auto;
grid-row: 2;                         grid-column: 4;
grid-row: 1 / -1;                    grid-column: 3;
grid-row: header-start / footer-end; grid-column: sidebar-start / sidebar-end;

さらに、これらは grid-row-start/grid-row-end/ grid-column-start/grid-column-end のロングハンドに分解できます。例:

grid-area: a;
/* Equivalent to grid-row-start: a; grid-column-start: a; grid-row-end: a; grid-column-end: a; */

grid-area: 1 / 3 / -1;
/* Equivalent to grid-row-start: 1; grid-column-start: 3; grid-row-end: -1; grid-column-end: auto; */

2.3. グリッドのサイズ指定

一度 グリッドアイテム配置されると、 グリッドトラック(行および列)のサイズが計算され、 定義で指定されたようにその内容や利用可能なスペースのサイズが考慮されます。

結果としてサイズが決定されたグリッドは、グリッドコンテナ内で コンテナの align-content および justify-content プロパティに従って整列されます。 § 11 整列と間隔

次の例は、すべての列に余分なスペースを分配して正当化し、 グリッドが グリッドコンテナ より小さい場合にグリッドを中央に配置します。
main {
  display: grid;
  grid: auto-flow auto / repeat(auto-fill, 5em);
  min-height: 100vh;
  justify-content: space-between;
  align-content: safe center;
}

最後に各 グリッドアイテム は、 割り当てられた グリッド領域 内で 自身のサイズ指定[CSS2])および 整列プロパティ ([CSS-ALIGN-3]) に従ってサイズ決定および整列されます。

3. グリッドレイアウトの概念と用語

グリッドレイアウトでは、 グリッドコンテナの内容が グリッド に配置・整列されてレイアウトされます。 グリッドは水平および垂直のグリッド線の交差する集合で、グリッドコンテナの空間を グリッド領域に分割し、 そこに グリッドアイテムグリッドコンテナの内容を表す)が配置できます。 グリッド線は二つの集合があります: ブロック軸に沿って走る列を定義する集合()と、 インライン軸に沿って直交する集合で行を定義する()。[CSS3-WRITING-MODES]

グリッド線の図。
グリッド線:ブロック軸に3本、インライン軸に4本。

3.1. グリッド線

グリッド線グリッドの水平および垂直の分割線です。 グリッド線は列または行の両側に存在します。 グリッド線は数値インデックスで参照することも、 著者が指定した名前で参照することもできます。 グリッドアイテムは、グリッド線を参照して グリッド内での位置を決定し、grid-placement プロパティを用いて配置します。

次の二つの例はいずれも 3 本の列用 グリッド線 と 4 本の行用 グリッド線 を作成します。

最初の例はグリッド線番号を用いて グリッドアイテム を配置する方法を示しています:

#grid {
  display: grid;
  grid-template-columns: 150px 1fr;
  grid-template-rows: 50px 1fr 50px;
}

#item1 { grid-column: 2;
         grid-row-start: 1; grid-row-end: 4; }

二番目の例は明示的に名前付けされた グリッド線 を使用しています:

/* 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;
}

3.2. グリッドトラックとセル

グリッドトラックグリッド列 または グリッド行 の一般的な呼称で、隣接するグリッド線の間の空間を指します。 各グリッドトラックにはサイズ指定関数が割り当てられ、 列または行がどれだけ広がるか/高くなるかを制御し、それによってそれを囲むグリッド線の間隔が決まります。 隣接するグリッドトラックガターで分離されることはありますが、それ以外は密に詰められます。

グリッドセルはグリッド行とグリッド列の交差点です。 これはグリッドアイテムを配置する際に参照できる 最小単位です。

次の例では 2 列と 3 行があります。 最初の列は 150px に固定されています。 2 列目は柔軟なサイズ指定を使用しており、これはグリッド内の未割り当てスペースの関数であるため、 グリッドコンテナの幅が変わると変化します。 たとえばグリッドコンテナの使用幅が 200px の場合、2 列目は 50px になります。 グリッドコンテナの使用幅が 100px の場合、2 列目は 0px になり、その列に配置されたコンテンツは グリッドコンテナをオーバーフローします。
#grid {
  display: grid;
  grid-template-columns: 150px 1fr;  /* two columns */
  grid-template-rows: 50px 1fr 50px; /* three rows  */
}

3.3. グリッド領域

グリッド領域は、1つ以上のグリッドアイテムのレイアウトに使われる論理的な空間です。 グリッド領域は、1つ以上の隣接するグリッドセルから構成されます。 グリッド領域の各辺には1本ずつ、計4本のグリッドラインで囲まれており、 その領域が交差するグリッドトラックのサイズ指定にも参加します。 グリッド領域は、grid-template-areasプロパティ(グリッドコンテナのもの)で明示的に名前付けすることも、 囲まれるグリッドラインによって暗黙的に参照されることもできます。 グリッドアイテムは、grid-placementプロパティグリッド領域に割り当てられます。

/* テンプレート構文の利用例 */
#grid  {
  display: grid;
  grid-template-areas: ". a"
                       "b a"
                       ". a";
  grid-template-columns: 150px 1fr;
  grid-template-rows: 50px 1fr 50px;
  height: 100vh;
}

#item1 { grid-area: a }
#item2 { grid-area: b }
#item3 { grid-area: b }

/* アイテム2と3をグリッド領域 "b" の異なる位置に揃える例 */
/* デフォルトでは、グリッドアイテムはグリッド領域全体にストレッチ配置され */
/* この例のアイテムは重なって表示されます */
#item2 { align-self: start; }
#item3 { justify-self: end; align-self: end; }

グリッドアイテムグリッド領域は、そのアイテムがレイアウトされる包含ブロックを形成します。 同じグリッド領域に配置されたグリッドアイテム同士は直接的に互いのレイアウトに影響を与えません。 しかし間接的には、グリッドトラックintrinsic sizing function があり、 そのトラックを占めるグリッドアイテムがトラックのサイズ(およびそれにより囲まれるグリッド線の位置)に影響を与えることがあり、 それが別のグリッドアイテムの位置やサイズに影響を与えることがあります。

3.4. ネストされたアイテムとサブグリッド

グリッドアイテム自身が グリッドコンテナになることがあり、 そのために display: grid を与えます。 一般的には、この ネストされたグリッド の内容のレイアウトは、 それが参加する 親グリッド のレイアウトとは独立します。

しかし、複数の グリッドアイテム の内容を相互に揃える必要がある場合があります。 ネストされたグリッド はその行および/または列の定義を親のグリッドコンテナに委ねることができ、 これを サブグリッド と呼びます。 この場合、サブグリッドグリッドアイテム親グリッド のサイズ決定に参加し、 両方のグリッドの内容を揃えることを可能にします。 詳しくは § 9 サブグリッド を参照してください。

サブグリッドsubgrid キーワードによって確立されます(grid-template-rows または grid-template-columns のいずれか)。 そして軸のいずれかまたは両方で subgridded することができます。 サブグリッド化された軸を持たないグリッドは スタンドアローングリッド です。

例えば、ラベルと入力の一覧からなるフォームがあるとします:
<ul>
  <li><label>Name:</label> <input name=fn>
  <li><label>Address:</label> <input name=address>
  <li><label>Phone:</label> <input name=phone>
</ul>

ラベルと入力を揃え、各リスト項目にボーダーを付けたいとします。 これはサブグリッドレイアウトで実現できます:

ul {
  display: grid;
  grid: auto-flow / auto 1fr;
}
li {
  grid-column: span 2;
  display: grid;
  grid-template-columns: subgrid;
  border: solid;
}
label {
  grid-column: 1;
}
input {
  grid-column: 2;
}

4. 再配置とアクセシビリティ

グリッドレイアウトは著者に文書の視覚的な再配置に強力な手段を与えます。 しかし、これらは文書ソースの正しい順序に代わるものではありません。 order プロパティおよび grid placement は、視覚以外のメディア(例えば 音声)における順序に影響を与えません。 同様に、グリッドアイテムを視覚的に並べ替えても、 (リンクを順にたどるなどの)逐次的なナビゲーションモードのデフォルトの巡回順序には影響しません(例: tabindex [HTML])。

著者はコンテンツの論理的な並べ替えではなく視覚的な並べ替えのためにのみ、order および grid-placement properties を使用しなければなりません。 これらの機能を論理的な並べ替えに用いるスタイルシートは適合していません。

注: これは、通常コンテンツを線形に提示する非視覚的メディアや非 CSS ユーザーエージェントが 論理的なソース順序に依存できるようにするためであり、 一方でグリッドレイアウトの配置および順序付け機能は視覚的な配置を調整するために用いられます。 (視覚的な知覚は二次元的で非線形であるため、望ましい視覚順序が必ずしも望ましい読み順と等しいとは限りません。)

多くのウェブページはマークアップ上で似た形状を持っており、 上部にヘッダー、下部にフッターがあり、 中央にコンテンツ領域と左右に1つまたは2つの追加カラムがある構成がよく見られます。 一般には、 ページのソースコードでは追加カラムよりも先にコンテンツが来ることが望ましいです。 しかしこれにより、追加カラムが左側でコンテンツ領域が右側に来るといった一般的なデザインは実現しにくくなります。 これらの問題には長年にわたりさまざまな対処法があり、 追加のカラムが二つある場合にはしばしば "Holy Grail Layout" と呼ばれてきました。 グリッドレイアウトはこの例を簡単に実現します。 例えば、次のようなページのコードと望ましいレイアウトのスケッチを考えてみます:
<!DOCTYPE html>
<header>...</header>
<main>...</main>
<nav>...</nav>
<aside>...</aside>
<footer>...</footer>
このページではヘッダーが上、フッターが下にあり、main は中央にあって右側に nav、左側に aside が配置されています。

このレイアウトはグリッドレイアウトで簡単に実現できます:

body { display: grid;
       grid: "h h h"
             "a b c"
             "f f f";
       grid-template-columns: auto 1fr 20%; }
main    { grid-area: b; min-width: 12em;     }
nav     { grid-area: a; /* auto min-width */ }
aside   { grid-area: c; min-width: 12em;     }

さらに利点として、 これらのカラムはデフォルトで 等高 になり、 メインコンテンツは画面幅を埋めるために必要なだけの幅を持ちます。 加えて、これをメディアクエリと組み合わせれば狭い画面では縦積みレイアウトに切り替えることもできます:

@media all and (max-width: 60em) {
  /* 三列を維持するには狭すぎる場合 */
  body { display: block; }
}

著者の意図する順序をすべての提示モードで保持するために、 WYSIWYG エディタやウェブベースの作成支援ツールを含むオーサリングツールは、基盤となる文書ソース自体を並べ替える必要があり、 再配置を行うために ordergrid-placement properties を用いてはならない(ただし著者が視覚順序とスピーチやナビゲーションの順序を
明示的に 同期しない ことを示している場合は除く)。

例えば、ツールがグリッドアイテムのドラッグアンドドロップによる配置変更と、 画面サイズごとの代替レイアウトを扱うメディアクエリの処理の両方を提供するかもしれません。

ほとんどの場合、並べ替えはすべての画面サイズ範囲およびナビゲーションや音声の順序にも影響すべきなので、 ツールはドラッグアンドドロップによる視覚的配置と一致するように DOM 層を同時に並べ替えるでしょう。 ただし場合によっては、著者が画面サイズごとに異なる視覚的配置を望むこともあります。 その機能を提供するために、 ツールはメディアクエリと共に grid-placement properties を使うことができ、 最も小さい画面サイズの配置を基盤となる DOM 順序に結び付けておく(これは論理的な線形表示順である可能性が高いため)一方で、 他のサイズ範囲では grid-placement properties を使って視覚的な提示を並べ替える、ということが可能です。

このようなツールは適合的ですが、ドラッグアンドドロップによるグリッドの並べ替えを常に grid-placement properties のみで扱うツールは (実装上は便利かもしれませんが)適合的ではありません。

5. グリッドコンテナ

5.1. グリッドコンテナの確立: grid および inline-griddisplay

Name: display
New values: grid | inline-grid
grid
この値は要素に グリッドコンテナ ボックスを生成させます。これは フロー レイアウト内に置かれたときに ブロックレベル になります。
inline-grid
この値は要素に グリッドコンテナ ボックスを生成させます。これは フロー レイアウト内に置かれたときに インラインレベル になります。

グリッドコンテナサブグリッド でない場合、その内容に対して 独立した グリッドフォーマッティングコンテキスト を確立します。 これは独立した ブロックフォーマッティングコンテキスト を確立することと同様ですが、ブロックレイアウトの代わりにグリッドレイアウトが用いられます: フロートはグリッドコンテナ内に侵入せず、 グリッドコンテナのマージンはその内容のマージンと折り畳まれません。 グリッドコンテナ の内容は グリッド にレイアウトされ、 グリッド線 が各 グリッドアイテム の包含ブロックの境界を形成します。

通常のネストされたグリッドとは異なり、 サブグリッド の内容は親の グリッドフォーマッティングコンテキスト に参加します; したがってサブグリッドは独立したフォーマッティングコンテキストを確立しません。

グリッドコンテナはブロックコンテナではないため、 ブロックレイアウトを前提として設計された一部のプロパティはグリッドレイアウトの文脈では適用されません。 特に:

要素の指定された displayinline-grid であり、その要素がフロートされているか絶対配置されている場合、 display の計算値は grid になります。 したがって CSS 2.1 第9.7節 の表は修正され、 "Specified Value" 列に inline-grid、 "Computed Value" 列に grid を含む追加行が加えられます。

5.2. グリッドコンテナのサイズ決定

この節の用語の定義については [CSS-SIZING-3] を参照してください。

グリッドコンテナ は、それが参加するフォーマッティングコンテキストのルールに従ってサイズ決定されます:

インラインおよびブロックの両方のフォーマッティングコンテキストにおいて、 グリッドコンテナautoblock size はその max-content サイズです。

ブロックレイアウト仕様はこれを定義すべきかもしれませんが、まだ書かれていません。

max-content サイズ(および min-content サイズ)は、 グリッドコンテナ の 対応する軸におけるトラックサイズ(ガターを含む)の合計です。 これはグリッドが max-content 制約(または min-content 制約)の下でサイズ決定されるときの値です。

5.3. スクロール可能なグリッドのオーバーフロー

overflow プロパティは グリッドコンテナ に適用されます。

(§ 5.2 グリッドコンテナのサイズ決定 で述べたように)組み込みサイズ計算に含まれるのと同様に、 グリッドグリッドコンテナスクロール可能なオーバーフロー領域 にも含まれます。

注: グリッドコンテナスクロールコンテナ の場合、パディングとの相互作用に注意してください: スクロール可能なコンテンツを place-content: end で整列させるために必要に応じて スクロール可能なオーバーフロー矩形に追加のパディングが加えられるよう定義されています。 詳しくは CSS Overflow 3 § 2.2 Scrollable Overflow を参照してください。

5.4. 大きすぎるグリッドの制限

メモリが有限であるため、 UA は 暗黙のグリッド の可能なサイズを UA 定義の制限内にクランプすることがあり得ます (これは [-10000, 10000] の範囲の線を収容するべきです)、 そしてその限界の外側のすべての線を破棄します。 もしグリッドアイテムがこの限界の外に配置される場合、 そのグリッド領域はこの制限内に クランプ されなければなりません。

グリッド領域をクランプする 方法は次のとおりです:

例えば、もし UA が各次元で最大 1000 トラックしかサポートしない場合、 次のような配置プロパティ:
.grid-item {
  grid-row: 500 / 1500;
  grid-column: 2000 / 3000;
}

は以下のように等価になります:

.grid-item {
  grid-row: 500 / 1001;
  grid-column: 1000 / 1001;
}

6. グリッドアイテム

広義には、グリッドアイテムグリッドコンテナインフロー の内容を表すボックスです。

インフロー の各子要素は グリッドコンテナ の子である場合、グリッドアイテム になります。また各子の テキストシーケンス は、匿名ブロックコンテナ にラップされて グリッドアイテム となります。 ただし、テキストシーケンス が空白文字のみを含む場合(つまり white space プロパティの影響を受け得る文字のみ)、 そのシーケンスはレンダリングされません(テキストノードが display:none のように扱われるのと同様です)。

グリッドアイテムの例:

<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 -->
    <q style="display: block" id=not-an-item>item 4</q>
    item 4
  </span>
</div>
上のコードから決定されるグリッドアイテム
  1. block を含むグリッドアイテム。
  2. float を含むグリッドアイテム。
  3. (匿名でスタイル指定不可) anonymous item 3 を含むグリッドアイテム。
  4. 連続する三つのブロックを含むグリッドアイテム:
    • item 4 を含む匿名ブロック。
    • <q> 要素ブロックで item 4 を含むもの。
    • item 4 を含む匿名ブロック。

注: 要素間の空白(inter-element white space)は消えます: それ自体が別のグリッドアイテムになることはなく、 それでも要素間のテキストは 匿名のグリッドアイテム にラップされる点に注意してください。

注: 匿名アイテムのボックスはスタイル指定できません(スタイルルールを割り当てる要素がないため)。 ただしその内容はグリッドコンテナから(フォント設定などの)スタイルを継承します。

6.1. グリッドアイテムの表示(Grid Item Display)

それが サブグリッド でない限り、 グリッドアイテム はその内容に対して 独立したフォーマッティングコンテキスト を確立します。 ただし、グリッドアイテムはブロックレベルボックスではなく グリッドレベル のボックスです: それらはコンテナの グリッドフォーマッティングコンテキスト に参加し、 ブロックフォーマッティングコンテキストには参加しません。

要素の最も近い祖先要素の 計算済みdisplay 値が (display:contents の祖先を飛ばして)grid または inline-grid の場合、 その要素自身の display 値は blockified(ブロック化) されます。 (この種の display 値の変換については CSS2.1 §9.7CSS Display 3 § 2.7 Automatic Box Type Transformations を参照してください。)

注: 要素が grid または inline-grid であっても、 その要素が replaced であるか、または display: none のサブツリーにある場合など、 実際に グリッドコンテナ ボックスを生成しない場合でも、ブロック化は発生します。

注: 通常、ある display の値は元のボックスの周りに匿名ボックスを生成します。 もしそのようなボックスが グリッドアイテム である場合、 まずブロック化されるため、匿名ボックスの生成は行われません。 例えば、連続する二つの グリッドアイテムdisplay: table-cell を持つ場合、それらは単一の匿名テーブルでラップされる代わりに、 二つの別々の display: blockグリッドアイテム として扱われます。

6.2. グリッドアイテムのサイズ指定

グリッドアイテム はその グリッド領域 によって定義される包含ブロック内でサイズ決定されます。

グリッドアイテム の、ある次元における 自動サイズ の計算は、 そのアイテムの 自己整列(self-alignment)値 により異なります:

normal

もしグリッドアイテムが該当軸において 優先アスペクト比 を持たず、 かつ(置換要素でない限り)該当軸における 自然サイズ を持たない場合、 そのグリッドアイテムは align-self: stretch と同様にサイズ決定されます。

それ以外の場合は、対応する軸に対するブロックレベル要素のサイズ計算ルールに従ってサイズ決定されます。 (詳細は CSS 2 § 10 Visual formatting model details を参照。)

stretch

非置換ボックスに対する インラインサイズ の計算ルールを使用します (CSS 2 § 10.3.3 Block-level, non-replaced elements in normal flow に定義されている)、 つまり stretch-fit サイズ を使用します。

注: これは、もしアイテムが 優先アスペクト比 を持ち、かつ他方の軸でもサイズが制約される場合に アスペクト比が歪む可能性があることを意味します。

その他すべての値

アイテムを fit-content としてサイズ決定します。

次の参考表はグリッドアイテムの自動サイズ決定をまとめたものです:
グリッドアイテムの自動サイズ挙動の要約
整列 非置換要素のサイズ 置換要素のサイズ
normal グリッド領域を満たす natural size を使用
stretch グリッド領域を満たす グリッド領域を満たす
start/center/等 fit-content サイズ(フロートのように) natural size を使用

注: auto 値は min-width および min-height において、該当軸のトラックサイズ決定に影響を与えます(これは flex item のメインサイズに対する影響と類似しています)。 詳しくは § 6.6 グリッドアイテムの自動最小サイズ を参照してください。

6.3. 再配置されたグリッドアイテム: order プロパティ

order プロパティは グリッドアイテム にも適用されます。 これはそれらの 自動配置 および 描画順(painting order) に影響します。

フレックスアイテムの再配置と同様に、 order プロパティは 視覚上の順序を音声やナビゲーションの順序と 同期させない 必要がある場合にのみ使用すべきであり、 そうでない場合は基礎となる文書ソース自体を並べ替えるべきです。 詳細は CSS Flexbox 1 § 5.4.1 Reordering and Accessibility を参照してください。

6.4. グリッドアイテムのマージンとパディング

隣接するグリッドアイテムはそれぞれが自身の グリッド領域 によって形成される包含ブロック内に独立して含まれるため、 隣接する グリッドアイテム のマージンは 折り畳まれ(collapse) ません。

グリッドアイテム上のパーセンテージ指定のマージンおよびパディングは、ブロックボックスの場合と同様に それらの包含ブロックの インラインサイズ に対して解決されます(例えば左右/上/下のパーセンテージは水平書字モードでは包含ブロックの に対して解決されます)。

auto マージンは対応する次元の余分なスペースを吸収して拡張するため、整列に使用できます。 詳しくは § 11.2 auto マージンによる整列 を参照してください。

6.5. Z 軸の順序: z-index プロパティ

グリッドアイテム は、交差する グリッド領域 に配置されたときや、負のマージンや位置指定によって非交差領域に配置された場合でも重なり得ます。 グリッドアイテムの描画順はインラインブロックの場合とまったく同じであり [CSS2] と同等ですが、 生の文書順の代わりに order によって修正された文書順 が使われ、 z-indexauto 以外の値の場合でもスタッキングコンテキストを作成します(このとき positionstatic であっても、 まるで positionrelative であるかのように振る舞います)。 したがって z-index プロパティを使って簡単にグリッドアイテムの z 軸順序を制御できます。

注: グリッドアイテムの外側に位置指定された子孫も、グリッドアイテムによって確立されたスタッキングコンテキストに参加し続けます。

次の図は、暗黙的なソース順と明示的な z-index の組合せによって スタッキング順が制御されている複数の重なったグリッドアイテムを示しています。
z-index とソース順によって制御される描画順。
<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: end; }
#B { grid-column: 1; grid-row: 1; z-index: 10; }
#C { grid-column: 2; grid-row: 1; align-self: start; margin-left: -20px; }
#D { grid-column: 2; grid-row: 2; justify-self: end; align-self: start; }
#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>

6.6. グリッドアイテムの自動最小サイズ

注: この節(および仕様全体)で使用されるサイズ用語の多くは CSS Intrinsic and Extrinsic Sizing [CSS-SIZING-3] に定義されています。

グリッドアイテムにより妥当なデフォルトの 最小サイズ を提供するために、 ある軸におけるその 自動最小サイズ の使用値は、次のすべてが真である場合に コンテンツベースの最小サイズ になります:

それ以外の場合、自動最小サイズ は通常どおりゼロになります。

注: コンテンツベースの最小サイズ内在的サイズの寄与 の一種であり、 したがって CSS Sizing 3 § 5.2 Intrinsic Contributions の規定が適用されます。

コンテンツベースの最小サイズ は、 ある次元における グリッドアイテム指定サイズ提案 が存在する場合はそれを使用し、 そうでなければ置換要素かつ 転送サイズ提案 が存在する場合はそれを用い、 それ以外は コンテンツサイズ提案 を使用します。 ただし、もしその次元において該当のグリッドアイテムが固定の 固定サイズ関数 を持つ 最大トラックサイズ関数 のみをスパンしているならば、 その次元における 指定サイズ提案コンテンツサイズ提案(およびこれが反対軸への 転送サイズ提案 へ与える入力)は、 その グリッド領域 の最大サイズにストレッチフィットした値(これらのトラックの max track sizing functions の合計および介在する固定の ガター を合計したもの)より大きくならないようにさらにクランプされます。

いかなる場合でも、そのサイズ提案は該当軸の 最大サイズ によって追加でクランプされます(もしそれが 定義済み ならば)。 アイテムが 圧縮可能な置換要素 であり、 該当軸において 定義済み優先サイズ または 最大サイズ を持つ場合、 サイズ提案はそれらのサイズによって上限が設定されます; この目的のため、これらのサイズに含まれる不定のパーセンテージは 0 に対して解決され(定義済みと見なされ)、クランプに使用されます。

注: fit-content() の引数は、コンテンツベースの最小サイズ を 固定トラックの max track sizing function と同じ方法でクランプしません。

この計算で使用される コンテンツサイズ提案, 指定サイズ提案, および 転送サイズ提案 は、 該当する min/max/優先サイズプロパティを考慮に入れており、コンテンツベースの最小サイズ が 著者が指定した制約を妨げないようになっています。これらは以下で定義されます:

指定サイズ提案
もしアイテムの該当軸における 優先サイズ定義済み であれば、 指定サイズ提案 はそのサイズです。 それ以外の場合は未定義です。
転送サイズ提案
もしアイテムが 優先アスペクト比 を持ち、反対軸におけるその 優先サイズ定義済み であれば、 転送サイズ提案 はそのサイズです (もし反対軸の最小/最大サイズが定義済みならそれによってクランプされます)をアスペクト比を通じて変換したものです。 それ以外の場合は未定義です。

もしアイテムが該当軸において 定義済み優先サイズ または 最大サイズ を持つ場合、 転送サイズ提案 はそれらのサイズによって上限が設定されます; この目的のため、これらのサイズに含まれる不定のパーセンテージは 0 に対して解決され(定義済みと見なされ)、クランプに使用されます。

コンテンツサイズ提案
コンテンツサイズ提案 は 該当軸における min-content サイズ であり、 もし優先アスペクト比がある場合は、それを反対軸の定義済みの最小/最大サイズによってアスペクト比を通じてクランプします。

ボックスの内在的サイズ(例えばボックスの min-content サイズ) を計算する目的では、 コンテンツベースの最小サイズ はその軸におけるボックスのサイズを不確定(indefinite)にします (たとえそのボックスの width が定義済みサイズを指定していても)。 これは、このサイズに対して計算されたパーセンテージが auto として振る舞う ことを意味します。

内在的サイズの計算以外の目的においては、コンテンツベースの最小サイズ(明示的な min-content 等とは異なり)はボックスのサイズを不確定にすることを強制しません。 ただし、もしこの最小値が適用される前にそのボックスのサイズに基づいて解決されたパーセンテージがある場合、 そのパーセンテージは適用後に再解決されなければなりません。

コンテンツベースの最小サイズはしばしば適切で、コンテンツの重なりやコンテナからのはみ出しを防ぐのに役立ちますが、 常に望ましいわけではないことに注意してください:

特に、グリッドレイアウトが文書の主要なコンテンツ領域に使用されている場合は、 min-width: 12em のようなフォントに依存する明示的な最小幅を設定する方が望ましいです。 コンテンツベースの最小幅は、大きな表や大きな画像が全体のコンテンツ領域のサイズを引き伸ばし、オーバーフロー領域に入り込み、 テキスト行を不必要に長くして読みづらくする可能性があります。

また、コンテンツベースのサイズ指定を大量のコンテンツを持つアイテムに対して使用すると、レイアウトエンジンはその最小サイズを見つけるためにすべてのコンテンツを巡回する必要がありますが、 著者が明示的な最小値を設定している場合はこれが不要になります。 (コンテンツ量が小さいアイテムでは、この巡回は些細でありパフォーマンス上の問題にはなりません。)

7. グリッドの定義

7.1. 明示的グリッド

3つのプロパティ grid-template-rowsgrid-template-columnsgrid-template-areas は、グリッドコンテナ明示的グリッド を定義し、その 明示的グリッドトラック を指定します。 最終的なグリッドは、グリッドアイテム明示的グリッド の外側に配置された場合、より大きくなる場合があります。 この場合、暗黙的なトラックが作成され、 それらの暗黙的トラックは grid-auto-rows および grid-auto-columns プロパティによってサイズが決定されます。

明示的グリッド のサイズは、 grid-template-areas で定義された行・列数と、 grid-template-rows/grid-template-columns でサイズ指定された行・列数のうち、 より大きい方によって決定されます。 grid-template-areas で定義されているが、grid-template-rows/grid-template-columns でサイズ指定されていない行・列は、 grid-auto-rows/grid-auto-columns プロパティからサイズを取得します。 これらのプロパティによって 明示的 なトラックが全く定義されない場合でも、 明示的 なグリッドは各軸に1つの グリッドライン を持ちます。

grid-placement プロパティ の数値インデックスは 明示的グリッド の端から数えます。 正のインデックスは 開始 側から数え (開始 側の最初の 明示的 ラインは1から)、 負のインデックスは 終了 側から数えます (終了 側の最も端の 明示的 ラインは-1から)。

grid および grid-template プロパティは、3つの 明示的グリッドプロパティgrid-template-rowsgrid-template-columnsgrid-template-areas)を 同時に設定できる ショートハンドです。 grid ショートハンドは 暗黙的グリッド を制御するプロパティも同時にリセットしますが、 grid-template プロパティはそれらを変更しません。

7.2. 明示的トラックのサイズ指定:grid-template-rows および grid-template-columns プロパティ

名称: grid-template-columns, grid-template-rows
値: none | <track-list> | <auto-track-list> | subgrid <line-name-list>?
初期値: none
適用対象: グリッドコンテナ
継承: no
パーセンテージ: コンテンツ領域の対応する次元を参照
算出値: キーワード none または 算出済みトラックリスト
正規順序: 文法に準じる
アニメーションタイプ: リストの長さが一致する場合、算出済みトラックリスト の各項目ごとの算出値タイプによる(§ 7.2.5 トラックリストの算出値 および § 7.2.3.3 repeat() の補間・組み合わせを参照);一致しない場合は離散

これらのプロパティは、空白区切りの トラックリスト として ライン名トラックサイズ指定関数グリッド に指定します。 grid-template-columns プロパティはグリッドの列の トラックリスト を指定し、 grid-template-rows は行の トラックリスト を指定します。

値の意味は以下のとおりです:

none
このプロパティによって 明示的 なグリッドトラックは作成されません (ただし 明示的グリッド トラックは grid-template-areas によって作成されることがあります)。

注: 明示的グリッド が存在しない場合、行・列は 暗黙的に生成 され、 そのサイズは grid-auto-rows および grid-auto-columns プロパティによって決定されます。

<track-list> | <auto-track-list>
トラックリスト を 一連の トラックサイズ指定関数ライン名 として指定します。 各 トラックサイズ指定関数 は、長さ、グリッドコンテナのサイズに対するパーセンテージ、 列や行に占めるコンテンツの寸法、またはグリッド内の空き領域の割合として指定できます。 また minmax() 記法を使って範囲指定も可能です。 これにより、列や行ごとに 最小最大トラックサイズ指定関数 を個別に指定できます。
subgrid <line-name-list>?
subgrid 値は、その軸で 親グリッド の 範囲部分を継承することを示します(subgridded 軸)。 サイズは明示的に指定せず、 グリッドの行・列サイズは 親グリッド の定義から取得され、 subgrid のアイテムは 固有サイズの計算CSS Grid Layout 1 § 11.5 固有トラックサイズの解決) に参加します。 本質的には、subgrid はネストされた要素間でグリッドパラメータを伝播し、 コンテンツベースのサイズ情報を 親グリッド へ返す機能を提供します。

<line-name-list> 引数を使うと、 親グリッド と共有されるグリッドラインにローカル名を割り当てることができます: <line-name-list> が指定された場合、 指定された <line-names>subgrid明示的グリッド の各ラインに1つずつ割り当てられます(1番目のラインから)。 余分な <line-names> は無視されます。

親グリッド が存在しない場合や、 グリッドコンテナ独立フォーマットコンテキスト を強制される場合 (レイアウト封じ込め [CSS-CONTAIN-2]絶対配置 [CSS-POSITION-3] など)、 使用値 は 初期値 none となり、 グリッドコンテナsubgrid にはなりません。

subgridded でない軸は 単独軸 です。

トラックリスト の構文は次のとおりです:

<track-list>          = [ <line-names>? [ <track-size> | <track-repeat> ] ]+ <line-names>?
<auto-track-list>     = [ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>? <auto-repeat>
                        [ <line-names>? [ <fixed-size> | <fixed-repeat> ] ]* <line-names>?
<explicit-track-list> = [ <line-names>? <track-size> ]+ <line-names>?

<line-name-list>      = [ <line-names> | <name-repeat> ]+
<track-size>          = <track-breadth> | minmax( <inflexible-breadth> , <track-breadth> ) | fit-content( <length-percentage [0,∞]> )
<fixed-size>          = <fixed-breadth> | minmax( <fixed-breadth> , <track-breadth> ) | minmax( <inflexible-breadth> , <fixed-breadth> )
<track-breadth>       = <length-percentage [0,∞]> | <flex [0,∞]> | min-content | max-content | auto
<inflexible-breadth>  = <length-percentage [0,∞]> | min-content | max-content | auto
<fixed-breadth>       = <length-percentage [0,∞]>
<line-names>          = '[' <custom-ident>* ']'

コンポーネント値の定義は…

7.2.1. トラックサイズ

<length-percentage [0,∞]>
CSS3 Values で定義された非負の長さまたはパーセンテージ。[CSS-VALUES-3]

<percentage> 値は、 列の 内側 インラインサイズ、 行の 内側 ブロックサイズ を参照します。 グリッドコンテナ のサイズがトラックサイズに依存する場合、 <percentage>auto として扱われ、 グリッドコンテナ の固有サイズ計算時はそのサイズで解決されます。 その後 グリッドコンテナ サイズに基づいて グリッド とそのアイテムのレイアウトに使用されます。

<flex [0,∞]>
単位 fr で指定された非負の寸法で、 トラックの フレックス係数 を示します。 <flex> サイズのトラックは、残りの空き領域をフレックス係数の比率で分割します。 例えば 1fr 2fr の場合、トラックは空き領域の1/3と2/3を占有します。 詳細は § 7.2.4 フレキシブル長さ:fr単位 を参照してください。

注: フレックス係数 の合計が1未満の場合、 空き領域の対応する割合しか占有せず、全体を埋めません。

minmax() 記法の外で使用された場合、 自動的な最小値(例:minmax(auto, <flex>))が暗黙的に適用されます。

minmax(min, max)
min 以上 max 以下のサイズ範囲を定義します。 maxmin より小さい場合、 maxmin に切り捨てられます(結果的に minmax(min, min))。 最大値には <flex> 値も指定でき、トラックの フレックス係数 になります。 最小値としては無効です。

注: 将来の仕様レベルでは最小値にも <flex> を許可する可能性があり、 トラックサイズ指定アルゴリズム もそれに対応するよう更新されます。

auto
最大値 の場合:max-content contribution の最大値を表しますが、 max-content とは異なり、 align-contentjustify-content プロパティによる拡張が可能です。

最小値 の場合:最小サイズmin-width/min-height で指定)を表します。 (これは通常 min-content 最小値と同じですが、常にそうとは限りません—詳細は § 6.6 グリッドアイテムの自動最小サイズ を参照)。

minmax() 記法の外で出現した場合: minmax(auto, auto) と同等で、 上記の最小・最大の範囲を表します。 (基本的には minmax(min-content, max-content) と同様ですが、 追加機能があります。)

max-content
max-content contribution の最大値を表します。
min-content
min-content contribution の最大値を表します。
fit-content( <length-percentage> )
次の式を表します: max(minimum, min(limit, max-content)) ここで minimumauto の最小値(多くの場合 min-content 最小値と等しい)、 limitトラックサイズ指定関数fit-content() に渡された引数です。 実質的には minmax(auto, max-content)minmax(auto, limit) の小さい方として計算されます。
次の grid-template-columns 宣言では:
grid-template-columns: 100px 1fr max-content minmax(min-content, 1fr);

5つのグリッドラインが作成されます:

  1. グリッドコンテナ の開始端。
  2. グリッドコンテナ の開始端から100pxの位置。
  3. 前のラインから 空き領域 の半分の距離(グリッドコンテナ の幅から非フレックス グリッドトラック の幅を引いた値)。
  4. 前のラインから、その間の列に属する グリッドアイテム の最大サイズ分の距離。
  5. 前のラインから、その間の列に属する グリッドアイテム の最大最小サイズ以上、ただし空き領域の残り半分以下の距離。

非フレックスサイズ (100pxmax-contentmin-content)の合計が グリッドコンテナ の幅より大きい場合、 最後の グリッドライン は開始端からその合計分離れた位置になります(1fr のサイズは両方0になります)。 合計が グリッドコンテナ の幅より小さい場合、 最後の グリッドライン は終了端にぴったり位置します。 <flex> 値がトラックサイズに含まれている限り、 一般にこれは正しいです。

有効な グリッドトラック 定義の追加例:
/* 有効なトラック定義の例 */
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);

注: グリッドのサイズは単純にトラックサイズの合計ではなく、 row-gapcolumn-gapjustify-contentalign-content によってトラック間に追加のスペースが生じます。

7.2.2. グリッドラインの命名:[<custom-ident>*] 構文

グリッドライン は常に数値インデックスで参照できますが、 ライン名 を使うことで grid-placement プロパティ の理解や保守がしやすくなります。 ライン名明示的割り当てライン名 として grid-template-rowsgrid-template-columns で割り当てるか、 暗黙的割り当てライン名 として named grid areagrid-template-areas で指定することで割り当てることができます。

例えば、 次のコードはグリッド内の全てのラインに意味のある名前を付けます。 一部のラインには複数の名前があることに注意してください。
#grid {
  display: grid;
  grid-template-columns: [first nav-start] 150px [main-start] 1fr [last];
  grid-template-rows: [first header-start] 50px [main-start] 1fr [footer-start] 50px [last];
}
画像: Named Grid Lines.
グリッドラインの命名例。

ライン名spanauto にはできません。 つまり、<custom-ident><line-names> の生成規則において キーワード span および auto を除外します。

7.2.3. 行・列の繰り返し:repeat() 記法

repeat() 記法は トラックリスト の一部を繰り返す表現で、 多数の列や行で繰り返しパターンがある場合に、より簡潔に記述できます。

この例は同じグリッド定義を2通りで記述しています。 どちらも「main」列4つ(各250px)を10pxの「ガター」列で囲みます。
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-columns: repeat(4, 10px [col-start] 250px [col-end]) 10px;
7.2.3.1. repeat() の構文

repeat() 構文の一般形は、概ね次の通りです。

repeat( [ <integer [1,∞]> | auto-fill | auto-fit ] , <track-list> )

第1引数は繰り返し回数を指定します。 第2引数はトラックリストで、 指定された回数だけ繰り返されます。 ただし、いくつか制約があります:

したがって、repeat() 記法の厳密な構文には複数の形式があります:

<track-repeat> = repeat( [ <integer [1,∞]> ] , [ <line-names>? <track-size> ]+ <line-names>? )
<auto-repeat>  = repeat( [ auto-fill | auto-fit ] , [ <line-names>? <fixed-size> ]+ <line-names>? )
<fixed-repeat> = repeat( [ <integer [1,∞]> ] , [ <line-names>? <fixed-size> ]+ <line-names>? )
<name-repeat> = repeat( [ <integer [1,∞]> | auto-fill ], <line-names>+)

repeat() 関数(<name-repeat>以外)が 2つの<line-names>を隣接して配置する場合、 名前リストは結合されます。 例えば repeat(2, [a] 1fr [b])[a] 1fr [b a] 1fr [b] と等価です。

7.2.3.2. 詰めるための繰り返し: auto-fill および auto-fit の繰り返し

subgridded axis においては、 auto-fill キーワードは <line-name-list> ごとに一度だけ有効であり、 名前リストと subgrid で指定されたgrid span が一致するまで繰り返されます (spanがすでに満たされていれば0回になります)。

それ以外、standalone axis では、 繰り返し回数として auto-fill が指定された場合、 grid container の該当軸に 確定したpreferred size最大サイズがある場合、 grid がその content box をオーバーフローしない最大の正の整数が繰り返し回数となります (gap も考慮)。 どの回数でもオーバーフローする場合は1回のみ。 それ以外、grid container に該当軸の 確定した最小サイズがある場合は その最小要件を満たす最小の正の整数が繰り返し回数になります。 それ以外は、指定されたトラックリストは1回だけ繰り返されます。

この目的のため、 各トラックはその最大トラックサイズ指定関数確定していればそれとして、 そうでなければ最小トラックサイズ指定関数が確定していればそれとして扱います。 両方が確定している場合は 最大トラックサイズ指定関数最小トラックサイズ指定関数 で切り捨てます。 いずれも確定していない場合は繰り返し回数は1です。

例えば次のコードは、 ウィンドウ幅に収まるだけ多くの25文字幅の列を作成します。 余りのスペースは25文字列に分配されます。
body {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(25ch, 1fr));
}

auto-fit キーワードは auto-fill と同様に動作しますが、 グリッドアイテム配置 の後、空の繰り返しトラックは折りたたまれます。 空のトラックとは、in-flow のグリッドアイテムが配置されていない、または跨いでいないトラックです。 (すべてのトラックが空の場合、すべて折りたたまれます。)

折りたたみグリッドトラック は、トラックサイズ指定関数0px であるものと扱われ、 両側のガター分配アライメントによるスペースも含む)は折りたたまれます。

standalone axis で 自動繰り返しトラック数を計算するため、UAはゼロ除算を避けるためにUA指定値へトラックサイズを切り捨てなければなりません。 この切り捨て値は 1px を推奨します。

7.2.3.3. repeat() の補間・組み合わせ

2つの repeat() 記法が 第1引数(繰り返しカウント)と第2引数(トラックリスト)のトラック数が一致している場合、 それぞれの算出済みトラックリストの各構成要素を 算出値で組み合わせます(トップレベルのトラックリストと同様)。 それ以外の場合は離散的に組み合わされます。

7.2.4. 柔軟長さ:fr 単位

柔軟長さ または <flex>fr 単位による寸法で、 grid container残りスペースの割合を表します。 fr 単位でサイズ指定されたトラックは 柔軟トラック と呼ばれ、残りスペースに応じて伸縮します。これは flex itemflex container 内でゼロ基準サイズで空間を埋める挙動と似ています。

残りスペース の分配は 非柔軟なトラックサイズ指定関数が最大まで達した後に行われます。 その行や列の合計サイズが利用可能スペースから差し引かれ、残りスペースとなり、 フレックスサイズの行や列にフレックス係数の比率で分配されます。

各列・行の残りスペースの割合は次の式で算出できます: <flex> * <leftover space> / <すべての フレックス係数 の合計>

<flex> 値が 0fr ~ 1fr の範囲の場合は少し特殊です。フレックス係数の合計が1未満だと、残りスペースの100%未満しか使いません。

トラックの <flex> 値は 残りスペースの割合要求であり、1fr は「残りスペースの100%」という意味です。 軸内のトラックが合計100%以上要求している場合は比率を維持してちょうど100%で分配されます。 逆に合計が100%未満のとき(例:3トラックがそれぞれ .25fr)は それぞれが要求通り(25%ずつ)を受け取り、残余の25%は空きとなります。 詳細は § 12.7 柔軟トラックの拡張 を参照してください。

この挙動は fr 値がゼロに近づいた場合に連続的な動作となるため必要です (トラックが残りスペースを「全く」要求しない場合)。 これがなければ 1fr トラックも 0.1fr0.01fr も 残りスペース全体を取ってしまい、最終的にゼロを下回った瞬間にスペースを全く取らなくなり不連続になります。 この挙動により、係数が 1fr 未満になるにつれ徐々にスペースが減り、ゼロで滑らかに0%となります。

この「部分的な充填」挙動が目的でない限り、1以上の値を使うべきです; 例えば 1fr2fr を使う方が .33fr.67fr より トラック数が増減しても意図通り動きやすいです。

利用可能スペースが無限大の場合 (grid container の幅または高さが 未確定の場合)、 フレックスサイズのグリッドトラックは 内容に合わせつつ比率を保持したサイズになります。 各フレックスサイズの グリッドトラック の使用サイズは max-content サイズを フレックス係数で割った「仮想1frサイズ」として算出し、 その最大値を 1fr の解決値(flex fraction)とし、 各グリッドトラックのフレックス係数を掛けて最終サイズとします。

注: <flex> 値は <length> ではなく (また <length> や一部の <percentage> 値とも互換性がありません)、 calc() 式で他の単位型と 組み合わせたり表現することはできません。

7.2.5. トラックリストの算出値

subgrid軸の 算出済みトラックリスト は、 リストで、 ライン名セットトラックセクションが交互に並び、 最初と最後の項目はライン名セットです。

ライン名セットは (空でもよい)識別子集合で、ライン名を表します。

トラックセクションは次のいずれかです:

算出済みトラックリストsubgrid軸は subgrid キーワードに続き、 その軸で指定されたライン名を表すリストライン名セット算出済みrepeat記法)となります。

7.2.6. トラックリストの解決値

grid-template-rowsgrid-template-columns プロパティは 解決値特例プロパティです。[CSSOM]

7.2.6.1. 単独トラックリストの解決値

要素がグリッドコンテナボックスを生成するとき、 解決値としての grid-template-rowsgrid-template-columns プロパティは 単独軸の場合、 使用値 を次のようにシリアライズします:

上記リストの1番目の項目は、 暗黙トラックも grid-template-rows などで シリアライズされることを意味しますが、 実際には作者がそれらのプロパティで暗黙トラックサイズを指定することはできません! そのため grid-template-rowsgrid-template-columns の値は 正しくラウンドトリップしない場合があります:
const s = getComputedStyle(gridEl);
gridEl.style.gridTemplateRows = s.gridTemplateRows;
// このようなコードは本来何も起こらないはずだが、
// 暗黙の行があると、
// それが明示的行に変換され、
// グリッドアイテムの配置やグリッド全体のサイズが変わる可能性がある!

これは初期実装の偶発的な仕様であり、 後の実装にも深く考慮されずに引き継がれました。 仕様からは将来的に削除予定ですが、 暗黙トラック情報取得のCSSOM API定義前は 現状これが唯一の取得手段であり、多くのページが依存しているため その後に削除する予定です。

それ以外の場合(例:要素が display: none だったり、グリッドコンテナでない場合)は 解決値は単に算出値です。

<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).gridTemplateColumns;
  // [a] 50px [b] 320px [b c d e] 40px [e] 40px 0px 0px 0px 0px 50px
</script>

注: 一般に解決値は算出値ですが、 一部の旧来2.1プロパティだけ例外があります。 ただし、このモジュール初期実装との互換性のため grid-template-rowsgrid-template-columns は 使用値を返す仕様となっています。

CSSワーキンググループは grid-placementプロパティでも使用値を返すべきか検討中です。特に実装者からのフィードバックを求めています。 議論参照。

7.2.6.2. subgridトラックリストの解決値

要素が グリッドコンテナボックスで subgrid の場合、 解決値としての grid-template-rowsgrid-template-columns プロパティは 使用された列数を表し、 subgridキーワードに続き、 各ラインを ライン名セットとして 明示的に subgridで定義されたすべての名前(親グリッドから引き継いだものは含まない)を repeat()記法を使わずにリスト化します。

例えば、 subgridgrid-column: span 4 が適用されている場合、 次の grid-template-columns指定値は 対応する 解決値となります:
specified: subgrid [a] repeat(auto-fill, [b]) [c]
resolved:  subgrid [a] [b] [b] [b] [c]
specified: subgrid [a] [a] [a] [a] repeat(auto-fill, [b]) [c] [c]
resolved:  subgrid [a] [a] [a] [a] [c]
specified: subgrid [] [a]
resolved:  subgrid [] [a] [] [] []
specified: subgrid [a] [b] [c] [d] [e] [f]
resolved:  subgrid [a] [b] [c] [d] [e]

注: これは本来の 「最短同値のシリアライズ原則」に反しますが、 空の末尾 ライン名セット を シリアライズすることで subgrid が何トラック分跨いでいるか の有用な情報が得られます。

7.3. 名前付き領域:grid-template-areas プロパティ

名称: grid-template-areas
値: none | <string>+
初期値: none
適用対象: グリッドコンテナ
継承: no
パーセンテージ: 該当なし
算出値: キーワード none または文字列値のリスト
正規順序: 文法どおり
アニメーションタイプ: 離散

このプロパティは 名前付きグリッド領域 を指定します。 これは特定のグリッドアイテムに紐付いていませんが、 grid-placementプロパティから参照できます。 grid-template-areasプロパティの構文により グリッドの構造の可視化もでき、 グリッドコンテナ全体のレイアウトが理解しやすくなります。

値の意味は以下の通りです:

none
このプロパティで 名前付きグリッド領域明示的グリッドトラックも定義されません (ただし 明示的グリッドトラックは grid-template-columnsgrid-template-rowsで作成されることがあります)。

注: 明示的グリッド が存在しない場合、 行・列は暗黙的に生成され、 サイズは grid-auto-rowsgrid-auto-columnsプロパティで決定されます。

<string>+
grid-template-areasプロパティで 列挙された各文字列ごとに行が作成され、 各文字列内のセルごとに列が作成されます。 パース方法は次の通り:

文字列を次のトークンのリストに分割します(最長一致):

  • identコードポイントの連続。 これは 名前付きセル・トークンで、そのコードポイントからなる名前を持つ。
  • "."(U+002E FULL STOP)が一つ以上並んだもの。 これは nullセル・トークン
  • 空白の連続。 これは何も表さず(トークンを生成しない)。
  • その他任意の文字の連続。 これは ゴミ・トークン

注: これらの規則により <ident> 構文に一致しないセル名(例:"1st 2nd 3rd")が生成されることがあり、 他プロパティで名前参照する際はエスケープが必要です(例:grid-row: \31st;1st 領域を参照)。

すべての文字列は同じ数のセル・トークン (名前付きセル・トークンまたはnullセル・トークン)を含み、 少なくとも一つのセル・トークンが必要です。 そうでなければ宣言は無効です。 また、名前付きグリッド領域が 複数のグリッドセルを跨ぐ場合、 それらセルが一つの矩形で完全に埋まらないと宣言は無効です。

注: 非矩形や分断された領域は 今後のバージョンで許可される可能性があります。

この例では grid-template-areasプロパティを使って ページレイアウトを作成しています。 領域はヘッダー(head)、ナビゲーション(nav)、フッター(foot)、メイン(main)用に定義。 テンプレートは3行2列で4つの名前付きグリッド領域を作成します。 head領域はグリッドの両列・最初の行をまたいでいます。
#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; }

7.3.1. テンプレート文字列のシリアライズ

指定値算出値として <string>値の grid-template-areas を シリアライズする時、各nullセル・トークンは "."(U+002E FULL STOP)一つでシリアライズされ、 連続するセル・トークンはスペース(U+0020 SPACE)一つで区切られ、 その他の空白はすべて省略されます。

7.3.2. 暗黙的割り当てライン名

grid-template-areasプロパティはテンプレートの 名前付きグリッド領域から 暗黙的割り当てライン名を生成します。 各名前付きグリッド領域 foo について、4つの暗黙的割り当てライン名が作成されます: 2つは foo-start という名前で、名前付きグリッド領域の 行開始・列開始ラインを名前付けし、 2つは foo-end という名前で、名前付きグリッド領域の行終了・列終了ラインを名前付けします。

これら暗黙的割り当てライン名は他のライン名と同じように動作しますが、 grid-template-rowsgrid-template-columnsの値には現れません。 同じ名前の明示的割り当てライン名が定義されている場合でも、 暗黙的割り当てライン名は同じ名前のラインが増えるだけです。

7.3.3. 暗黙的名付け領域

名前付きグリッド領域は、 それが生成する暗黙的割り当てライン名によって参照されるため、 同じ形式(foo-start/foo-end)の名前付きラインを明示的に追加することは 実質的に名前付きグリッド領域を作ることとなります。 このような暗黙的名付け領域grid-template-areasの値には現れませんが、 grid-placementプロパティから参照可能です。

7.4. 明示的グリッド・ショートハンド:grid-template プロパティ

名称: grid-template
値: none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?
初期値: none
適用対象: グリッドコンテナ
継承: 個別プロパティ参照
パーセンテージ: 個別プロパティ参照
算出値: 個別プロパティ参照
アニメーションタイプ: 個別プロパティ参照
正規順序: 文法どおり

grid-templateプロパティは ショートハンドであり、 grid-template-columnsgrid-template-rowsgrid-template-areas を一度に設定できます。 書式は複数の形があります:

none
3つのプロパティすべてを初期値(none)に設定します。
<'grid-template-rows'> / <'grid-template-columns'>
grid-template-rowsgrid-template-columns を指定値に設定し、 grid-template-areasnone となります。
grid-template: auto 1fr / auto 1fr auto;

これは次と同じ意味です:

grid-template-rows: auto 1fr;
grid-template-columns: auto 1fr auto;
grid-template-areas: none;
[ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?

この書式により、作者はトラック名やサイズをグリッド領域とインラインで揃えて記述できます。

grid-template: [header-top] "a   a   a"     [header-bottom]
                 [main-top] "b   b   b" 1fr [main-bottom]
                          / auto 1fr auto;

これは次と同じ意味です:

grid-template-areas: "a a a"
                     "b b b";
grid-template-rows: [header-top] auto [header-bottom main-top] 1fr [main-bottom];
grid-template-columns: auto 1fr auto;

そして以下のようなグリッドが作成されます:

  • 3列(auto, 1fr, auto の順)
  • 2行(auto1fr
  • 上端に“header-top”と“a-start”の両方の名前を持つライン、 中央に4つの名前(“header-bottom”, “main-top”, “a-end”, “b-start”)を持つライン、 下端に“main-bottom”と“b-end”の名前を持つライン
  • 左端に“a-start”と“b-start”、右端に“a-end”と“b-end”の名前を持つライン
上記宣言で作成されるグリッド。 (“a/b-start/end”の名前は暗黙的割り当て名前付きグリッド領域から割り当てられます。)

注: repeat()関数はこのトラックリストでは使えません。 トラックが“ASCIIアート”の行・列と一対一で視覚的に揃うことを意図しているためです。

注: gridショートハンドも 同じ構文を受け付けますが、暗黙グリッドプロパティも初期値にリセットします。 別途カスケードさせたいのでなければ、 gridの使用が grid-templateより推奨されます。

7.5. 暗黙グリッド

grid-template-rowsgrid-template-columnsgrid-template-areas明示的グリッドを構成する 固定数のトラックを定義します。 グリッドアイテムがこれらの範囲外に配置される場合、 グリッドコンテナ暗黙グリッドトラックgrid暗黙グリッドラインとして追加し生成します。 これらのラインと明示的グリッドの組み合わせが 暗黙グリッドとなります。 grid-auto-rowsgrid-auto-columnsプロパティは 暗黙グリッドトラックの サイズを決定し、 grid-template-areasで作成されたが grid-template-rowsgrid-template-columnsで 明示的にサイズ指定されていない明示的グリッドトラックもサイズ決定します。

grid-auto-flowプロパティは 明示的な位置指定がないグリッドアイテムの 自動配置を制御します。 明示的グリッドが埋まった場合 (または明示的グリッドがない場合)、 自動配置によっても暗黙グリッドトラックが生成されます。

grid ショートハンドプロパティは 暗黙グリッドプロパティgrid-auto-flowgrid-auto-rowsgrid-auto-columns) と明示的グリッドプロパティを 一つの宣言でまとめて設定可能です。

7.6. 暗黙トラックのサイズ指定:grid-auto-rows および grid-auto-columns プロパティ

名称: grid-auto-columns, grid-auto-rows
値: <track-size>+
初期値: auto
適用対象: グリッドコンテナ
継承: no
パーセンテージ: トラックサイズ指定 参照
算出値: トラックサイズ指定 参照
正規順序: 文法どおり
アニメーションタイプ: リスト長が一致すれば各項目ごと算出値型で、それ以外は離散

grid-auto-columns および grid-auto-rows プロパティは、 grid-template-rowsgrid-template-columns でサイズ指定されていない トラックのサイズを指定します。 複数のトラックサイズが指定された場合は、影響を受けるトラックのサイズを決定するためにパターンが必要なだけ繰り返されます。 最後の明示的サイズ指定トラックの次のトラックが最初の指定サイズを受け取り、以降は前方へ続きます; また、暗黙グリッドトラックのうち 明示的グリッドの直前のトラックは最後の指定サイズを受け取り、以降は後方へ繰り返されます。

注: グリッドアイテムが grid-template-rowsgrid-template-columnsgrid-template-areas で明示的に宣言されていない行・列に配置される場合は、 暗黙グリッドトラックが それを収容するために生成されます。 これは範囲外の行・列に明示的に配置する場合や、 自動配置アルゴリズムが追加の行・列を生成する場合に発生します。

<style>
  #grid {
    display: grid;
    grid-template-columns: 20px;
    grid-auto-columns: 40px;
    grid-template-rows: 20px;
    grid-auto-rows: 40px;
  }
  #A { grid-column: 1; grid-row: 1; }
  #B { grid-column: 2; grid-row: 1; }
  #C { grid-column: 1; grid-row: 2; }
  #D { grid-column: 2; grid-row: 2; }
</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>
2×2グリッドで 最初の行+列に明示的な20px×20pxグリッドセルが1つ、 さらに3つのセルは追加のグリッドアイテムを収容するために 暗黙的な40pxの列・行が生成されて生まれます。

7.7. 自動配置grid-auto-flow プロパティ

名称: grid-auto-flow
値: [ row | column ] || dense
初期値: row
適用対象: グリッドコンテナ
継承: no
パーセンテージ: 該当なし
算出値: 指定キーワード
正規順序: 文法どおり
アニメーションタイプ: 離散

明示的配置されていないグリッドアイテムは、 グリッドコンテナ内の空いている場所に 自動配置アルゴリズムによって自動配置されます。 grid-auto-flow自動配置アルゴリズムの挙動を制御し、 自動配置アイテムがグリッドにどのように流し込まれるかを指定します。 詳細は § 8.5 グリッドアイテム配置アルゴリズム を参照してください。

row
自動配置アルゴリズムはアイテムを 各行を順に埋めていき、必要に応じて新しい行を追加します。 rowcolumn も指定されていない場合、 rowが既定となります。
column
自動配置アルゴリズムはアイテムを 各列を順に埋めていき、必要に応じて新しい列を追加します。
dense
指定された場合、自動配置アルゴリズムは「dense」詰めアルゴリズムを使い、 後から小さいアイテムが来た場合はグリッド内の隙間を早く埋めるよう試みます。 このため順序が入れ替わる場合がありますが、 より大きいアイテムで空いた穴を後から来た小さいアイテムで埋められるようにします。

省略した場合は「sparse」アルゴリズムが使われ、 配置アルゴリズムはアイテムを配置する際にグリッド内で「前進」しかせず、 隙間を埋めるために後戻りすることはありません。 これにより自動配置アイテムが順番通りに現れることが保証されますが、 後で来たアイテムで埋められる隙間が残ることもあります。

注: 将来のこのモジュールのレベルでは 自動位置指定アイテムを1つの「標準」セルにまとめて流し込む値が追加される予定です。

自動配置はグリッドアイテムorder-modified document orderで処理します。

次の例では、3つの列それぞれが 内容に合わせて自動サイズになります。 行は明示的に定義されていません。 grid-auto-flow プロパティは row であり、 グリッドは最初の行から3つの列を順に検索し、次の行へ進み、 必要に応じて行を追加しながら自動配置されたグリッドアイテムの位置を決定します。
画像: 自動配置で並べられたフォーム。

自動配置で並べられたフォーム。

<style type="text/css">
form {
  display: grid;
  /* 3列を内容サイズで定義し、
     対応するラインに名前を付ける。 */
  grid-template-columns: [labels] auto [controls] auto [oversized] auto;
  grid-auto-flow: row dense;
}
form > label {
  /* すべてのlabelを"labels"列に配置し、
     次の空き行を自動で探す。 */
  grid-column: labels;
  grid-row: auto;
}
form > input, form > select {
  /* すべてのコントロールを"controls"列に配置し、
     次の空き行を自動で探す。 */
  grid-column: controls;
  grid-row: auto;
}

#department-block {
  /* このアイテムは"oversized"列の
     3行をまたぐ最初の行に自動配置される。
     ここで他の明示的配置アイテムや先に自動配置されたアイテムと
     重ならないようにする。 */
  grid-column: oversized;
  grid-row: span 3;
}

/* フォームのすべてのボタンを
   明示的定義グリッド領域に配置する。 */
#buttons {
  grid-row: auto;

  /* ボタン領域がインライン軸全体を
     グリッド要素上で跨ぐようにする。 */
  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-block">
    <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>

7.8. グリッド定義ショートハンド:grid プロパティ

名称: grid
値: <'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>
初期値: none
適用対象: グリッドコンテナ
継承: 個別プロパティ参照
パーセンテージ: 個別プロパティ参照
算出値: 個別プロパティ参照
アニメーションタイプ: 個別プロパティ参照
正規順序: 文法どおり

grid プロパティは ショートハンドであり、 明示的グリッドプロパティgrid-template-rowsgrid-template-columnsgrid-template-areas) と、暗黙グリッドプロパティgrid-auto-rowsgrid-auto-columnsgrid-auto-flow) を一括で設定できます。 (gutterプロパティはリセットされません。)

構文は grid-template に加えて、 オートフローグリッドを定義する追加構文があります:

<'grid-template'>
grid-template のロングハンドを grid-template同様に設定し、 grid-auto-* ロングハンドは初期値にリセットします。
<'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>?
[ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'>
オートフローを設定する際は、一方の軸のトラックは明示的に設定 (grid-template-rows または grid-template-columns を指定値に設定し、 他方は noneに設定)、 もう一方の軸のトラックはオートリピート指定 (grid-auto-rows または grid-auto-columns を指定値に設定し、 他方は autoに設定)。 grid-auto-flow も 指定に応じて row または columnに設定され、 dense指定時はそれも付与されます。

その他の grid サブプロパティは 初期値にリセットされます。

注: 1つの grid 宣言で 明示的または暗黙グリッドプロパティしか指定できません。 指定しなかったサブプロパティは通常のショートハンド通り初期値にリセットされます。

grid-template ショートハンド構文による 明示的グリッド 設定だけでなく、 grid ショートハンドはオートフォーマットグリッドのパラメータも簡単に設定可能です。 例えば、grid: auto-flow 1fr / 100px; は次と同等です:
grid-template: none / 100px;
grid-auto-flow: row;
grid-auto-rows: 1fr;
grid-auto-columns: auto;

同様に、grid: none / auto-flow 1fr は次と同じ意味です:

grid-template: none;
grid-auto-flow: column;
grid-auto-rows: auto;
grid-auto-columns: 1fr;

シリアライズ時、 すべての grid-auto-* ロングハンドが初期値の場合は grid-template 構文が使われます。

8. グリッドアイテムの配置

すべてのグリッドアイテムグリッド領域と結びついています。 これは、グリッドアイテムが占有する隣接するグリッドセルの矩形集合です。 このグリッド領域は、 グリッドアイテムの内で自己整列プロパティ (justify-self および align-self)によって 実際の位置が決まる「包含ブロック」となります。 グリッドアイテムが占有するセルは グリッドの行・列サイズにも影響し、 § 12 グリッドレイアウトアルゴリズムで定義されています。

グリッドアイテムグリッド領域グリッド内でどこにあるかは 配置により定義されます。 これはグリッド位置グリッドスパンから成ります:

グリッド位置
グリッドアイテムの 各軸でのグリッド内の場所。 グリッド位置確定(明示的指定) または 自動(自動配置による決定)のいずれかです。
グリッドスパン
グリッドアイテムが 各軸で占有するグリッドトラック数。 その軸のグリッドスパン暗黙明示自動 のいずれかです:

grid-placementプロパティ—​ロングハンド grid-row-startgrid-row-endgrid-column-startgrid-column-end、およびショートハンド grid-rowgrid-columngrid-area—​により、 作者はグリッドアイテム配置を 以下の6つの情報のいずれか(または全く指定しない)で指定できます:

開始 row-start line column-start line
終了 row-end line column-end line
スパン row span column span

ある次元で 開始終了スパン のいずれか2つに確定値があれば、 残りの1つも確定値となります。

8.1. グリッド配置の一般パターン

この節は参考情報です。

grid-placementプロパティのロングハンドは 3つのショートハンドにまとめられています:

grid-area
grid-column grid-row
grid-column-start grid-column-end grid-row-start grid-row-end

8.1.1. 名前付き領域

アイテムは、名前付きグリッド領域grid-template-areasのテンプレートで生成されるものなど)に 領域名をgrid-areaで指定することで配置できます:

article {
  grid-area: main;
  /* アイテムを名前付き領域 "main" に配置 */
}

アイテムは名前付きグリッド領域部分的に揃えることもでき、 他の端は他のラインに揃えることもできます:

.one {
  grid-row-start: main;
  /* "main"という名前付き領域の先頭端に行開始端を揃える */
}

8.1.2. 数値インデックスとスパン

グリッドアイテムは番号で配置やサイズ指定ができ、 スクリプト駆動のレイアウトなどに特に便利です:

.two {
  grid-row: 2;    /* アイテムを2行目に配置 */
  grid-column: 3; /* アイテムを3列目に配置 */
  /* grid-area: 2 / 3; と同等 */
}

デフォルトではグリッドアイテムのスパンは1です。 異なるスパンは明示的に指定できます:

.three {
  grid-row: 2 / span 5;
  /* 2行目から始まり、下方向に5行(7行目まで)をスパン */
}

.four {
  grid-row: span 5 / 7;
  /* 7行目で終了し、上方向に5行(2行目から開始)をスパン */
}

注: グリッドインデックスは書字モードに依存します。 例えば、アラビア語のような右から左の言語では、最初の列は右端の列となります。

8.1.3. 名前付きラインとスパン

番号でラインを数える代わりに、 ライン名で参照できます:

.five {
  grid-column: first / middle;
  /* "first"ラインから"middle"ラインまでスパン */
}

注: 名前付きグリッド領域ライン名と同じ名前の場合、 配置アルゴリズムは名前付きグリッド領域のラインを優先して使います。

同名のラインが複数ある場合、 実質的に名前付きグリッドラインの集合を形成し、 配置で名前でフィルタすることでインデックス指定できます:

.six {
  grid-row: text 5 / text 7;
  /* "text"という名前の5番目と7番目のラインの間をスパン */
  grid-row: text 5 / span text 2;
  /* 上記と同じ - "text"の5番目から2つ分スパンし、7番目まで */
}

8.1.4. 自動配置

グリッドアイテムは 次の空いているグリッドセルに自動的に配置され、 もし空きがなければグリッドが拡張されます。

.eight {
  grid-area: auto; /* 初期値 */
}

これは例えば、カタログサイトで複数のセール品を グリッドパターンで一覧表示するのに使えます。

自動配置は、アイテムが複数セルを占有したい場合に 明示的なスパンと組み合わせて使えます:

.nine {
  grid-area: span 2 / span 3;
  /* 2行3列分をカバーする自動配置アイテム */
}

自動配置アルゴリズムが 行を探索して追加するか、列を探索して追加するかは grid-auto-flowプロパティで制御します。

注: デフォルトでは 自動配置アルゴリズムは グリッドを線形に順次探索し、後戻りはしません。 より大きなアイテムを配置するために空きスペースを飛ばした場合、 そのスペースに戻って埋めることはありません。 この挙動を変えるには、denseキーワードをgrid-auto-flowで指定してください。

8.2. グリッドアイテムの配置とソース順

「大きな力には大きな責任が伴う」

grid-placementプロパティの能力により、 コンテンツはグリッド内で自由に配置・並び替えでき、 視覚的な表示が文書のソース順と大きく乖離することも可能です。 これによって、作者は様々なデバイスや表示モード (例:メディアクエリを使用)に合わせて レンダリングを柔軟に調整できます。 ただし正しいソース順の代わりにはなりません

正しいソース順は音声、 シーケンシャルナビゲーション(キーボード操作など)、 検索エンジンや触覚ブラウザなどCSS以外のUAにも重要です。 グリッド配置は視覚的な表示だけに影響します! これにより作者は、非CSS/非視覚的なインタラクションモード用に 文書ソースを最適化しつつ、 グリッド配置技法で視覚表示のみを調整し、 ソース順をそのまま維持できます。

8.3. ラインベース配置:grid-row-startgrid-column-startgrid-row-endgrid-column-endプロパティ

名称: grid-row-start, grid-column-start, grid-row-end, grid-column-end
値: <grid-line>
初期値: auto
適用対象: グリッドアイテムおよび 包含ブロックがグリッドコンテナの絶対配置ボックス
継承: no
パーセンテージ: 該当なし
算出値: 指定キーワード・識別子・整数
正規順序: 文法どおり
アニメーションタイプ: 離散
<grid-line> =
  auto |
  <custom-ident> |
  [ [ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>? ] |
  [ span && [ <integer [1,∞]> || <custom-ident> ] ]

grid-row-startgrid-column-startgrid-row-endgrid-column-endプロパティは、 グリッド内で グリッドアイテムのサイズと位置を決定します。 これは、ライン・スパン・何も指定しない(自動)のいずれかを グリッド配置に寄与することで、 インライン開始ブロック開始インライン終了ブロック終了 の各端をグリッド領域で指定することになります。

値の意味は以下の通りです:

<custom-ident>
まずグリッド領域の端を 名前付きグリッド領域に一致させようとします: グリッドラインライン名<custom-ident>-startgrid-*-startの場合)/ <custom-ident>-endgrid-*-endの場合)がある場合、 最初のそのラインをグリッドアイテム配置に使います。

注: 名前付きグリッド領域は この形式の暗黙的割り当てライン名を自動生成するため、 grid-row-start: fooで その名前付きグリッド領域の開始端を選択できます(ただし foo-start という名前のラインが明示的に前に指定されていればそれが使われます)。

それ以外は、整数1<custom-ident>とともに指定したかのように扱います。

[ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>?
N番目のグリッドライングリッドアイテム配置に使います。 負の整数の場合は、明示的グリッドの終端から逆方向で数えます。

名前が<custom-ident>として指定された場合、 その名前を持つラインのみ数えます。 その名前のラインが十分ない場合、 位置決定のためにすべての暗黙グリッドラインが その名前を持つものとして扱われます。

<integer> にゼロを指定すると宣言は無効です。

span && [ <integer [1,∞]> || <custom-ident> ]
Nライン分グリッドアイテムグリッド領域の対応する端が 反対側の端からグリッドスパンとして 数えられるようにします。 例:grid-column-end: span 2grid-column-startラインから2ライン分 終端方向に進んだラインを意味します。

名前が<custom-ident>として指定された場合、 その名前を持つラインのみ数えます。 その名前のラインが十分ない場合、 カウント対象の方向側の明示的グリッド端にある すべての暗黙グリッドラインが その名前を持つものとして扱われます。

次の宣言があるとします:
.grid { grid-template-columns: 100px; }
.griditem { grid-column: span foo / 4; }

グリッドコンテナは 2つのグリッドライン(1と2)を持つ明示的グリッドです。 グリッドアイテムの column-end端は4番ラインで指定されているため、 暗黙グリッドの終端側に 2つのラインが生成されます。

そのcolumn-start端は、そこから始端方向に見つけられる最初の "foo" ラインでなければなりません。 グリッド内に "foo" ラインはないので、 候補は暗黙グリッド内のラインだけです。 3番ラインは明示的グリッドの終端側なので候補にならず、 span指定は始端方向に検索するため、 暗黙グリッドが明示的グリッドの始端側にラインを生成するしかありません。

結果の図解。

<integer> を省略した場合、デフォルトは1です。 負の整数やゼロは無効です。

auto
プロパティはグリッドアイテム配置に何も寄与しません。 これは自動配置や デフォルトのスパン1を示します。 (詳細は上記§ 8 グリッドアイテムの配置を参照。)

上記のすべての生成規則では、 <custom-ident>は キーワードspanautoを除外します。

1行8列のグリッドと次の9個の名前付きラインがある場合:
1  2  3  4  5  6  7  8  9
+--+--+--+--+--+--+--+--+
|  |  |  |  |  |  |  |  |
A  B  C  A  B  C  A  B  C
|  |  |  |  |  |  |  |  |
+--+--+--+--+--+--+--+--+

以下の宣言は、インデックスで示したライン間にグリッドアイテムを配置します:

grid-column-start: 4; grid-column-end: auto;
/* 4番ラインから5番ライン */

grid-column-start: auto; grid-column-end: 6;
/* 5番ラインから6番ライン */

grid-column-start: C; grid-column-end: C -1;
/* 3番ラインから9番ライン */

grid-column-start: C; grid-column-end: span C;
/* 3番ラインから6番ライン */

grid-column-start: span C; grid-column-end: C -1;
/* 6番ラインから9番ライン */

grid-column-start: span C; grid-column-end: span C;
/* エラー: 終端スパンは無視され、自動配置アイテムは名前付きラインまでスパンできない。
   ''grid-column: span 1;'' と同等。 */

grid-column-start: 5; grid-column-end: C -1;
/* 5番ラインから9番ライン */

grid-column-start: 5; grid-column-end: span C;
/* 5番ラインから6番ライン */

grid-column-start: 8; grid-column-end: 8;
/* エラー: 8番ラインから9番ライン */

grid-column-start: B 2; grid-column-end: span 1;
/* 5番ラインから6番ライン */

8.3.1. グリッド配置の衝突処理

配置に2つのラインが含まれ、 グリッドアイテム開始ラインが 終了ラインよりも 終端側にある場合は、2つのラインを入れ替えます。 開始ラインが終了ラインと等しい場合は、 終了ラインを削除します。

配置に2つのスパンが含まれる場合、 終了側のgrid-placementプロパティによって与えられたスパンを削除します。

配置に名前付きラインのスパンのみ含まれる場合は、 スパン1に置き換えます。

8.4. 配置ショートハンド:grid-columngrid-rowgrid-areaプロパティ

名称: grid-row, grid-column
値: <grid-line> [ / <grid-line> ]?
初期値: auto
適用対象: グリッドアイテムおよび 包含ブロックがグリッドコンテナの絶対配置ボックス
継承: no
パーセンテージ: 該当なし
算出値: 個々のプロパティ参照
アニメーションタイプ: 離散
正規順序: 文法どおり

grid-rowおよびgrid-columnプロパティは それぞれgrid-row-start/grid-row-endgrid-column-start/grid-column-endの ショートハンドです。

2つの<grid-line>値が指定された場合、 grid-row-startgrid-column-startロングハンドが スラッシュ前の値に設定され、 grid-row-endgrid-column-endロングハンドが スラッシュ後の値に設定されます。

2番目の値が省略された場合、 1番目の値が<custom-ident>の場合は、 grid-row-endgrid-column-endロングハンドも その<custom-ident>に設定されます。 そうでなければ、autoになります。

名称: grid-area
値: <grid-line> [ / <grid-line> ]{0,3}
初期値: auto
適用対象: グリッドアイテムおよび 包含ブロックがグリッドコンテナの絶対配置ボックス
継承: no
パーセンテージ: 該当なし
算出値: 個々のプロパティ参照
アニメーションタイプ: 離散
正規順序: 文法どおり

grid-areaプロパティは ショートハンドであり、 grid-row-startgrid-column-startgrid-row-endgrid-column-end をまとめて設定します。

4つの<grid-line>値が指定された場合、 grid-row-startは1番目、 grid-column-startは2番目、 grid-row-endは3番目、 grid-column-endは4番目の値に設定されます。

grid-column-endが省略された場合、 grid-column-start<custom-ident>の場合は grid-column-endもその<custom-ident>に設定されます。 そうでなければautoになります。

grid-row-endが省略された場合、 grid-row-start<custom-ident>の場合、 grid-row-endもその<custom-ident>に設定されます。 そうでなければautoになります。

grid-column-startが省略された場合、 grid-row-start<custom-ident>の場合は、 4つのロングハンドすべてがその値に設定されます。 そうでなければautoになります。

注: このショートハンドの解決順序は row-start/column-start/row-end/column-endで、 LTRページではCCWとなり、 marginなど物理方向を使う4辺プロパティとは逆方向です。

8.5. グリッドアイテム配置アルゴリズム

次のグリッドアイテム配置アルゴリズムは、 自動位置指定された グリッドアイテム確定位置に解決し、 すべてのグリッドアイテムが レイアウトされるグリッド領域を明確に持つことを保証します。 (グリッドスパンは特別な解決不要で、 明示されていなければ1です。)

注: このアルゴリズムにより 暗黙グリッドに 新しい行や列が作成されることがあります。 これは明示的グリッドに 自動位置指定グリッドアイテムを 配置するスペースがない場合です。

すべてのグリッドセル明示的暗黙グリッド両方)は 占有済み未占有のいずれかです。 セルがグリッド領域グリッドアイテム確定位置)によって カバーされていれば占有済みです。 そうでなければ未占有です。 セルの占有済み/未占有状態は このアルゴリズム中に変化し得ます。

分かりやすさのため、 このアルゴリズムはgrid-auto-flowrow指定されている前提で書かれています。 columnの場合は、 このアルゴリズム中の行・列・インライン・ブロックなどの記述を入れ替えてください。

注: 自動配置アルゴリズムグリッドアイテムorder-modified document orderで処理します。 元の文書順ではありません。

  1. 匿名グリッドアイテムの生成§ 6 グリッドアイテム参照)。 匿名グリッドアイテムは常に自動配置され、 それらのボックスにはgrid-placementプロパティは指定できません。

  2. 自動位置指定でないものを配置する。

  3. 特定行にロックされたアイテムを処理する。

    確定行位置を持つ 各グリッドアイテムgrid-row-startgrid-row-endプロパティで 確定行位置を定義)について、 order-modified document orderで処理:

    “sparse”パッキング(デフォルト挙動)

    その配置のcolumn-startラインを、 このアイテムのグリッド領域が 他の占有済みセルを重複せず、 かつこのステップで既にこの行に配置済みアイテムの後になる最初(最小正インデックス)のラインに設定します。

    “dense”パッキング(dense指定時)

    その配置のcolumn-startラインを、 このアイテムのグリッド領域が 他の占有済みセルを重複しない 最初(最小正インデックス)のラインに設定します。

  4. 暗黙グリッド内の列を決定する。

    暗黙グリッドの列を生成:

    1. 明示的グリッドの列から開始。

    2. 確定列位置を持つ (明示的配置アイテム、前ステップで配置済みアイテム、まだ配置されていないが確定列を持つアイテム) すべてについて、必要に応じて暗黙グリッドの先頭・末尾に列を追加。

    3. 確定列位置を持たないすべてのアイテムの 最大列スパン暗黙グリッドの幅より大きければ、 その列スパンに合わせて 暗黙グリッド末尾に列を追加。

    次のスタイル断片の場合:
    #grid {
      display: grid;
      grid-template-columns: repeat(5, 100px);
      grid-auto-flow: row;
    }
    #grid-item {
      grid-column: 4 / span 3;
    }
    

    必要な列数は6です。 明示的グリッドは 5列(grid-template-columnsから) ライン番号1~6ですが、 #grid-itemのcolumn位置はライン7で終わるため、 暗黙グリッド末尾に 追加列が必要となります。

  5. 残りのグリッドアイテムを配置する。

    自動配置カーソルは現在のグリッド「挿入点」を定義し、 行・列グリッドラインのペアとして指定します。 初期値はカーソル暗黙グリッドの最先頭行・列です。

    使われているgrid-auto-flow値によって アイテムの配置方法が決まります:

    “sparse”パッキング(デフォルト挙動)

    前のステップで配置されていない各グリッドアイテムについて、 order-modified document orderで:

    アイテムが確定列位置を持つ場合:
    1. カーソルの列位置を アイテムのcolumn-startラインに設定。 これが前回のカーソル列位置より小さければ、行位置を1増やす。

    2. カーソルの行位置を アイテムの占有済みセルと重複しなくなるまで増やす (必要に応じて暗黙グリッドに新しい行を作成)。

    3. アイテムのrow-startラインをカーソルの行位置に設定し、 スパンに従ってrow-endラインも設定。

    アイテムが両軸とも自動位置指定の場合:
    1. 自動配置カーソルの列位置を、 アイテムのグリッド領域が 他の占有済みセルと重複しなくなるまで、 またはカーソル列位置+アイテムの列スパンが アルゴリズムで決定された暗黙グリッドの列数をはみ出すまで増やす。

    2. 前ステップで重複しない位置が見つかった場合は、 アイテムのrow-start/column-startラインをカーソル位置に設定。 そうでなければ、自動配置カーソルの行位置を増やし (必要なら暗黙グリッドに新しい行を作成)、 列位置を暗黙グリッドの最先頭列にリセットし、前ステップに戻る。

    “dense”パッキング(dense指定時)

    前のステップで配置されていない各グリッドアイテムについて、 order-modified document orderで:

    アイテムが確定列位置を持つ場合:
    1. カーソルの行位置を暗黙グリッドの最先頭行に設定し、 列位置をアイテムのcolumn-startラインに設定。

    2. 自動配置カーソルの行位置を アイテムが他の占有済みセルと重複しない値まで増やす (必要に応じて暗黙グリッドに新しい行を作成)。

    3. アイテムのrow-startラインインデックスをカーソルの行位置に設定 (暗黙的にrow-endもスパンで設定)。

    アイテムが両軸とも自動位置指定の場合:
    1. カーソルの行・列位置を暗黙グリッドの最先頭行・列に設定。

    2. 自動配置カーソルの列位置を、 アイテムが他の占有済みセルと重複しなくなるまで またはカーソル列位置+アイテムの列スパンが暗黙グリッドの列数をはみ出すまで増やす。

    3. 前ステップで重複しない位置が見つかった場合は、 アイテムのrow-start/column-startラインをカーソル位置に設定。 そうでなければ、自動配置カーソルの行位置を増やし (必要なら暗黙グリッドに新しい行を作成)、 列位置を暗黙グリッドの最先頭列にリセットし、前ステップに戻る。

9. サブグリッド

サブグリッドは通常のグリッドコンテナとほぼ同じように動作しますが、以下の点が異なります:

10. 絶対位置指定

10.1. グリッドコンテナを包含ブロックとする場合

絶対位置指定要素の包含ブロックグリッドコンテナによって生成される場合、 包含ブロックはそのgrid-placementプロパティで決定されるグリッド領域に対応します。 オフセットプロパティ(top/right/bottom/left) は、通常通りこの包含ブロックの対応する端から内側へのオフセットを示します。

注: 絶対位置指定要素をグリッドコンテナに絶対配置することで そのコンテナのグリッドラインに揃えることはできますが、 その要素はグリッドのレイアウトにスペースを取ったり参加したりしません。

.grid {
  grid: 1fr 1fr 1fr 1fr / 10rem 10rem 10rem 10rem;
  /* グリッドコンテナを縦に均等な4行、
     横に各10remの4列で構成 */
  justify-content: center;
  /* グリッドをグリッドコンテナ内で中央揃え */
  position: relative;
  /* abspos用包含ブロックを確立 */
}

.abspos {
  grid-row-start: 1;     /* 1番目のグリッド行ライン=グリッドコンテナの上端 */
  grid-row-end: span 2;  /* 3番目のグリッド行ライン */
  grid-column-start: 3;  /* 3番目のグリッド列ライン */
  grid-column-end: auto; /* 右パディング端 */
  /* 包含ブロックはグリッドコンテナの右上象限をカバー */

  position: absolute;
  top: 70px;
  bottom: 40px;
  left: 100px;
  right: 30px;
}

注: グリッドやgrid-placementプロパティフロー相対ですが、 オフセットプロパティ(left, right, top, bottom)は 物理的な方向です。 そのため、directionwriting-modeプロパティが変わると グリッドはそれに合わせて変形しますが、オフセットは変わりません。

自動配置ではなく、auto値がgrid-placementプロパティに指定されると、 その軸の対応するパディング端の位置に特別なラインを配置へ寄与します(スクロールエリアのパディング端、グリッドコンテナがオーバーフローする場合)。 これらのラインは、絶対配置アイテムの位置決定に使われる拡張グリッドの最初と最後(0番目と-0番目)のラインとなります。

注: デフォルトでは、絶対位置指定ボックスの包含ブロックグリッドコンテナのパディング端に対応します。 これはブロックコンテナと同様です。

絶対位置指定はグリッドとそのフロー内コンテンツのレイアウト後に行われ、 どのグリッドトラックのサイズにも寄与せず、 グリッドのサイズや構成には一切影響しません。 grid-placementプロパティが 存在しないラインを明示的に指定したり、既存の暗黙グリッドの外側までスパンした場合は、 新しい暗黙グリッドラインを作成せず、自動のauto扱いとなります。

注: 暗黙ラインはすべてのライン名を持つものとみなすため、 参照されたラインが明示名されていなくても存在する場合があります。

配置グリッドスパンのみの場合は、 その軸の2つのautoラインに置き換えます。 (これは両方のgrid-placementプロパティが元々スパンを寄与し、 § 8.3.1 グリッド配置の衝突処理で2番目のスパンが無視された場合に起こります。)

10.2. グリッドコンテナを親とする場合

グリッドコンテナの絶対配置子要素はフロー外であり、 グリッドアイテムではありません。 したがって他のアイテムの配置やグリッドサイズに影響しません。

静的位置は グリッドコンテナの絶対配置子要素が、 そのグリッドコンテナの内容端と一致するグリッド領域に唯一のグリッドアイテムとして配置されるかのように決定されます。 [CSS2]

注: この位置は、子要素のjustify-selfalign-self の値に影響されます。 また、他の多くのレイアウトモデル同様、 絶対配置子要素は包含ブロックのサイズや内容のレイアウトに一切影響しません。

11. アライメントとスペーシング

グリッドコンテナのグリッドトラックのサイズが決定し、 すべてのグリッドアイテムの寸法が確定した後、 グリッドアイテムは自身のグリッド領域内でアライメントできます。

注: サブグリッドのグリッドアイテムも、 親グリッドのアイテムと共に ベースラインアライメントを含めてアライメントに参加します。 サブグリッド (h)参照。

marginプロパティで、 ブロックレイアウトのmargin同様にアイテムのアライメントが可能です。 グリッドアイテムは、 ボックスアライメントプロパティCSS Box Alignment Module [CSS-ALIGN-3])にも従い、 行・列の両方でキーワードベースの簡単なアライメントが可能です。

デフォルトではグリッドアイテムは 自身のグリッド領域いっぱいに伸縮します。 ただし、justify-selfalign-selfstretch以外、またはmarginがautoの場合は、 グリッドアイテムは内容に合わせて自動サイズされます。

11.1. ガター:row-gapcolumn-gapgap プロパティ

row-gapcolumn-gap (およびgapショートハンド)は、 グリッドコンテナで指定すると ガターグリッド行グリッド列の間に定義します。 構文はCSS Box Alignment 3 § 8 ボックス間ギャップで定義されています。

これらのプロパティの効果は、 対象となるグリッドラインが太さを持つかのようになり、 2つのグリッドライン間のグリッドトラックは それらを表すガター間のスペースとなります。 トラックサイズ計算の目的では 各ガターは指定サイズの空の固定トラックとして扱われ、 それに跨るグリッドアイテムは 対応するグリッドラインを跨いでいることになります。

注: justify-contentalign-contentによって トラック間に追加スペースが加わることがあります。 § 12.1 グリッドサイズアルゴリズム参照。 このスペースも実質的にはガターサイズを増加させます。

グリッドトラック間で分割される場合、 そのトラック間のガタースペースは抑制されます。 ガターは強制改ページ後でも抑制されます(marginとは異なる)。

ガターグリッドのトラック間だけに現れます。 最初のトラックの前や最後のトラックの後にはガターはありません。 (特に、暗黙グリッドの最初・最後のトラックと 拡張グリッドの "auto" ラインの間にもガターはありません。)

折りたたみトラックのガターが折りたたまれる場合、 2つのガターが完全に重なり、端が一致します。 折りたたみトラックの片側にガターがない場合 (例えば暗黙グリッドの最初や最後のトラック)、 ガター折りたたみの結果、両「側」にガターはありません。

11.2. auto マージンでのアライメント

グリッドアイテムのautomarginは、 ブロックレイアウトのauto marginと非常によく似た効果を持ちます:

11.3. インライン軸アライメント:justify-selfjustify-itemsプロパティ

グリッドアイテムはインライン次元で、 グリッドアイテムjustify-selfプロパティや、 グリッドコンテナjustify-itemsプロパティでアライメントできます([CSS-ALIGN-3]参照)。

例えば英語文書では、 インライン軸は水平であり、 justify-*プロパティはグリッドアイテムを水平に揃えます。

サイズがその軸の本質サイズトラックに依存するグリッドアイテムで、 ベースラインアライメントが指定された場合、 (サイズがアイテムの大きさとベースラインアライメントに依存し循環依存となり)、 そのアイテムはベースラインアライメントに参加せず、 フォールバックアライメントが最初から指定されていたかのように使われます。 このため、<flex>トラックサイズは、 グリッドコンテナが該当軸で 未確定サイズの場合「本質サイズ」とみなします。

注: フォールバックアライメントが使われるかどうかは レイアウト中で変化しません。 循環依存があれば常に使われます。

11.4. ブロック軸アライメント:align-selfalign-itemsプロパティ

グリッドアイテムはブロック次元(インライン軸と直交する軸)でも、 グリッドアイテムalign-selfプロパティや、 グリッドコンテナalign-itemsプロパティでアライメントできます([CSS-ALIGN-3]参照)。

サイズがその軸の本質サイズトラックに依存するグリッドアイテムで、 ベースラインアライメントが指定された場合、 (サイズがアイテムの大きさとベースラインアライメントに依存し循環依存となり)、 そのアイテムはベースラインアライメントに参加せず、 フォールバックアライメントが最初から指定されていたかのように使われます。 このため、<flex>トラックサイズは、 グリッドコンテナが該当軸で 未確定サイズの場合「本質サイズ」とみなします。

11.5. グリッド自体のアライメント:justify-contentalign-contentプロパティ

グリッドの外端がグリッドコンテナの内容端と一致しない場合 (例:flexサイズ列がない場合)、 グリッドトラックグリッドコンテナの内容ボックス内で justify-contentalign-contentプロパティに従って揃えられます。

例えば、次のグリッドは垂直方向に中央揃え、 右端にグリッドコンテナの右端に揃えられます:
.grid {
  display: grid;
  grid: 12rem 12rem 12rem 12rem / 10rem 10rem 10rem 10rem;
  justify-content: end;
  align-content: center;
  min-height: 60rem;
}

もしグリッドトラックが存在しない場合(明示的グリッドが空で、暗黙グリッドでもトラックが作られていない場合)、 各軸の唯一のグリッドライングリッドコンテナの開始端に揃えられます。

また、justify-contentalign-contentの特定の値は、トラック同士の間隔を広げたり (space-aroundspace-betweenspace-evenly) サイズ変更を行ったり(stretch)することがあります。 グリッドがトラック間で分割されている場合、 そのトラック間の追加スペースは抑制されなければなりません。

例えば、次のグリッドでは、 スパンするアイテムのグリッド領域がアライメントによって割り当てられた余分なガター分のスペースを含むように拡大されています:
.wrapper {
  display: grid;
  /* 3行4列のグリッドコンテナ */
  grid: repeat(3, auto) / repeat(4, auto);
  gap: 10px;
  align-content: space-around;
  justify-content: space-between;
}

.item1 { grid-column: 1 / 5; }
.item2 { grid-column: 1 / 3; grid-row: 2 / 4; }
.item3 { grid-column: 3 / 5; }
/* 残り2つのアイテムは最後の2つのグリッドセルに自動配置される */
Grid with 10px gap and an element spanning all columns.
			          The sum of the columns is less than the width of the grid container.
アライメント前のグリッド
Same grid with increased gaps absorbing the excess grid container width.
			          The spanning element has grown to accommodate the extra space assigned to the gap it crosses.
アライメント後のグリッド

アライメント(gapスペースとは異なり)は グリッドトラックのサイズ決定後に行われるため、 スパンするアイテムの内容によってトラックサイズが決まる場合、 アライメント段階で余分なスペースが割り当てられ アライメントスペースを吸収します。

11.6. グリッドコンテナのベースライン

グリッドコンテナの最初(最後)のベースラインは以下のように決定されます:

  1. グリッドコンテナで少なくとも1つのグリッドアイテムを含む最初(最後)の行を探します。

    この行と交差するグリッドアイテムのいずれかが その行でベースラインアライメントに参加している場合、 グリッドコンテナのベースライン集合は それらのグリッドアイテムの共有アライメントベースラインから生成されます。

    そうでない場合、 グリッドコンテナの最初(最後)のベースライン集合は 行メジャーグリッド順序グリッドコンテナの書字モードによる)で 最初(最後)のグリッドアイテムアライメントベースラインから生成されます。 そのグリッドアイテムがグリッドのインライン軸に アライメントベースラインを持たない場合は、 まずボーダー端から合成されます。

  2. グリッドコンテナグリッドアイテムが1つも含まれない場合、 グリッドコンテナは最初(最後)のベースライン集合を持たず、 必要であればアライメントコンテキストのルールに従って 合成されます。 このアルゴリズムを終了します。

グリッド修正文書順序(グリッド順序)は、 グリッドのグリッドセルを走査する際に グリッドアイテムが遭遇される順序です。 同時に複数アイテムが見つかる場合は、 order-modified document orderで扱います。

上記ルールでベースライン計算する際、 ベースラインに寄与するボックスが スクロール可能なoverflow値の場合は、 ベースライン決定の目的ではそのボックスは初期スクロール位置にあるものとして扱います。

表セルのベースライン決定時は、 グリッドコンテナは行ボックスやtable-rowと同じようにベースラインを提供します。[CSS2]

ベースラインについてさらに詳しくは CSS Writing Modes 3 § 4.1 ベースライン入門CSS Box Alignment 3 § 9 ベースラインアライメント詳細を参照してください。

12. グリッドレイアウトアルゴリズム

この節ではグリッドレイアウトアルゴリズムを定義します。 グリッドコンテナのサイズ決定、 すべてのグリッドトラックのサイズ・位置決定、 そして配置済みグリッド領域へのグリッドアイテムのレイアウトを行います。

  1. すべてのグリッドアイテムサブグリッドおよびそのサブアイテム含む)の配置を解決するため グリッドアイテム配置アルゴリズムを実行します。

  2. § 5.2 グリッドコンテナのサイズ決定に従い グリッドコンテナのサイズを決定します。

    注: このフェーズでは トラックサイズ内の循環する<percentage>autoとして扱います。

  3. 得られたグリッドコンテナサイズに対し、 グリッドサイズ決定アルゴリズムを実行して グリッドのサイズ決定を行います。

    注: このフェーズでは トラックサイズ内の<percentage>グリッドコンテナサイズに対して解決されます。

  4. グリッド領域の幅・高さはこの目的には確定とみなして、 グリッドアイテムをそれぞれの包含ブロックにレイアウトします。

    注: 確定サイズのみで計算された式 (stretch fit式など)も確定となるため、 ストレッチされたグリッドアイテムのサイズも確定とみなされます。

12.1. グリッドサイズ決定アルゴリズム

この節ではグリッドサイズ決定アルゴリズムを定義します。 すべてのグリッドトラックのサイズ、 ひいてはグリッド全体のサイズを決定します。

各トラックは、指定された最小最大 サイズ指定関数(同じ場合もある)を持ちます。 各サイズ指定関数は、次のいずれかです:

グリッドサイズ決定アルゴリズムは、 これらのサイズ制約を使用トラックサイズに解決する方法を定義します。

  1. まずトラックサイズ決定アルゴリズムグリッド列のサイズを決定します。

    この過程で、グリッドコンテナインライン軸でサブグリッド化された グリッドアイテムは空として扱い、 そのグリッドアイテム(孫)はグリッドコンテナ(祖父)の 直接の子として扱われます(再帰的に内省)。

    サブグリッド化がブロック軸のみの場合や、 グリッドコンテナのインライン軸サイズが内容サイズ依存の場合も内省します。 この次元でのサイズが他方のサブグリッドトラックサイズ依存となりうるため、 そのようなアイテムがこのグリッドの列サイズ決定に寄与するサイズは、 グリッドサイズ決定アルゴリズムの同じ段階までしか決定されていないものとして扱います。 例:このステップの最初のパスではそのアイテムのトラックはこの最初のステップまでしかサイズされていません。 2回目のパスではステップ1-3の初回とステップ2回目まで終えてからサイズを返します。 この内省も再帰的に行います。

    このステップでグリッドアイテムのレイアウト計算が 利用可能スペースブロック軸)に依存する場合は、 トラックサイズ決定に参加する行のうち確定最大トラックサイズ関数を持つものはそのサイズ、他は無限大と仮定します。 グリッドコンテナおよびすべてのトラックが確定サイズなら align-contentも適用し そのアイテムがまたぐギャップの最終有効サイズも考慮します。 そうでなければこの見積もりではトラックアライメント効果は無視します。

  2. 次にトラックサイズ決定アルゴリズムグリッド行のサイズを決定します。

    この過程で、グリッドコンテナブロック軸でサブグリッド化された グリッドアイテムは空として扱い、 そのグリッドアイテム(孫)はグリッドコンテナ(祖父)の 直接の子として扱われます(再帰的に内省)。

    列サイズ決定と同様に、 サブグリッド化がインライン軸のみの場合や、 グリッドコンテナのブロック軸サイズが内容サイズ依存の場合も内省します。 (列サイズ決定と同じく、 このグリッドの行サイズ決定に寄与するサイズも アルゴリズムのこの段階までしか決定されていないものとして扱い、再帰的に内省します。)

    ブロック軸サイズ寄与に利用可能スペースが必要なアイテムには 前ステップで算出したグリッド列サイズを使います。 グリッドコンテナのインラインサイズ確定なら justify-contentも適用し 有効な列ギャップサイズも考慮します。

  3. その後、いずれかのグリッドアイテムのmin-content寄与が ステップ2で算出された行サイズ・アライメントにより変化した場合は、 新しいmin-contentおよびmax-content寄与グリッド列サイズを再解決します(1回のみ)。

    インライン軸サイズ寄与に利用可能スペースが必要なアイテムには 前ステップで算出したグリッド行サイズを使います。 グリッドコンテナのブロックサイズ確定なら align-contentも適用し 有効な行ギャップサイズも考慮します。

    この繰り返しは、グリッドアイテムのインラインサイズグリッド領域のブロックサイズ依存の場合に必要です。 例:折り返し列flexコンテナflex-flow: column wrap)、直交フローwriting-mode)、マルチカラムコンテナ、 および行サイズ依存のaspect-ratio(または子要素にaspect ratioがある場合)など。
  4. 続いて、いずれかのグリッドアイテムのmin-content寄与が ステップ3で算出された列サイズ・アライメントにより変化した場合は、 新しいmin-contentおよびmax-content寄与グリッド行サイズを再解決します(1回のみ)。

    ブロック軸サイズ寄与に利用可能スペースが必要なアイテムには 前ステップで算出したグリッド列サイズを使います。 グリッドコンテナのインラインサイズ確定なら justify-contentも適用し 有効な列ギャップサイズも考慮します。

  5. 最後に、グリッドコンテナ内で align-contentおよびjustify-contentプロパティに従ってトラックをアライメントします。

    注: この処理でトラック間に追加のスペースが生じ、 トラックサイズ計算段階で割り当てられた以上にギャップをまたぐグリッドアイテムのグリッド領域が拡大する場合があります。

注: サブグリッド化された次元でのトラックサイズ決定は、 その軸の各トラック内のアイテムを 親グリッドのメンバーとして扱います。 このインターレースのため、グリッドサイズ決定は 各軸ごとにサブグリッドに掘り下げる必要があり、 両軸を再帰的に完了させるのではありません。 つまり、サブグリッド直交フローを作る場合、 トラックサイズ決定の順序が入れ子グリッドと逆になります。

以下は軸ごとのサブグリッドサイズ決定の例です:

親グリッドコンテナAがあり、その中にサブグリッド化列を持つBと その孫でサブグリッド化行のC、単なる入れ子グリッドの孫Dがあるとします。

<grid-A>
  <grid-B subgrid=columns>
    <grid-C subgrid=rows></grid-C>
    <grid-D></grid-D>
  </grid-B>
<grid-A>

Aが列サイズ決定時は BのアイテムをAの対応する列にスロットしますが、 行サイズ決定時はBを単一アイテム(自身の行とアイテムを持つグリッドコンテナ)として扱います。 Bが行サイズ決定時はCのアイテムをBの行にスロットし、 列サイズ決定時はCDを単一アイテムとして扱います。 Cの行は入れ子であり、Aの行とは関係ありません。

アルゴリズムの大まかな流れ:

  1. 列サイズ決定
  2. 行サイズ決定
  3. 列サイズ調整(行サイズの確定後必要なら)

この例でのグリッドサイズ決定アルゴリズム:

  1. Aのグリッド列サイズ決定: Aのグリッドアイテムのサイズを使い、 Bは空として扱い、 Bの子(CD含む)は Aのアイテムとして扱う。

    グリッドアルゴリズムはDには単純に再帰します。 Cには次のような手順:

    1. Cの列サイズ決定
    2. Cの行サイズ決定(Bの行サイズ決定により)
    3. Cの列サイズ調整
    4. Cの最終列サイズ返却

    Bの行サイズの正しい決定にはCの最終列サイズが必要であり、 行サイズが列サイズ依存なのでBの行サイズはCの最終列サイズに依存します。 この循環依存を断ち切るため、 Cの最終列サイズの初期近似値を使い、 Aの初期列サイズ決定に渡し、後で調整パスを行います。 よってCは列サイズ決定だけ再帰し、 その初期サイズをAに初期列サイズ決定用に渡します。

    後でBの行サイズ決定時に Cの行サイズ(サブグリッド化)が決定し、 Cの列サイズが最終化されます。 変化があればAの列サイズ調整パスでBの列サイズ調整パスも呼び出します。

  2. 次にAの行サイズ決定: Aのグリッドアイテムのサイズを使い、 Bは単一アイテムとして扱う。

    Bはサブグリッドなのでサイズ決定は複数パスに分かれ、 グリッドアルゴリズムはBには行サイズ決定だけ再帰的に呼び出します: Bの行サイズ決定(Dは単一アイテムとして最終サイズを要求)、 Cは空アイテムとして扱いその子をBのアイテムに昇格。

    Bは最終行サイズを返し、それがAの行サイズ決定パスに反映されます。

  3. 最後にAの列サイズ最終化。 Cの最終サイズがBの行サイズ決定パスで変化した場合、 Bの列サイズ再決定、さらにAの列サイズ調整パスを引き起こします。

12.2. トラックサイズ用語

min track sizing function
トラックが minmax() 関数でサイズ指定された場合、 これはその関数の第1引数です。 トラックが <flex> 値や fit-content() 関数でサイズ指定された場合は auto。 それ以外の場合は、そのトラックのサイズ指定関数。
max track sizing function
トラックが minmax() 関数でサイズ指定された場合、 これはその関数の第2引数です。 それ以外の場合は、そのトラックのサイズ指定関数。 全ての場合において、auto および fit-content()max-content として扱います(fit-content() の特記を除く)。
available grid space
各次元ごとに独立して available grid space は以下となります:

注: auto サイズ指定が内容ベースサイズ(例: 水平書字モードのブロックレベルボックスの高さ)を示す場合は max-content と同等です。

すべての場合で、available grid spacegrid container の min/max-width/height プロパティが確定値ならそれでクランプします。

free space
available grid space から すべてのグリッドトラック(ガター含む)の base sizes の合計を引いた値(0未満は0)。 available grid space未確定なら free space未確定です。
span count
該当次元でgrid itemが跨ぐgrid track数。

注: ガターは グリッドサイズ決定アルゴリズムでは min/maxサイズ関数が両方ガターの使用サイズに設定された固定サイズトラックとして扱います。 その幅もtrack sizing algorithm の計算に必ず含めます。

12.3. トラックサイズ決定アルゴリズム

この節の残りは track sizing algorithm であり、 minmax track sizing functions から 使用トラックサイズを算出します。 各トラックは base size という <length> を持ち、アルゴリズム中で増加し最終的にそのトラックのサイズとなります。 また growth limit という <length> を持ち、 base size の最大希望値となります。 ステップは5つです:

  1. トラックサイズ初期化
  2. 本質サイズトラック解決
  3. トラック最大化
  4. 柔軟トラック拡張
  5. ストレッチ auto トラック拡張

12.4. トラックサイズ初期化

各トラックの base size と growth limit を初期化する。 各トラックについて、 そのトラックの min track sizing function が:

A 固定サイズ関数
絶対長さに解決し、そのサイズをトラックの初期 base size とする。

注: 未確定 長さは発生せず、 auto として扱われます。

An 本質サイズ関数
初期 base size を0にする。

各トラックについて、 そのトラックの max track sizing function が:

A 固定サイズ関数
絶対長さに解決し、そのサイズをトラックの初期 growth limit とする。
An 本質サイズ関数
A 柔軟サイズ関数
初期 growth limit を無限大にする。

いずれの場合も、growth limitbase size より小さい場合は growth limitbase size に合わせて増やします。

注: ガターtrack sizing algorithmの目的上、空の固定サイズトラックとして扱います。

12.5. 本質サイズトラックの解決

このステップでは、本質サイズトラックのサイズ指定関数を絶対長さに解決します。 まず、単一トラック内に完全に収まるアイテムに基づいてサイズを決定します。 その後、複数トラックにまたがるアイテムの空間要件を徐々に加え、 可能な限り均等に余分なスペースをそれらのトラックに分配します。

注: このステップ完了時、 すべての本質的なbase sizegrowth limitは 絶対長さに解決されています。

注: 注意として、 fit-content()automax track sizing functionmax-contentと同様に扱われます(明示的な特記がある場合を除く)。

  1. ベースライン整列アイテムの本質サイズ寄与がベースライン整列を反映するようshimする。ベースライン共有グループ内のアイテムについて、 各アイテムの開始/終了側(最初/最後のベースライン整列の場合)にshim(実質的には余分なmargin)を追加し、 開始/終了整列されたときに ベースラインが仕様通りに揃うようにします。

    これらのshimは、以下のトラックサイズ決定の目的でアイテムの本質サイズ寄与の一部とみなします。 アイテムが複数の本質サイズ寄与を持つ場合、shimもそれぞれ異なることがあります。

    例えば、 grid containerのサイズが 未確定の場合、 まずmin/max-content制約下でレイアウトしてサイズを決定し、 そのサイズで「実際に」レイアウトします (percentageトラック等に影響)。 各フェーズで追加されるshimは独立しており、 そのフェーズのレイアウトのみに影響します。

    注: baseline self-alignedbaseline content-aligned両方のアイテムがこのステップで考慮されます。

    注: グリッドアイテム自身のサイズが 本質サイズトラックによって決まる場合はベースライン整列に参加しないため、 shimされません。

  2. 非スパンアイテムに合わせてトラックサイズを調整: 本質的なトラックサイズ関数かつ 柔軟サイズ関数でない トラックについて、spanが1のアイテムを考慮:
    min-content最小値の場合:
    トラックがmin-contentmin track sizing functionなら、 そのbase sizeを アイテムのmin-content寄与の最大値(0未満は0)に設定。
    max-content最小値の場合:
    トラックがmax-contentmin track sizing functionなら、 そのbase sizeを アイテムのmax-content寄与の最大値(0未満は0)に設定。
    auto最小値の場合:
    トラックがautomin track sizing functionかつ grid containermin-/max-content制約下でサイズ決定される場合、 トラックのbase sizeを アイテムのlimited min-content寄与の最大値(0未満は0)に設定。 limited min-/max-content contributionは (この目的では)アイテムのmin-/max-content寄与であり、 max track sizing functionfit-content()引数など)が 固定ならそれで制限し、 最終的にはminimum contribution(下記定義)で0未満は0。

    それ以外の場合は、 トラックのbase sizeを アイテムのminimum contributionの最大値(0未満は0)に設定。 minimum contributionは アイテムが持てる最小のouter sizeです。 具体的には、アイテムのpreferred sizeautoとして振る舞う、または該当軸で包含ブロックサイズ依存なら、 minimum contributionouter size(min-sizeをpreferred sizeとして仮定したときの使用値)。 それ以外ならminimum contributionmin-content contributionminimum contributionは通常内容サイズ依存なので 本質サイズ寄与の一種とみなします。

    注: min-sizeがauto(初期値)のアイテムでは minimum contributionは 通常min-content contributionと同等ですが、 一部ケースで異なります。詳しくは§ 6.6 グリッドアイテムの自動最小サイズ参照。 また、minimum contributionmin-content contributionmax-content contributionです。

    min-content最大値の場合:
    トラックがmin-contentmax track sizing functionなら、 growth limitを アイテムのmin-content contributionの最大値に設定。
    max-content最大値の場合:
    トラックがmax-contentmax track sizing functionなら、 growth limitを アイテムのmax-content contributionの最大値に設定。 fit-content()最大値の場合は、 このgrowth limitfit-content()引数でクランプする。

    いずれの場合も、トラックのgrowth limitbase sizeより小さくなった場合は、 growth limitbase sizeに合わせて増やします。

    注: このステップは、スパンアイテム処理の簡略化であり、 span=1のアイテムに対して下記の手順を実行した場合と同じ挙動となります。

  3. 内容サイズトラックを跨ぐスパンアイテムのサイズ調整: 次に、span=2で柔軟サイズ関数のトラックを跨がないアイテムを考慮。
    1. 本質的最小値の場合: まず、これらのアイテムのminimum contributionを収容するために 本質min track sizing functionを持つ トラックのbase size余分なスペースを分配

      グリッドコンテナがmin-/max-content制約下でサイズ決定される場合は、 アイテムのlimited min-content contributionminimum contributionの代わりに使う。 (複数トラック跨ぎアイテムの場合は、limited min-/max-content contributionの計算上限は 跨ぐトラックの固定max track sizing functionの合計、 かつそれが適用されるのは固定トラックのみ跨ぐ場合。)

    2. 内容ベース最小値の場合: 次に、これらのアイテムのmin-content contributionを収容するために min-contentmax-contentmin track sizing functionを持つ トラックのbase size余分なスペースを分配
    3. max-content最小値の場合: 次に、グリッドコンテナがmax-content制約下でサイズ決定される場合は、 アイテムのlimited max-content contributionを収容するため、 automax-contentmin track sizing functionを持つ トラックのbase size余分なスペースを分配

      すべての場合で、max-contentmin track sizing functionを持つ トラックのbase sizeにも アイテムのmax-content contributionを収容するため 余分なスペースを分配を続行。

    4. この時点でトラックのgrowth limitbase sizeより小さくなっていれば、 growth limitbase sizeに合わせて増やす。
    5. 本質的最大値の場合: 次に、本質max track sizing functionを持つ トラックのgrowth limitに アイテムのmin-content contributionを収容するため 余分なスペースを分配。 このステップでgrowth limitが無限大から有限値に変化したトラックは 次のステップ用に無限成長可能としてマーク。
      なぜ無限成長可能フラグが必要?

      Peter Salasの説明

      例えば次のケース:
      
      2つの "auto" トラック(つまり ''minmax(min-content, max-content) minmax(min-content, max-content)'').
      アイテム1はトラック1にあり、min-content = max-content = 10。
      アイテム2はトラック1と2をまたぎ、min-content = 30, max-content = 100。
      
      最初のアイテムでmin-content/max-contentを解決すると:
      
      track 1: base size = 10 growth limit = 10
      
      track 2: base size = 0 growth limit = infinity
      
      次に2番目のアイテムのmin-content/max-contentを解決。
      
      フェーズ1でtrack 2のbase sizeを20(2トラックのbase size合計が30になるよう)。
      フェーズ2は該当トラックなしで何もしない。
      フェーズ3でtrack 2のgrowth limitを20(2トラックのgrowth limit合計が30になるよう)。
      フェーズ4ではgrowth limit合計を70増やしitem 2を収容。
      選択肢は:
      
      1. 2トラックのgrowth limitを均等に増やして [45, 55]。
      2. 2番目のトラックだけgrowth limitを増やして [10, 90]。
      
      直前に設定したgrowth limitを制約とみなさず(無限とみなす)分配することで
      後者の結果となり、最初のトラックが最初のアイテムにちょうど合わせてサイズされる。
      
    6. max-content最大値の場合: 最後にmax-contentmax track sizing functionを持つ トラックのgrowth limitに アイテムのmax-content contributionを収容するため 余分なスペースを分配

    spanが大きいアイテムについても同様に段階的に繰り返し、すべてのアイテムを考慮します。

  4. 柔軟トラックを跨ぐスパンアイテムのサイズ調整: 次に、前ステップを繰り返すが(spanサイズごとにまとめず)、 柔軟サイズ関数のトラックをまたぐすべてのアイテムを一括で考慮し、
  5. まだ無限大のgrowth limitを持つトラックがあれば (例: アイテムが配置されていない、または柔軟トラックの場合)、 そのgrowth limitbase sizeに設定。

注: アイテムが複数トラックを跨ぐ場合、 本質サイズ制約を満たす唯一の方法はありません。 このアルゴリズムは現実のユースケースで良好な結果を示した複数のヒューリスティクスを組み込んでいます。 今後、より高度なヒューリスティクスが判明すればアルゴリズムの更新もありえます。

12.5.1. 跨るトラックへの余分なスペースの分配

余分なスペースを分配するには、 以下のステップを、次の入力値で実行します:
  1. affected trackごとにplanned increaseを別々に管理し、初期値は0。 (これによりサイズ増加が順序依存にならないようにします。)
  2. 収容するitemについて、itemが跨ぐトラックのみ考慮:
    1. 分配すべきスペースを決定: アイテムのsize contributionから、跨ぐすべてのトラックのaffected sizeを引き、0未満は0にする。 (無限大のgrowth limitは、そのトラックのbase sizeで代用。) この残ったサイズ寄与が分配すべきspaceとなる。
      space = max(0, size contribution - ∑track-sizes)
    2. spaceをリミットまで分配:

      affected trackitem-incurred increaseを、 spaceを均等に分配しながら、 そのトラックのaffected sizeitem-incurred increaselimitに達した時に凍結し、必要に応じて未凍結トラックを成長させます。

      base sizeの場合、 limitはそのgrowth limitであり、 fit-content()引数で上限がある場合はそれでキャップ。 growth limitの場合は、 growth limitが有限かつトラックが無限成長可能でなければ、その値、 そうでなければ、fit-content()引数(もしあれば)、 それ以外は無限大。

      注: affected sizegrowth limitで、トラックが無限成長可能でない場合は、各item-incurred increaseは0になります。

    3. 非対象トラックへの分配:

      この時点でまだ余分なspaceが残り、itemがaffected track以外も跨いでいる場合は、 前ステップと同様に分配するが、非affected track側に分配する。

      注: この分配により、成長リミットに達していないトラック側に残余スペースを割り当て、 affected trackのgrowth limitを超えて割り当てることを避けます。

    4. リミット超過分配:

      まだ余分なspaceが残っていれば、凍結解除し以下のitem-incurred increaseへ分配を続行…

      この目的では、 max track sizing functionfit-content()の場合、 トラックがfit-content()引数で指定されたリミットに達するまでは max-contentとして扱い、 その後は引数値の固定サイズ関数として扱います (この条件で分配対象になるトラックが変化します)。

      注: このステップでは、トラックの現growth limitを超えるサイズ寄与の分配優先度は max track sizing functionの種類に基づきます。

    5. affected trackについて、 そのトラックのitem-incurred increaseplanned increaseより大きければ planned increaseをその値にセット。
  3. トラックのaffected sizeを更新planned increaseを加算し、次回分配でそれを考慮する。 (affected sizeが無限大のgrowth limitの場合は、 トラックのbase sizeplanned increaseにセット。)

12.6. トラック最大化

free spaceが正の場合、 すべてのトラックのbase sizeに均等に分配し、 トラックがgrowth limitに達したら凍結し、必要に応じて未凍結トラックを成長させます。

このステップの目的上: grid containermax-content制約下でサイズ決定する場合、 free spaceは無限大。 min-content制約下では、 free spaceはゼロ。

この処理でグリッドが grid containerinner sizemax-width/heightで制限される)より大きくなる場合は、 このステップをやり直し、 available grid spaceを グリッドコンテナがmax-width/heightでサイズされた時のinner sizeとみなします。

12.7. 柔軟トラックの拡張

このステップでは、柔軟トラックのサイズを、 fr単位で割り当て可能な最大値で決定します(available spaceを超えない範囲)。

まず、グリッドの使用するflex fractionを求めます:

free spaceがゼロ、または grid containermin-content制約下でサイズ決定する場合:
使用されるflex fractionはゼロ。
それ以外でfree space確定長さの場合:
使用されるflex fractionは 全トラックとspace to fillとして available grid spaceを用いて frのサイズを求める結果。
それ以外でfree space未確定長さの場合:
使用されるflex fractionは以下の最大値:

このflex fractionで グリッドがgrid containermin-width/height未満(またはgrid containermax-width/height超)になる場合は、 このステップをやり直し、 free spaceを確定値、 available grid spacegrid containerinner sizemin-width/heightまたはmax-width/heightでサイズされた場合)で扱う。

柔軟トラックについて、 使用するflex fraction× トラックのflex factorが トラックのbase sizeより大きい場合、 base sizeをその値に設定。

12.7.1. frのサイズ決定

このアルゴリズムは、fr単位が目標サイズを超えずに割り当てられる最大サイズを求めます。 grid trackの集合と、 割り当てるべきスペースを引数に呼び出されます。

  1. 余剰スペースspace to fillから 非柔軟grid trackbase size合計を引いたものとする。
  2. flex factor合計柔軟トラックflex factor合計とする。 1未満なら1にする。
  3. 仮想frサイズleftover space÷flex factor合計とする。
  4. 仮想frサイズ×柔軟トラックのflex factorが トラックのbase size未満の場合は そのトラックを非柔軟としてこのアルゴリズムを再実行。
  5. 仮想frサイズを返す。

12.8. autoトラックのストレッチ

content-distributionプロパティgrid containerで この軸でnormalまたはstretchの場合、 automax track sizing functionトラックを 残った正の確定free spaceで均等に拡張します。 free space未確定だが grid container確定min-width/heightを持つ場合は そのサイズを使ってこのステップのfree spaceを計算します。

13. グリッドレイアウトの分割

grid containerは 行・列間やアイテム内部でページ分割できます。 break-*プロパティは grid containerが参加する整形コンテキストに対して通常通り適用されます。 この節ではそれがグリッドアイテムやその内容にどう適用されるかを定義します。

以下の分割規則では、fragmentation containerを「ページ」と呼びます。 他のfragmentation contextでも同様の規則が適用されます。 (必要に応じて「ページ」を適切なfragmentation container型に置き換えてください。) 詳細はCSS Fragmentation Module [CSS3-BREAK]参照。

分割されたグリッドコンテナの正確なレイアウトはこのレベルのGrid Layoutでは定義されていません。 ただしグリッドコンテナ内の分割には以下の規則が適用されます:

13.1. 分割アルゴリズム例

この節は規範的でありません。

これは分割アルゴリズムの一例の草案であり、 [CSS-FLEXBOX-1]アルゴリズムとの整合性確認が必要です。 フィードバック歓迎、実装ガイドとしては上記規則を参照してください。

  1. § 12 グリッドレイアウトアルゴリズムに従い、 fragmentation containerのインラインサイズを使い、ブロックサイズは無制限と仮定してグリッドをレイアウト。 このステップ中、すべてのgrid-rowautofr値は解決されなければならない。
  2. 前ステップで決定した値でgrid containerをレイアウト。
  3. 分割でgrid areaのサイズが変化した場合(行跨ぎアイテムは除く)、次のいずれかの行について行サイズを必要に応じて増やす:
    • content min track sizing functionを持つ行
    • 明示的な高さがないグリッドで、グリッド行が柔軟な場合
  4. グリッドの高さがautoなら、最終的な行サイズ合計がグリッドの高さとなるべき。
  5. 分割時marginの折り畳みでgrid areaがgrid containerをはみ出す場合は、 そのgrid areaを収容するようgrid containerを拡張する(分割による循環レイアウト依存を避けるために必要)。

グリッドの高さが指定されている場合、ステップ3・4でグリッド行がグリッドをはみ出すことがあります。

14. プライバシーに関する考慮事項

Grid Layoutは新たなプライバシー漏洩を導入しません。

15. セキュリティに関する考慮事項

Grid Layoutは新たなセキュリティ上の考慮事項を導入しません。

16. 変更点

16.1. 2020年12月18日 CR以降の変更点

16.2. 2020年8月 CR以降の変更点

2019年12月 CSS Grid Layout Level 2 ワーキングドラフト以降の変更点

それ以外は、CSS Grid level 1の全文を組み込んだのみ。

以前の変更点はWorking Draft中の変更点参照。

16.3. Level 1以降の追加点

以下の機能はLevel 1以降に追加されました:

17. 謝辞

MozillaのMats Palmgren氏に深く感謝します。 彼の支援とフィードバックなくしてサブグリッド機能は前進できませんでした。 また、Daniel Tonon氏にも感謝します。 サブグリッドのギャップの賢い処理を求め、図の作成にも貢献しました。 さらにRachel Andrew氏やJen Simmons氏は CSSワーキンググループとWebデザイン/オーサリングコミュニティ間のフィードバックギャップを埋める助けとなりました。

最後に、 CSS Grid Level 2の謝辞セクションは、 CSS Grid Level 1という大事業を 可能にしたすべての方々への感謝抜きには語れません。

適合性

文書慣例

適合性要件は、記述的な断定とRFC 2119用語の組み合わせで示されます。主要な語「MUST」, 「MUST NOT」, 「REQUIRED」, 「SHALL」, 「SHALL NOT」, 「SHOULD」, 「SHOULD NOT」, 「RECOMMENDED」, 「MAY」, 「OPTIONAL」は、文書の規範部分ではRFC 2119の定義通りに解釈されます。 ただし可読性のため、この仕様ではこれらの語はすべて大文字ではありません。

この仕様書の全テキストは、明示的に非規範と記載されたセクション、例、注記を除き、規範的です。 [RFC2119]

この仕様書の例は「例えば」で始まるか、class="example"で規範テキストから分離されます:

これは情報提供的な例です。

情報提供的な注記は「注:」で始まり、class="note"で規範テキストから分離されます:

注: これは情報提供的な注記です。

助言は規範的なセクションで特別な注意を促すようにスタイリングされ、 <strong class="advisement">で規範文から分離され、次のように表示されます: UAはアクセシブルな代替を提供しなければならない

適合性クラス

この仕様への適合性は、3つの適合性クラスで定義されます:

スタイルシート
CSS スタイルシート
レンダラ
UA(ユーザーエージェント)。スタイルシートの意味を解釈し、それを利用する文書をレンダリングするもの。
オーサリングツール
UA(ユーザーエージェント)。スタイルシートを書くもの。

スタイルシートがこの仕様に適合しているとは、 本モジュールで定義された構文を用いるすべての記述が、 汎用CSS文法および本モジュールで定義された各機能の個別文法に従って有効である場合です。

レンダラがこの仕様に適合しているとは、 スタイルシートを適切な仕様通りに解釈することに加え、 この仕様で定義された全機能を正しくパースし、文書をそれに従いレンダリングできる場合です。 ただし、デバイスの制限で文書の正しいレンダリングができない場合でもUAが非適合とはなりません。 (例:モノクロモニターで色をレンダリングできなくても非適合ではない。)

オーサリングツールがこの仕様に適合しているとは、 汎用CSS文法および本モジュールで定義された各機能の個別文法に従い構文的に正しいスタイルシートを書き、 このモジュールに記載されたスタイルシートの他の適合要件も全て満たす場合です。

部分的な実装

著者が将来対応のパース規則を利用してフォールバック値を割り当てられるよう、 CSSレンダラは必ず必要に応じて)未対応のat規則・プロパティ・プロパティ値・キーワード・他構文要素を無効として扱い、無視しなければなりません。 特に、ユーザーエージェントは未対応値だけ選択的に無視し、対応値だけ認めることはできません。 一つの複数値プロパティ宣言でいずれかの値が無効(=未対応値の場合)なら全宣言を無視する必要があります。

不安定・独自機能の実装

将来の安定CSS機能との衝突を避けるため、 CSSWGはベストプラクティスに従い、 不安定機能や独自拡張の実装を推奨します。

非実験的実装

仕様がCandidate Recommendation段階に達すると、 実験的でない実装が可能となり、実装者はCRレベル機能で仕様通り正しく実装できるものは 接頭辞なしでリリースすべきです。

CSSの実装間の相互運用性を確立・維持するため、 CSSワーキンググループは非実験的CSSレンダラに 実装レポート(および必要ならそのテストケース)をW3Cに提出するよう求めます。 W3Cに提出されたテストケースはCSSワーキンググループによるレビュー・修正対象となります。

テストケースや実装レポートの提出方法はCSSワーキンググループのサイト https://www.w3.org/Style/CSS/Test/で案内しています。 質問はpublic-css-testsuite@w3.orgメーリングリストへ。

CR退出基準

この仕様をProposed Recommendationへ進めるには、 各機能につき独立した相互運用可能な実装が2つ以上必要です。 各機能は異なる製品群で実装されても良く、全機能を一製品が実装する必要はありません。 この基準のため、以下の用語を定義します:

独立
各実装は異なる組織が開発し、他の実装のコードを共有・再利用・派生してはならない。 この仕様の実装に関係しないコードはこの要件の対象外です。
相互運用可能
公式CSSテストスイートの該当テストケース(またはWebブラウザ以外の場合は同等テスト)に合格すること。 該当UAで相互運用性を主張する場合は、すべてのテストに同等テストを用意し、 さらにそれら同等テストに合格する追加UAも必要です。同等テストは公開され、ピアレビュー可能でなければなりません。
実装
以下を満たすユーザーエージェント:
  1. 仕様を実装していること。
  2. 一般公開されていること。製品版、ベータ版、プレビュー版、nightly buildなどが該当。 非製品版リリースの場合は、少なくとも1ヶ月間機能を実装して安定性を示すこと。
  3. 実験的でないこと(テスト通過専用で今後通常利用される予定がないバージョンは不可)。

仕様は少なくとも6ヶ月間Candidate Recommendationとして維持されます。

索引

本仕様で定義される用語

参照によって定義される用語

参照文献

規範的参照

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 2025年3月11日. WD. URL: https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad. CSS Box Model Module Level 4. 2024年8月4日. WD. URL: https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 4. 2018年12月18日. FPWD. URL: https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://www.w3.org/TR/css-cascade-5/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022年9月17日. WD. URL: https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 4. 2024年12月19日. FPWD. URL: https://www.w3.org/TR/css-display-4/
[CSS-FLEXBOX-1]
Tab Atkins Jr.; 他. CSS Flexible Box Layout Module Level 1. 2018年11月19日. CR. URL: https://www.w3.org/TR/css-flexbox-1/
[CSS-GRID-1]
Tab Atkins Jr.; 他. CSS Grid Layout Module Level 1. 2020年12月18日. CRD. URL: https://www.w3.org/TR/css-grid-1/
[CSS-IMAGES-3]
Tab Atkins Jr.; Elika Etemad; Lea Verou. CSS Images Module Level 3. 2023年12月18日. CRD. URL: https://www.w3.org/TR/css-images-3/
[CSS-INLINE-3]
Elika Etemad. CSS Inline Layout Module Level 3. 2024年12月18日. WD. URL: https://www.w3.org/TR/css-inline-3/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2023年3月29日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS Positioned Layout Module Level 3. 2025年3月11日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-PSEUDO-4]
Daniel Glazman; Elika Etemad; Alan Stearns. CSS Pseudo-Elements Module Level 4. 2022年12月30日. WD. URL: https://www.w3.org/TR/css-pseudo-4/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://www.w3.org/TR/css-sizing-3/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS Box Sizing Module Level 4. 2021年5月20日. WD. URL: https://www.w3.org/TR/css-sizing-4/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2021年12月24日. CRD. URL: https://www.w3.org/TR/css-syntax-3/
[CSS-TEXT-4]
Elika Etemad; 他. CSS Text Module Level 4. 2024年5月29日. WD. URL: https://www.w3.org/TR/css-text-4/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2024年3月22日. CRD. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2024年3月12日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos; 他. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-BREAK]
Rossen Atanassov; Elika Etemad. CSS Fragmentation Module Level 3. 2018年12月4日. CR. URL: https://www.w3.org/TR/css-break-3/
[CSS3-WRITING-MODES]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2019年12月10日. REC. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSSOM]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://www.w3.org/TR/cssom-1/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MEDIAQUERIES-5]
Dean Jackson; 他. Media Queries Level 5. 2021年12月18日. WD. URL: https://www.w3.org/TR/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEB-ANIMATIONS-1]
Brian Birtles; 他. Web Animations. 2023年6月5日. WD. URL: https://www.w3.org/TR/web-animations-1/

参考参照

[CSS-MULTICOL-2]
Florian Rivoal; Rachel Andrew. CSS Multi-column Layout Module Level 2. 2024年12月19日. FPWD. URL: https://www.w3.org/TR/css-multicol-2/
[HTML]
Anne van Kesteren; 他. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/

プロパティ索引

名称 初期値 適用対象 継承 %値 アニメーション型 正規順序 算出値
grid <'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'> none グリッドコンテナ 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 文法順 個別プロパティ参照
grid-area <grid-line> [ / <grid-line> ]{0,3} auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no N/A 離散値 文法順 個別プロパティ参照
grid-auto-columns <track-size>+ auto グリッドコンテナ no トラックサイズ参照 リスト長が一致すればアイテム毎に算出値型、離散値でなければ離散 文法順 トラックサイズ参照
grid-auto-flow [ row | column ] || dense row グリッドコンテナ no n/a 離散値 文法順 指定キーワード
grid-auto-rows <track-size>+ auto グリッドコンテナ no トラックサイズ参照 リスト長が一致すればアイテム毎に算出値型、離散値でなければ離散 文法順 トラックサイズ参照
grid-column <grid-line> [ / <grid-line> ]? auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no N/A 離散値 文法順 個別プロパティ参照
grid-column-end <grid-line> auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no n/a 離散値 文法順 キーワード、識別子、整数
grid-column-start <grid-line> auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no n/a 離散値 文法順 キーワード、識別子、整数
grid-row <grid-line> [ / <grid-line> ]? auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no N/A 離散値 文法順 個別プロパティ参照
grid-row-end <grid-line> auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no n/a 離散値 文法順 キーワード、識別子、整数
grid-row-start <grid-line> auto グリッドアイテムおよび包含ブロックがグリッドコンテナの絶対配置ボックス no n/a 離散値 文法順 キーワード、識別子、整数
grid-template none | [ <'grid-template-rows'> / <'grid-template-columns'> ] | [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]? none グリッドコンテナ 個別プロパティ参照 個別プロパティ参照 個別プロパティ参照 文法順 個別プロパティ参照
grid-template-areas none | <string>+ none グリッドコンテナ no n/a 離散値 文法順 noneまたはstring値リスト
grid-template-columns none | <track-list> | <auto-track-list> | subgrid <line-name-list>? none グリッドコンテナ no 内容領域の該当次元参照 リスト長が一致すれば算出値型、そうでなければ離散 文法順 noneまたは計算済みトラックリスト
grid-template-rows none | <track-list> | <auto-track-list> | subgrid <line-name-list>? none グリッドコンテナ no 内容領域の該当次元参照 リスト長が一致すれば算出値型、そうでなければ離散 文法順 noneまたは計算済みトラックリスト

課題索引

このGrid Layout ModuleとFlexible Box Layout Module に矛盾がある場合は、 CSSWGへ報告してください。 それはおそらく誤りです。
上記リストの最初の箇条書きは、 implicitトラックがgrid-template-rows等の一部としてシリアライズされることを意味しますが、 実際には著者がそれらプロパティでimplicitトラックサイズを指定できません! つまりgrid-template-rowsgrid-template-columns値は 正しくラウンドトリップしない可能性があります:
const s = getComputedStyle(gridEl);
gridEl.style.gridTemplateRows = s.gridTemplateRows;
// このようなコードは 本来何も変わらないはずだが、
// implicit行があると、
// これでexplicit行に変換され、
// グリッドアイテムの配置やグリッドの全体サイズが変化する可能性がある!

これは初期実装の偶然の性質で、 後の実装にも引き継がれましたが、 あまり考慮されていませんでした。 仕様からは削除予定ですが、implicitトラック情報取得用CSSOM APIが定義されるまでは現状唯一の取得方法のため、 多くのページがこれに依存しているためです。

CSSワーキンググループはgrid-placementプロパティの使用値も返すか検討中です。特に実装者からのフィードバック募集中です。 議論参照。