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 이슈 저장소
CSSWG GitHub
명세 내 인라인
편집자:
Tab Atkins Jr. (Google)
Elika J. Etemad / fantasai (Apple)
(Microsoft)
(Igalia)
이 명세에 대한 편집 제안:
GitHub 편집기

요약

이 CSS 모듈은 사용자 인터페이스 설계에 최적화된 2차원 그리드 기반 레이아웃 시스템을 정의합니다. 그리드 레이아웃 모델에서 그리드 컨테이너의 자식은 미리 정의된 유연 또는 고정 크기 레이아웃 그리드의 임의 슬롯에 배치될 수 있습니다. 레벨 2는 중첩된 그리드가 부모 그리드의 크기 결정에 참여할 수 있도록 하는 “subgrid” 기능을 추가하여 Grid를 확장합니다.

CSS는 화면, 인쇄물 등에서 구조화된 문서(예: HTML 및 XML)의 렌더링을 기술하는 언어입니다.

이 문서의 상태

이 섹션은 이 문서가 발행되었을 당시의 상태를 설명합니다. 현재 W3C 간행물 목록 및 이 기술 보고서의 최신 개정본은 https://www.w3.org/TR/의 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

이 문서는 CSS 작업 그룹에 의해 Candidate Recommendation DraftRecommendation track을 사용하여 발행되었습니다. Candidate Recommendation Draft로의 발행은 W3C 및 그 회원들의 승인(endorsement)을 의미하지 않습니다. Candidate Recommendation Draft는 작업 그룹이 이후 Candidate Recommendation Snapshot에 포함하려는 이전 Candidate Recommendation의 변경사항을 통합합니다.

이 문서는 초안 문서이며 언제든지 업데이트, 교체 또는 다른 문서에 의해 폐기될 수 있습니다. 진행 중인 작업 이외의 용도로 이 문서를 인용하는 것은 적절하지 않습니다.

피드백은 GitHub에 이슈 제출(권장)를 통해 보내주시고, 제목에 스펙 코드 “css-grid”를 포함해 주세요. 예: “[css-grid] …코멘트 요약…”. 모든 이슈와 코멘트는 보관(archived)됩니다. 대안으로, 피드백은 ( 보관된 ) 공개 메일링 리스트 www-style@w3.org로 보낼 수 있습니다.

이 문서는 2023년 11월 03일 W3C Process Document의 규정을 따릅니다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에 의해 작성되었습니다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지합니다; 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 실제로 알고 있는 특허가 그 개인이 판단하기에 Essential Claim(s)을 포함한다고 믿는 경우, 해당 정보는 W3C Patent Policy의 섹션 6에 따라 공개해야 합니다.

이 그리드 레이아웃 모듈과 Flexible Box Layout Module 사이에 불일치가 있는 것을 발견하시면, 이는 오류일 가능성이 있으므로 CSSWG에 보고해 주시기 바랍니다.

1. 소개

이 섹션은 규범적이지 않습니다.

그리드 레이아웃은 박스와 그 내용의 크기 및 위치 지정을 강력하게 제어할 수 있는 CSS용 레이아웃 모델입니다. 단일 축 지향인 Flexible Box Layout과 달리, 그리드 레이아웃은 두 차원 레이아웃(두 축 모두에서 콘텐츠 정렬이 필요한 경우)에 최적화되어 있습니다.

플렉스 레이아웃 예: 두 행의 항목, 첫 번째는 각각 공간의 3분의 1을 차지하는 세 항목, 두 번째는 각각 공간의 5분의 1을 차지하는 다섯 항목. 따라서 '행'을 따라 정렬은 있지만 '열'을 따라 정렬되지는 않음.
대표적인 Flex 레이아웃 예제
그리드 레이아웃 예: 두 행의 항목, 첫 번째 행에는 네 항목이 있으며—마지막 항목은 두 행에 걸쳐 있고, 두 번째 행에는 두 항목이 있으며—첫 번째 항목은 처음 두 열을 차지함—첫 번째 행에서 걸친 항목 포함.
대표적인 Grid 레이아웃 예제

또한, 항목을 그리드에 명시적으로 배치할 수 있는 능력 덕분에, 그리드 레이아웃은 시각적 레이아웃 구조를 극적으로 변경하더라도 대응하는 마크업 변경을 요구하지 않습니다. 미디어 쿼리와 그리드 컨테이너 및 그 자식의 레이아웃을 제어하는 CSS 속성을 결합하여, 저자는 장치 형식, 방향 및 사용 가능한 공간의 변화에 맞춰 레이아웃을 조정하면서도 여러 프레젠테이션에 걸쳐 더 이상적인 의미적 구조(semantic structuring)를 유지할 수 있습니다.

많은 레이아웃은 Grid 또는 Flexbox로 모두 표현할 수 있지만, 각 기술은 전문성이 다릅니다. Grid는 2차원 정렬을 강제하고, 상위-하위(Top-down) 방식으로 레이아웃을 사용하며, 항목의 명시적 중첩(overlapping)을 허용하고, 더 강력한 스팬(spanning) 기능을 제공합니다. Flexbox는 축 내 공간 분배에 초점을 맞추고, 더 단순한 하위-상향(Bottom-up) 방식을 사용하며, 보조 축을 제어하기 위해 콘텐츠 크기 기반의 줄바꿈(line-wrapping) 시스템을 사용할 수 있고, 더 복잡한 레이아웃을 구성하기 위해 기본 마크업 계층 구조에 의존합니다. 두 기술 모두 CSS 저자에게 유용하고 상호 보완적인 도구가 될 것으로 예상됩니다.

Grid 레벨 2는 subgrid 기능을 추가합니다: 서브그리드된 축은 요소의 부모 그리드의 선과 자신의 그리드 선을 맞추고, 부모 그리드와의 통합을 통해 트랙 크기를 결정하는 축입니다.

1.1. 배경 및 동기

이미지: 수평 및 수직 정렬이 필요한 애플리케이션 레이아웃 예.
수평 및 수직 정렬이 필요한 애플리케이션 레이아웃 예

웹사이트가 단순 문서에서 복잡한 인터랙티브 애플리케이션으로 발전함에 따라, 예를 들어 float 같은 문서 레이아웃 기술은 애플리케이션 레이아웃에 반드시 적합하지 않았습니다. 테이블, 자바스크립트 또는 float된 요소에 대한 정교한 측정을 조합하여, 저자들은 원하는 레이아웃을 얻기 위한 우회 방법을 발견했습니다. 사용 가능한 공간에 맞춰 조정되는 레이아웃은 종종 취약했고, 공간이 제한될 때 직관에 반하는 동작을 초래했습니다. 대안으로 많은 웹 애플리케이션 저자들은 고정 레이아웃을 선택했으며, 이는 화면의 사용 가능한 렌더링 공간 변경을 활용할 수 없습니다.

그리드 레이아웃의 기능은 이러한 문제를 해결합니다. 이는 저자가 예측 가능한 크기 동작 집합을 사용하여 레이아웃을 위한 사용 가능한 공간을 열과 행으로 나눌 수 있는 메커니즘을 제공합니다. 그런 다음 저자는 애플리케이션의 구성 요소 요소들을 이러한 열과 행의 교차점이 정의하는 그리드 영역에 정확히 위치시키고 크기를 지정할 수 있습니다. 다음 예제들은 그리드 레이아웃의 적응 능력과, 콘텐츠와 스타일의 더 깔끔한 분리를 어떻게 허용하는지를 보여줍니다.

1.1.1. 사용 가능한 공간에 맞춘 레이아웃 조정

게임 레이아웃을 두 열과 세 행으로 고려해 보자: 왼쪽 상단에는 게임 제목, 그 아래에는 메뉴, 왼쪽 하단에는 점수, 오른쪽의 상단 및 중간 셀에는 게임 보드가 차지하고 하단에는 게임 컨트롤이 위치. 왼쪽 열은 제목, 메뉴 항목 및 점수의 내용에 정확히 맞게 크기 지정되며, 오른쪽 열은 나머지 공간을 채움.
콘텐츠 크기와 사용 가능한 공간에 따라 배치된 다섯 개의 그리드 항목
더 큰 화면에서 더 많은 공간이 사용 가능해지면 가운데 행/오른쪽 열이 그 공간을 채우도록 확장됨.
사용 가능한 공간 증가로 인한 그리드의 확장

그리드 레이아웃은 웹페이지 내 요소들을 지능적으로 크기 조정하는 데 사용될 수 있습니다. 인접한 그림들은 게임 레이아웃의 다섯 주요 구성 요소를 나타냅니다: 게임 제목, 통계 영역, 게임 보드, 점수 영역 및 컨트롤 영역. 저자의 의도는 게임을 위한 공간을 다음과 같이 나누는 것입니다:

다음 그리드 레이아웃 예제는 저자가 모든 크기, 배치 및 정렬 규칙을 선언적으로 어떻게 달성할 수 있는지를 보여줍니다.

/**
 * 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)에서 볼 때 구성 요소의 배치를 최적화해야 합니다. 그리드 레이아웃과 미디어 쿼리를 결합함으로써, 저자는 동일한 의미적 마크업을 사용하면서도 요소의 시각적 배치를 소스 순서와 독립적으로 재배열하여 두 방향 모두에서 원하는 레이아웃을 달성할 수 있습니다.

다음 예제는 그리드 레이아웃의 공간 이름 지정 기능을 사용합니다. 이를 통해 그리드 정의가 변경되더라도 저자는 그리드 항목에 대한 규칙을 다시 작성할 필요가 없습니다.

@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 키워드를 속성 값으로 허용합니다. 가독성을 위해 여기서는 그것들을 명시적으로 반복하지 않았습니다.

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-contentjustify-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. 그리드 레이아웃 개념 및 용어

그리드 레이아웃에서, 그리드 컨테이너의 내용은 위치 지정 및 정렬을 통해 그리드에 배치됩니다. 그리드는 수평 및 수직의 교차하는 그리드 선들의 집합으로, 그리드 컨테이너의 공간을 그리드 영역으로 나눕니다. 그리드 항목(grid items, 즉 그리드 컨테이너의 내용)을 해당 영역에 배치할 수 있습니다. 두 세트의 그리드 선이 존재합니다: 하나는 을 정의하며 블록 축을 따라 달리고, 다른 하나는 직교하는 세트로 을 인라인 축을 따라 정의합니다. [CSS3-WRITING-MODES]

그리드 선 이미지.
그리드 선: 블록 축에 3개, 인라인 축에 4개.

3.1. 그리드 선

그리드 선은 그리드의 수평 및 수직 분할선입니다. 열 또는 행의 양쪽에 각각 그리드 선이 존재합니다. 그리드 선은 숫자 인덱스나 저자가 지정한 이름으로 참조할 수 있습니다. 그리드 항목그리드 선을 참조하여 그리드 내에서 자신의 위치를 grid-placement 속성들로 결정합니다.

다음 두 예는 모두 세 개의 열 그리드 선과 네 개의 행 그리드 선을 만듭니다.

첫 번째 예는 저자가 그리드 항목그리드 선 번호를 사용해 위치시키는 방법을 보여줍니다:

#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. 그리드 트랙 및 셀

그리드 트랙그리드 열 또는 그리드 행을 가리키는 일반 용어입니다—즉, 인접한 두 그리드 선 사이의 공간입니다. 각 그리드 트랙은 열이나 행이 얼마나 넓어지거나 높아질지를 제어하는 크기 지정 함수를 할당받으며, 따라서 그 경계인 그리드 선이 얼마나 떨어져 있는지를 결정합니다. 인접한 그리드 트랙구터로 구분될 수 있지만 그렇지 않으면 밀집되어 있습니다.

그리드 셀은 그리드 행과 그리드 열의 교차 지점입니다. 그것은 그리드에서 그리드 항목을 위치시킬 때 참조할 수 있는 가장 작은 단위입니다.

다음 예에서는 두 열과 세 행이 있습니다. 첫 번째 열은 150px로 고정되어 있습니다. 두 번째 열은 유연한 크기 지정을 사용하며, 이는 그리드에서 할당되지 않은 공간의 함수이므로 그리드 컨테이너의 너비가 변경됨에 따라 달라집니다. 만약 그리드 컨테이너의 사용된 너비가 200px이면 두 번째 열은 50px입니다. 만약 그리드 컨테이너의 사용된 너비가 100px이면 두 번째 열은 0px이고, 해당 열에 배치된 콘텐츠는 그리드 컨테이너를 넘칠 것입니다.
#grid {
  display: grid;
  grid-template-columns: 150px 1fr;  /* two columns */
  grid-template-rows: 50px 1fr 50px; /* three rows  */
}

3.3. 그리드 영역

그리드 영역은 하나 이상의 그리드 항목을 레이아웃하는 데 사용되는 논리적 공간입니다. 그리드 영역은 하나 이상의 인접한 그리드 셀로 구성됩니다. 그것은 네 개의 그리드 선(영역의 네 면 각각에 하나씩)에 의해 경계가 정해지며, 교차하는 그리드 트랙의 크기 결정에 참여합니다. 그리드 영역grid-template-areas 속성을 사용해 명시적으로 이름을 지정할 수 있고, 또는 그 경계인 그리드 선으로 암시적으로 참조될 수 있습니다. 그리드 항목grid-placement 속성들을 사용해 그리드 영역에 할당됩니다.

/* 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;
  height: 100vh;
}

#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: start; }
#item3 { justify-self: end; align-self: end; }

그리드 항목그리드 영역은 그것이 배치되는 포함 블록을 형성합니다. 동일한 그리드 영역에 배치된 그리드 항목들은 서로의 레이아웃에 직접적인 영향을 주지 않습니다. 그러나 간접적으로는, 그리드 항목그리드 트랙에 놓이고 그 트랙이 내적 크기 지정 함수를 가질 경우 해당 트랙의 크기에 영향을 미칠 수 있고(따라서 그 경계인 그리드 선의 위치도), 이는 다른 그리드 항목의 위치나 크기에 영향을 줄 수 있습니다.

3.4. 중첩 항목 vs. 서브그리드 항목

그리드 항목 자신이 그리드 컨테이너가 될 수 있으며, 이때 display: grid를 부여합니다. 일반적인 경우에 이 중첩 그리드의 내용 레이아웃은 그것이 참여하는 상위 그리드의 레이아웃과 독립적입니다.

그러나 경우에 따라 여러 그리드 항목의 내용이 서로 정렬되어야 할 필요가 있을 수 있습니다. 중첩 그리드는 그 행 및/또는 열 정의를 부모 그리드 컨테이너에 위임하여 서브그리드가 될 수 있습니다. 이 경우, 서브그리드그리드 항목들상위 그리드의 크기 지정에 참여하여 두 그리드의 내용이 정렬되도록 합니다. 자세한 내용은 § 9 서브그리드를 참조하십시오.

서브그리드subgrid 키워드로 설정되며, 이는 grid-template-rows 또는 grid-template-columns에서 사용되며, 어느 축(또는 양 축)에서든 서브그리드 처리될 수 있습니다. 서브그리드 처리된 축이 없는 그리드는 독립형 그리드입니다.

예를 들어, 레이블과 입력 목록으로 구성된 폼이 있다고 가정합시다:
<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는 비시각적 매체(예: speech)에서의 순서에 영향을 주지 않습니다. 마찬가지로, 그리드 항목을 시각적으로 재배치해도 순차적 내비게이션 모드(예: 링크를 순환하는 경우, 예: tabindex [HTML])의 기본 탐색 순서에는 영향을 주지 않습니다.

저자는 반드시 ordergrid-placement properties를 콘텐츠의 논리적 재정렬이 아닌 시각적 재정렬에만 사용해야 합니다. 이러한 기능을 사용하여 논리적 재정렬을 수행하는 스타일시트는 비준수입니다.

참고: 이는 비시각적 매체 및 비 CSS 사용자 에이전트가 일반적으로 콘텐츠를 선형으로 제공하므로 논리적 소스 순서를 신뢰할 수 있게 하기 위한 것입니다. 그리드 레이아웃의 배치 및 정렬 기능은 시각적 배열을 맞추기 위해 사용되어야 합니다. (시각적 지각은 2차원적이고 비선형적이기 때문에, 원하는 시각적 순서가 항상 원하는 읽기 순서와 동일하지 않을 수 있습니다.)

많은 웹 페이지는 마크업에서 유사한 형태를 가지며, 위에는 헤더가 있고, 아래에는 푸터가 있으며, 가운데에는 콘텐츠 영역과 한두 개의 추가 열이 있습니다. 일반적으로 콘텐츠가 추가 열보다 먼저 페이지의 소스 코드에 오는 것이 바람직합니다. 그러나 이것은 추가 열을 왼쪽에 두고 콘텐츠 영역을 오른쪽에 배치하는 것과 같은 많은 일반적인 디자인을 구현하기 어렵게 만듭니다. 수년간 여러 방식으로 해결되어 왔으며, 추가 열이 두 개인 경우 종종 "Holy Grail Layout"이라고 불립니다. 그리드 레이아웃은 이 예제를 간단하게 만듭니다. 예를 들어, 다음은 페이지 코드와 원하는 레이아웃의 스케치입니다:
<!DOCTYPE html>
<header>...</header>
<main>...</main>
<nav>...</nav>
<aside>...</aside>
<footer>...</footer>
이 페이지에서는 헤더가 상단에 있고 푸터가 하단에 있지만 메인은 가운데에 있고 오른쪽에는 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 편집기와 웹 기반 저작 도구를 포함한 저작 도구는 기본 문서 소스를 재정렬해야 하며, 저자가 기본 문서 순서(음성 및 내비게이션 순서를 결정함)가 시각적 순서와 동기화되지 않아야 한다고 명시적으로 지시하지 않는 한 order 또는 grid-placement properties를 사용하여 재정렬을 수행해서는 안 됩니다.

예를 들어, 도구는 그리드 항목의 드래그 앤 드롭 배치와 화면 크기 범위별 대체 레이아웃을 위한 미디어 쿼리 처리를 모두 제공할 수 있습니다.

대부분의 경우 재정렬은 모든 화면 범위뿐만 아니라 내비게이션 및 음성 순서에도 영향을 미쳐야 하므로, 도구는 드래그 앤 드롭으로 얻은 시각적 배치를 DOM 계층을 동시에 재정렬하여 일치시킬 것입니다. 그러나 어떤 경우에는 저자가 화면 크기마다 다른 시각적 배치를 원할 수 있습니다. 도구는 미디어 쿼리와 함께 grid-placement properties를 사용하여 이러한 기능을 제공할 수 있지만, 가장 작은 화면 크기의 배치는 기본 DOM 순서(이는 논리적 선형 표현 순서일 가능성이 가장 높음)에 연결하고, 다른 크기 범위에서는 grid-placement properties를 사용하여 시각적 표현을 재배치할 수 있습니다.

이와 같은 도구는 준수할 것이며, 반면에 드래그 앤 드롭 그리드 재배열을 처리하기 위해 항상 grid-placement properties만을 사용하는 도구는 (구현상 편리하더라도) 비준수입니다.

5. 그리드 컨테이너

5.1. 그리드 컨테이너 설정: gridinline-grid display

Name: display
New values: grid | inline-grid
grid
이 값은 요소가 그리드 컨테이너 상자를 생성하게 하며, 그 상자는 flow layout에 배치될 때 블록 레벨입니다.
inline-grid
이 값은 요소가 그리드 컨테이너 상자를 생성하게 하며, 그 상자는 flow layout에 배치될 때 인라인 레벨입니다.

grid containersubgrid가 아닐 경우, 그 내용에 대해 독립적인 그리드 포매팅 컨텍스트를 생성합니다. 이는 독립적인 블록 포매팅 컨텍스트를 생성하는 것과 같으나, 블록 레이아웃 대신 그리드 레이아웃이 사용된다는 차이점이 있습니다: float 요소는 그리드 컨테이너에 침범하지 않으며, 그리드 컨테이너의 마진은 그 내용의 마진과 겹치지 않습니다. grid container의 내용은 grid로 배치되며, grid line이 각 grid item의 포함 블록 경계를 형성합니다.

일반적인 중첩 그리드와 달리, subgrid의 내용은 부모 그리드 포매팅 컨텍스트에 참여합니다; 따라서 subgrid는 독립적인 포매팅 컨텍스트를 생성하지 않습니다.

그리드 컨테이너는 블록 컨테이너가 아니므로, 블록 레이아웃을 가정하여 설계된 일부 속성들은 그리드 레이아웃에서는 적용되지 않습니다. 특히 다음과 같습니다:

만약 요소의 지정된 displayinline-grid이고 요소가 float되거나 절대 위치인 경우, display의 계산값은 grid가 됩니다. 따라서 CSS 2.1 챕터 9.7의 표는 추가 행을 포함하도록 수정되며, "Specified Value" 열에는 inline-grid이, "Computed Value" 열에는 grid가 들어갑니다.

5.2. 그리드 컨테이너의 크기 지정

참고: 이 절의 용어 정의는 [CSS-SIZING-3]를 보십시오.

그리드 컨테이너는 그것이 참여하는 포매팅 컨텍스트의 규칙을 사용하여 크기가 지정됩니다:

인라인 및 블록 포매팅 컨텍스트 모두에서, 그리드 컨테이너auto block 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는 암시적 그리드(implicit grid)의 가능한 크기를 UA가 정의한 한도(예: 선 범위를 [-10000, 10000]로 수용할 수 있는 범위) 내로 제한할 수 있으며, 그 한도 바깥의 모든 선을 제거할 수 있습니다. 만약 그리드 항목이 이 한도 밖에 배치된다면, 그 항목의 그리드 영역은 이 제한된 그리드 내로 강제 조정(clamped)되어야 합니다.

그리드 영역을 강제 조정(clamp a grid area)하려면:

예를 들어, 만약 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을 포함하는 익명 블록.

참고: 요소 간 공백은 사라집니다: 그것은 자체 그리드 항목이 되지 않지만, 요소 간 텍스트는 익명 그리드 항목으로 래핑된다는 점에 유의하십시오.

참고: 익명 항목의 상자는 스타일을 적용할 수 없습니다, 왜냐하면 스타일 규칙을 지정할 요소가 없기 때문입니다. 다만 그 내용은 그리드 컨테이너로부터 (예: 글꼴 설정과 같은) 스타일을 상속받습니다.

6.1. 그리드 아이템 디스플레이

만약 그것이 서브그리드가 아니라면, 그리드 항목은 그 내용에 대해 독립적인 포매팅 컨텍스트를 설정합니다. 그러나 그리드 항목은 블록 레벨 박스가 아니라 그리드-레벨 박스입니다: 그것들은 블록 포매팅 컨텍스트가 아니라 컨테이너의 그리드 포매팅 컨텍스트에 참여합니다.

요소의 가장 가까운 조상 요소의 계산된(computed) display 값이 (display:contents 조상을 건너뛴 뒤) grid 또는 inline-grid이면, 해당 요소의 자체 display 값은 블록화(blockified)됩니다. (이러한 display 값 변환에 관한 자세한 내용은 관련 문서를 참조하십시오.)

참고: 블록화는 해당 grid 또는 inline-grid 요소가 실제로 그리드 컨테이너 박스를 생성하지 않는 경우에도 발생합니다, 예: 그것이 대체 요소이거나 display: none 하위 트리가 있는 경우.

참고: 일부 display 값들은 원래 박스 주위에 익명 박스를 생성합니다. 만약 그러한 박스가 그리드 항목이라면, 먼저 블록화되므로 익명 박스 생성은 일어나지 않습니다. 예를 들어 연속된 두 개의 그리드 항목display: table-cell이면, 하나의 익명 테이블로 감싸지지 않고 두 개의 별도 display: block 그리드 항목이 됩니다.

6.2. 그리드 아이템 크기 지정

그리드 항목은 그가 속한 그리드 영역이 정의하는 포함 블록 내에서 크기가 정해집니다.

그리드 항목의 자동 크기(automatic sizes) 계산은 그들의 자체 정렬 값에 따라 달라집니다:

normal

만약 그리드 항목이 관련 축에 대해 선호 종횡비를 가지지 않거나, 대체 요소가 아닌 경우 관련 축에서의 자연 크기가 없으면, 그 그리드 항목은 align-self: stretch처럼 크기가 지정됩니다.

그렇지 않으면, 해당 그리드 항목은 해당 축에 대해 블록 레벨 요소의 크기 계산 규칙에 일치하도록 크기가 지정됩니다.

stretch

비대체 박스의 경우 인라인 크기 계산 규칙을 사용합니다, 즉 stretch-fit 크기를 사용합니다.

참고: 이것은 만약 항목이 선호 종횡비를 가지고 있고 다른 축에서 크기가 제한되어 있다면, 종횡비가 왜곡될 수 있습니다.

기타 모든 값

항목을 fit-content로 크기 지정합니다.

다음 정보 표는 그리드 항목의 자동 크기 동작을 요약합니다:
그리드 항목 자동 크기 동작 요약
정렬 비대체 요소 크기 대체 요소 크기
normal 그리드 영역 채우기 자연 크기 사용
stretch 그리드 영역 채우기 그리드 영역 채우기
start/center/기타 fit-content 크기(플로트와 유사) 자연 크기 사용

참고: auto 값은 min-widthmin-height의 트랙 크기 계산에 영향을 미치며, 이는 플렉스 항목의 주 크기에 영향을 주는 방식과 유사합니다. 자세한 내용은 § 6.6 그리드 항목의 자동 최소 크기를 참조하십시오.

6.3. 순서 변경된 그리드 아이템: order 속성

order 속성은 그리드 항목에도 적용됩니다. 이 속성은 그들의 자동 배치페인팅 순서에 영향을 줍니다.

플렉스 항목의 재정렬과 마찬가지로, order 속성은 시각적 순서가 음성 및 내비게이션 순서와 동기화되지 않아야 할 때만 사용해야 합니다; 그렇지 않으면 기본 문서 소스를 재정렬해야 합니다. 자세한 내용은 관련 문서를 참조하십시오.

6.4. 그리드 아이템의 마진과 패딩

인접한 그리드 항목들은 각자 자신의 그리드 영역이 형성하는 포함 블록 내에 독립적으로 포함되므로, 인접한 그리드 항목의 마진은 서로 병합되지 않습니다.

그리드 항목의 백분율 마진 및 패딩은 블록 박스의 경우와 마찬가지로, 포함 블록의 인라인 크기를 기준으로 해석됩니다. 예: 좌/우/상/하 백분율은 모두 포함 블록의 너비를 기준으로 해석됩니다(쓰기 모드에 따라).

자동 마진은 해당 차원에서 여분의 공간을 흡수하여 확장되며, 정렬에 사용할 수 있습니다. 자세한 내용은 § 11.2 자동 마진을 사용한 정렬을 참조하십시오.

6.5. Z축 순서 지정: z-index 속성

그리드 항목은 서로 교차하는 그리드 영역에 배치되었을 때 겹칠 수 있으며, 음수 마진이나 포지셔닝 때문에 교차하지 않는 영역에 배치되었을 때에도 겹칠 수 있습니다. 그리드 항목의 페인팅 순서는 인라인 블록의 그것과 정확히 동일합니다, 다만 원시 문서 순서 대신 order로 수정된 문서 순서가 사용되고, z-indexauto가 아닌 값일 때에는 position이 static이더라도 스태킹 컨텍스트를 생성합니다. 따라서 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])에 정의되어 있습니다.

그리드 항목에 대해 더 합리적인 기본 최소 크기를 제공하기 위해, 특정 축에서의 자동 최소 크기(automatic minimum size)의 사용된 값은 다음 모든 조건이 참일 때 콘텐츠 기반 최소 크기입니다:

그렇지 않으면 자동 최소 크기는 일반적으로 0입니다.

참고: 콘텐츠 기반 최소 크기내재적 크기 기여의 한 유형이며, 따라서 관련 규정이 적용됩니다.

특정 차원에서의 콘텐츠 기반 최소 크기는 해당 항목의 지정된 크기 제안이 있으면 그 값이고, 그렇지 않으면 대체 요소인 경우 전이된 크기 제안이 있으면 그 값이고, 그렇지 않으면 콘텐츠 크기 제안입니다. 다만, 만약 그리드 항목이 특정 차원에서 고정된 최대 트랙 크기 지정 함수만 가진 트랙들만 걸친다면, 그 차원에서의 지정된/콘텐츠 크기 제안(및 반대 축으로의 입력)은 그 그리드 영역의 최대 크기(트랙들의 max 합계와 중간 구터 포함)에 대한 stretch fit 이하로 추가로 제한됩니다.

모든 경우에, 크기 제안은 해당 축의 최대 크기에 의해 추가로 제한되며, 만약 그것이 definite이면 적용됩니다. 만약 항목이 압축 가능한 대체 요소(compressible replaced element)이고 관련 축에 definite선호 크기나 최대 크기를 가지고 있으면, 크기 제안은 그 크기로 상한됩니다; 이 목적을 위해 이러한 크기에 포함된 불확정 백분율은 0을 기준으로 해석되어 definite로 간주됩니다.

참고: fit-content()의 인수는 고정(max) 트랙 크기와 동일한 방식으로 콘텐츠 기반 최소 크기를 제한하지 않습니다.

이 계산에 사용되는 콘텐츠 크기 제안, 지정된 크기 제안, 및 전이된 크기 제안은 관련 min/max/선호 크기 속성을 고려하여 콘텐츠 기반 최소 크기가 저자가 제공한 제약과 충돌하지 않도록 합니다.

지정된 크기 제안
만약 항목의 관련 축에 대한 선호 크기definite이면, 지정된 크기 제안은 그 크기입니다. 그렇지 않으면 정의되지 않습니다.
전이된 크기 제안
항목이 선호 종횡비을 가지고 있고 반대 축에서의 선호 크기가 definite이면, 전이된 크기 제안은 그 크기(반대 축의 min/max에 의해 제한될 수 있음)를 종횡비로 변환한 값입니다. 그렇지 않으면 정의되지 않습니다.

만약 항목이 관련 축에 대해 definite한 선호 크기나 최대 크기를 가지고 있다면, 전이된 크기 제안은 그 크기로 상한됩니다; 이 경우 불확정 백분율은 0을 기준으로 해석되어 definite로 간주됩니다.

콘텐츠 크기 제안
콘텐츠 크기 제안은 관련 축에서의 min-content 크기이며, 선호 종횡비가 있는 경우에는 반대 축의 definite min/max에 의해 종횡비 변환을 통해 제한됩니다.

박스의 내재적 크기(예: 박스의 min-content 크기)를 계산할 때, 콘텐츠 기반 최소 크기는 해당 축에서 박스의 크기를 불확정(indefinite)하게 만듭니다 (예: width 속성이 definite 크기를 지정하더라도). 이는 이 크기를 기준으로 계산된 백분율이 auto처럼 동작하게 함을 의미합니다.

내재적 크기 계산을 제외한 모든 목적에서, 콘텐츠 기반 최소 크기는(명시적 min-content 등과 달리) 박스의 크기를 불확정으로 강제하지 않습니다. 다만 이 최소값이 적용되기 전에 해당 박스의 크기를 기준으로 해석된 백분율이 있다면, 최소값 적용 후에 그 백분율을 다시 해석해야 합니다.

콘텐츠 기반 최소 크기는 종종 적절하고, 콘텐츠가 겹치거나 컨테이너 밖으로 넘치는 것을 방지하는 데 도움이 되지만, 일부 경우에는 적절하지 않을 수 있습니다:

특히 그리드 레이아웃이 문서의 주요 콘텐츠 영역에 사용되는 경우, min-width: 12em 같은 명시적 글꼴 상대 최소 너비를 설정하는 것이 더 낫습니다. 콘텐츠 기반 최소 너비는 큰 테이블이나 큰 이미지가 전체 콘텐츠 영역의 크기를 늘려 오버플로우 영역으로 밀어내고, 그 결과로 텍스트 행이 불필요하게 길어져 가독성을 떨어뜨릴 수 있습니다.

또한, 아이템에 많은 양의 콘텐츠가 있는 경우 콘텐츠 기반 크기 산정을 위해 레이아웃 엔진이 모든 콘텐츠를 순회해야 하므로, 명시적 최소값을 설정하면 이러한 순회가 필요 없어집니다. (콘텐츠가 적은 항목의 경우 이 순회는 사소하므로 성능 문제가 되지 않습니다.)

7. 그리드 정의하기

7.1. 명시적 그리드

세 가지 속성 grid-template-rows, grid-template-columns, 그리고 grid-template-areas는 함께 명시적 그리드그리드 컨테이너에서 정의하며, 명시적 그리드 트랙을 지정합니다. 최종 그리드는 그리드 아이템명시적 그리드 밖에 배치될 경우 더 커질 수 있습니다. 이 경우 암시적 트랙이 생성되며, 이 암시적 트랙은 grid-auto-rowsgrid-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 속성에서 크기를 가져옵니다. 만약 이러한 속성들이 아무런 명시적 트랙을 정의하지 않는다면 명시적 그리드에는 각 축마다 하나의 그리드 라인이 포함됩니다.

grid-placement 속성의 숫자 인덱스는 명시적 그리드의 가장자리부터 카운트합니다. 양수 인덱스는 시작쪽에서 카운트하며 (시작 가장 가까운 명시적 라인부터 1), 음수 인덱스는 쪽에서 카운트합니다 ( 가장 가까운 명시적 라인을 -1부터 시작).

gridgrid-template 속성은 축약형으로, 세 가지 명시적 그리드 속성 (grid-template-rows, grid-template-columns, grid-template-areas) 모두를 동시에 설정할 수 있습니다. grid 축약형은 암시적 그리드를 제어하는 속성도 초기화하지만, grid-template 속성은 이를 변경하지 않습니다.

7.2. 명시적 트랙 크기 지정: grid-template-rowsgrid-template-columns 속성

이름: grid-template-columns, grid-template-rows
값: none | <track-list> | <auto-track-list> | subgrid <line-name-list>?
초기값: none
적용 대상: 그리드 컨테이너
상속: 아니오
퍼센트값: 콘텐츠 영역의 해당 치수 기준
계산값: 키워드 none 또는 계산된 트랙 리스트
표준 순서: 문법 순서대로
애니메이션 타입: 리스트 길이가 같다면, 계산값 타입별로 계산된 트랙 리스트의 각 항목별로(자세한 내용은 § 7.2.5 트랙 리스트의 계산값§ 7.2.3.3 repeat()의 보간/결합 참고); 그렇지 않으면 불연속

이 속성들은 공백으로 구분된 트랙 리스트라인 이름트랙 크기 함수그리드에 지정합니다. grid-template-columns 속성은 그리드의 열에 대한 트랙 리스트를, grid-template-rows는 행에 대한 트랙 리스트를 지정합니다.

값의 뜻은 다음과 같습니다:

none
이 속성에서 명시적 그리드 트랙이 생성되지 않음을 나타냅니다. (명시적 그리드 트랙은 grid-template-areas에 의해 여전히 생성될 수 있습니다.)

참고: 명시적 그리드가 없는 경우 모든 행/열은 암시적으로 생성되며, 그 크기는 grid-auto-rowsgrid-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번 라인부터 할당됩니다. 초과된 <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 값에서 정의한 음수가 아닌 길이나 백분율입니다. [CSS-VALUES-3]

<percentage> 값은 열 그리드 트랙에서 내부 인라인 크기 기준, 행 그리드 트랙에서는 내부 블록 크기 기준입니다. 만약 그리드 컨테이너의 크기가 트랙 크기에 따라 결정된다면, <percentage>auto로 처리되어야 하며, 그리드 컨테이너의 내재적 크기를 먼저 계산한 뒤, 해당 그리드 컨테이너 크기에 대해 그리드 및 아이템을 레이아웃할 때 값을 결정합니다.

<flex [0,∞]>
fr 단위를 가진 음수가 아닌 크기로, 트랙의 flex factor를 지정합니다. 각 <flex> 크기를 가진 트랙은 남은 공간을 flex factor에 비례하여 나눠 가집니다. 예를 들어 1fr 2fr로 지정한 경우, 해당 트랙은 남은 공간의 1/3과 2/3을 차지합니다. 자세한 내용은 § 7.2.4 fr 단위를 참고하세요.

참고: flex factor의 합이 1보다 작으면, 남은 공간의 해당 비율만 차지하며, 전체 공간을 늘려 채우지 않습니다.

minmax() 표기법 외부에서 사용 시, 자동 최소값(즉, minmax(auto, <flex>))을 의미합니다.

minmax(min, max)
min 이상 max 이하의 크기 범위를 정의합니다. maxmin보다 작으면, maxmin으로 보정되어(minmax(min, min)) 동작합니다. 최대값으로 <flex> 값을 지정하면 트랙의 flex factor가 되며, 최소값에는 사용할 수 없습니다.

참고: 향후 스펙에서는 <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);

다섯 개의 그리드 라인이 생성됩니다:

  1. 그리드 컨테이너의 시작 가장자리.
  2. 그리드 컨테이너의 시작 가장자리에서 100px.
  3. 이전 라인에서 자유 공간의 절반 거리(즉, 그리드 컨테이너의 너비에서 비탄력적 그리드 트랙의 너비를 뺀 값).
  4. 이전 라인에서 해당 열에 있는 모든 그리드 아이템의 최대 크기만큼 떨어진 거리.
  5. 이전 라인에서 해당 열에 있는 모든 그리드 아이템의 최소 크기 중 가장 큰 값 이상, 그리고 자유 공간의 나머지 절반 이하 거리.

비탄력적 크기 (100px, max-content, min-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-gap, column-gapjustify-content, align-content가 트랙 사이에 추가 공간을 부여할 수 있습니다.

7.2.2. 그리드 라인 이름 지정: [<custom-ident>*] 문법

그리드 라인은 항상 숫자 인덱스로 참조할 수 있지만, 라인 이름을 사용하면 grid-placement 속성을 더 이해하기 쉽고 관리하기 편리하게 만들 수 있습니다. 라인 이름명시적으로 할당할 수 있고, grid-template-rows, grid-template-columns 속성에서 지정하거나, 암시적으로 할당할 수도 있습니다. 이름 있는 그리드 영역에서 grid-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];
}
Image: Named Grid Lines.
이름이 지정된 그리드 라인.

라인 이름span 또는 auto가 될 수 없습니다. 즉, <custom-ident><line-names> production에서 spanauto 키워드를 제외합니다.

7.2.3. 행과 열 반복: repeat() 표기법

repeat() 표기법은 트랙 리스트의 반복되는 조각을 나타냅니다. 반복되는 패턴의 열 또는 행이 많은 경우, 더 간결하게 작성할 수 있도록 해줍니다.

이 예시는 동일한 그리드 정의를 두 가지 방식으로 작성한 것입니다. 두 선언 모두 250px 너비의 "main" 열 4개와 10px 너비의 "gutter" 열로 이루어집니다.
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> )

첫 번째 인자는 반복 횟수를 지정합니다. 두 번째 인자는 트랙 리스트로, 해당 횟수만큼 반복됩니다. 단, 몇 가지 제한이 있습니다:

따라서 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>이 아닌 경우)가 두 개의 <line-names>를 인접하게 배치하면, 이름 리스트가 병합됩니다. 예를 들어, repeat(2, [a] 1fr [b])[a] 1fr [b a] 1fr [b]와 동일합니다.

7.2.3.2. 공간을 채우는 반복: auto-fillauto-fit 반복

subgridded 축에서는, auto-fill 키워드는 <line-name-list>마다 한 번만 유효하며, 이름 리스트가 subgrid에 지정된 grid span과 일치할 때까지 반복됩니다(이미 충족된 경우 0으로 대체).

그 외의 독립 축에서는, auto-fill이 반복 횟수로 주어지면, 그리드 컨테이너가 해당 축에서 확정적인 선호 크기최대 크기를 갖고 있으면, 반복 횟수는 그리드컨텐츠 박스를 넘치지 않는 가장 큰 양수 정수(여기서 gap도 고려됨)가 됩니다. 만약 어떤 반복 횟수도 넘친다면, 1회만 반복합니다. 그 외에 그리드 컨테이너가 해당 축에서 확정적인 최소 크기를 갖고 있다면, 반복 횟수는 최소 요구 조건을 만족하는 가장 작은 양수 정수입니다. 그렇지 않을 경우, 지정된 트랙 리스트는 한 번만 반복됩니다.

이 목적을 위해, 각 트랙은 최대 트랙 크기 함수확정적이면 그것으로, 그렇지 않으면 최소 트랙 크기 함수가 확정적이면 그것으로 처리합니다. 둘 다 확정적이면 최대 트랙 크기 함수최소 트랙 크기 함수로 바닥 처리합니다. 둘 다 확정적이지 않으면 반복 횟수는 1입니다.

예를 들어, 아래 코드는 윈도우 너비에 맞게 25자 너비의 열을 최대한 많이 생성합니다. 남은 공간이 있다면, 25자 열에 분배됩니다.
body {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(25ch, 1fr));
}

auto-fit 키워드는 auto-fill과 동일하게 동작하지만, 그리드 아이템 배치 이후에 비어있는 반복 트랙은 축소됩니다. 비어있는 트랙이란 해당 트랙에 flow 내 그리드 아이템이 놓이거나 걸치지 않은 트랙입니다. (모든 트랙이 모두 축소될 수도 있습니다.)

축소된 그리드 트랙은 고정 트랙 크기 함수 0px로 간주되며, 해당 트랙 양쪽의 gutter도(분배 정렬 공간 포함) 축소됩니다.

독립 축에서 자동 반복 트랙의 개수 계산 시, UA는 트랙 크기를 UA가 지정한 값으로 바닥 처리해야 하며, 0으로 나누는 것을 방지하기 위해 1px으로 바닥치는 것이 권장됩니다.

7.2.3.3. repeat()의 보간/결합

두 개의 repeat() 표기법이 첫 번째 인자(반복 횟수)가 같고, 두 번째 인자(트랙 리스트)의 트랙 개수도 같다면, 각 계산된 트랙 리스트의 구성 요소를 계산값 기준으로 결합합니다(최상위 트랙 리스트 결합 방식과 동일). 그렇지 않으면 불연속적으로 결합합니다.

7.2.4. 유연한 길이: fr 단위

유연한 길이 또는 <flex>fr 단위를 갖는 치수로, 남은 공간의 일부를 의미합니다(그리드 컨테이너 기준). fr 단위로 크기가 지정된 트랙은 유연 트랙이라 하며, 남은 공간에 따라 유연하게 늘어나거나 줄어듭니다(마치 flex item이 0 base size일 때 flex container의 공간을 채우는 방식과 비슷).

남은 공간의 분배는 모든 비유연 트랙 크기 함수가 최대치에 도달한 후에 발생합니다. 해당 행이나 열의 전체 크기를 가용 공간에서 빼서 남은 공간을 구하고, 그 후 flex 크기를 가진 행과 열에 flex factor에 비례하여 나눠줍니다.

각 행이나 열이 남은 공간에서 차지하는 비율은 <flex> * <leftover space> / <전체 flex factor 합>으로 계산할 수 있습니다.

<flex> 값이 0fr과 1fr 사이일 때는 특별한 동작을 합니다: flex factor의 합이 1보다 작으면 남은 공간의 100%보다 적게 차지합니다.

트랙의 <flex> 값은 남은 공간의 일정 비율을 요청하는 것으로, 1fr은 "남은 공간의 100%"를 의미합니다. 해당 축의 트랙들이 총 100%를 초과해 요청하면, 요청 비율을 유지하되 남은 공간을 정확히 100%만 사용하도록 비율을 재조정합니다. 반대로 트랙들이 전체 공간보다 적게(예: 세 트랙이 각각 .25fr) 요청하면, 각각 요청한 만큼(남은 공간의 25%씩)만 차지하고 나머지 25%는 비어 남습니다. 정확한 남은 공간 분배 방식은 § 12.7 유연 트랙 확장 참고.

이 패턴은 fr 값이 0에 가까워질 때 연속적인 동작을 위해 필요합니다 (트랙이 남은 공간을 아예 원하지 않을 때). 이 패턴이 없다면 1fr 트랙뿐만 아니라 0.1fr, 0.01fr 등도 모두 남은 공간을 전부 차지하다가 어느 순간 0으로 떨어지면 갑자기 아무 공간도 차지하지 않게 됩니다. 이 동작을 통해 flex factor가 1fr 아래로 줄면서 점진적으로 공간을 덜 차지하게 되고, 0이 되면 자연스럽게 남은 공간을 차지하지 않게 됩니다.

이 "부분 채우기" 동작이 특별히 필요하지 않다면, 작성자는 값 ≥ 1을 사용하는 게 좋습니다. 예를 들어, 1fr2fr을 사용하는 것이 .33fr.67fr을 쓰는 것보다, 트랙이 추가/삭제될 때 의도대로 동작할 확률이 높습니다.

사용 가능한 공간이 무한대인 경우 (즉, grid container의 너비 또는 높이가 indefinite일 때), flex 크기를 가진 grid track은 해당 콘텐츠에 맞게 각각의 비율을 유지하면서 크기가 결정됩니다. 각 flex 크기 grid track의 사용된 크기는 각 flex 크기 grid trackmax-content 크기를 구한 뒤, 해당 flex factor로 나누어 “가상 1fr 크기”를 정합니다. 이 중 최대값이 최종적으로 결정되는 1fr 길이(flex fraction)로 사용되며, 이 값에 각 grid trackflex factor를 곱해 최종 크기가 결정됩니다.

참고: <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-rows 또는 grid-template-columns 속성에서 독립 축에 대해, 사용된 값이 됩니다. 직렬화 방법:

위 리스트의 첫 번째 항목은 암시적 트랙이 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 Working Group은 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
적용 대상: 그리드 컨테이너
상속: 아니오
퍼센트값: 해당 없음
계산값: 키워드 none 또는 문자열 값 리스트
표준 순서: 문법 순서대로
애니메이션 타입: 불연속

이 속성은 이름 있는 그리드 영역을 지정합니다. 이는 특정 그리드 아이템과 연결되지 않으며, grid-placement 속성에서 참조할 수 있습니다. grid-template-areas 속성의 문법은 그리드 구조를 시각화하는 역할도 하며, 그리드 컨테이너의 전체 레이아웃을 더 쉽게 이해할 수 있게 합니다.

값의 의미는 다음과 같습니다:

none
이름 있는 그리드 영역명시적 그리드 트랙 모두 이 속성으로는 정의되지 않음을 나타냅니다 (명시적 그리드 트랙은 grid-template-columns 또는 grid-template-rows로는 정의될 수 있음).

참고: 명시적 그리드가 없으면 모든 행/열은 암시적으로 생성되며, 그 크기는 grid-auto-rowsgrid-auto-columns 속성에 따라 결정됩니다.

<string>+
grid-template-areas 속성에 나열된 각 문자열마다 행이 생성되고, 각 문자열의 셀마다 열이 생성됩니다. 파싱 방법:

문자열을 아래 토큰 리스트로 토큰화합니다(가장 긴 일치 우선):

  • ident 코드 포인트 시퀀스: 이름 셀 토큰을 나타내며, 코드 포인트로 이름을 생성.
  • "."(U+002E FULL STOP) 하나 이상 시퀀스: 널 셀 토큰을 나타냄.
  • 공백 시퀀스: 아무 것도 나타내지 않음(토큰 생성 안 함).
  • 기타 모든 문자 시퀀스: 쓰레기 토큰을 나타냄.

참고: 이 규칙으로 <ident> 문법과 일치하지 않는 셀 이름이 생성될 수 있음(예: "1st 2nd 3rd"), 다른 속성에서 해당 영역을 참조할 때는 이스케이프 필요 (예: grid-row: \31st;1st 영역 참조).

모든 문자열은 동일한 셀 토큰 개수(이름 셀 토큰 및/또는 널 셀 토큰)와 최소 하나의 셀 토큰을 정의해야 하며, 그렇지 않으면 선언이 무효. 이름 있는 그리드 영역이 여러 그리드 셀을 걸치지만, 이들이 하나의 채워진 사각형이 아니면 선언이 무효입니다.

참고: 비사각형 또는 끊어진 영역은 추후 버전에서 허용될 수 있습니다.

아래 예시에서 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에서 직렬화할 경우, 각 널 셀 토큰은 "."(U+002E FULL STOP) 하나로 직렬화되며, 연속된 셀 토큰은 한 칸의 공백(U+0020 SPACE)으로 구분되고, 그 외의 모든 공백은 생략됩니다.

7.3.2. 암시적으로 할당된 라인 이름

grid-template-areas 속성은 템플릿 내 이름 있는 그리드 영역에서 암시적으로 할당된 라인 이름을 생성합니다. 각 이름 있는 그리드 영역 foo마다 네 개의 암시적으로 할당된 라인 이름이 생성됩니다: 두 개는 foo-start로, 해당 이름 있는 그리드 영역의 행 시작/열 시작 라인의 이름이 되고, 두 개는 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-columns, grid-template-rows, grid-template-areas를 한 번에 설정합니다. 여러 가지 구문 형태가 존재합니다:

none
세 속성을 모두 초기값(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;

그리고 아래와 같은 그리드를 만듭니다:

  • 세 열: auto, 1fr, auto
  • 두 행: auto, 1fr
  • 맨 위 라인 이름: “header-top”, “a-start” 중간 라인 이름: “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 art”에서 행/열과 1:1로 대응되어야 하기 때문입니다.

참고: grid 축약형도 같은 구문을 허용하지만, 암시적 그리드 속성도 초기값으로 초기화합니다. 따로 속성을 계단식으로 적용할 필요가 없다면, gridgrid-template 대신 사용하는 것이 좋습니다.

7.5. 암시적 그리드

grid-template-rows, grid-template-columns, grid-template-areas 속성은 명시적 그리드에 해당하는 트랙 수를 고정으로 정의합니다. 그리드 아이템이 이 범위 밖에 배치될 경우, 그리드 컨테이너암시적 그리드 트랙을 생성하며, 암시적 그리드 라인그리드에 추가합니다. 이 라인들은 명시적 그리드와 함께 암시적 그리드를 구성합니다. grid-auto-rowsgrid-auto-columns 속성이 이러한 암시적 그리드 트랙의 크기를 결정하며, grid-template-areas로 생성되었으나 grid-template-rows 또는 grid-template-columns로 크기가 지정되지 않은 명시적 그리드 트랙에도 적용됩니다.

grid-auto-flow 속성은 명시적 위치가 없는 그리드 아이템의 자동 배치를 제어합니다. 명시적 그리드가 모두 채워지거나 (명시적 그리드가 전혀 없을 경우) 자동 배치로 인해 암시적 그리드 트랙이 생성됩니다.

grid 축약형 속성은 암시적 그리드 속성(grid-auto-flow, grid-auto-rows, grid-auto-columns)을 명시적 그리드 속성과 함께 한 번에 설정할 수 있습니다.

7.6. 암시적 트랙 크기 지정: grid-auto-rowsgrid-auto-columns 속성

이름: grid-auto-columns, grid-auto-rows
값: <track-size>+
초기값: auto
적용 대상: 그리드 컨테이너
상속: 아니오
퍼센트값: 트랙 크기 지정 참고
계산값: 트랙 크기 지정 참고
표준 순서: 문법 순서대로
애니메이션 타입: 리스트 길이가 같으면 각 항목의 계산값 타입에 따라, 그렇지 않으면 불연속

grid-auto-columnsgrid-auto-rows 속성은 grid-template-rows 또는 grid-template-columns로 크기가 지정되지 않은 트랙의 크기를 지정합니다. 여러 트랙 크기가 주어지면, 해당 패턴을 반복하여 영향을 받는 트랙의 크기를 결정합니다. 명시적으로 크기 지정된 마지막 트랙 이후 첫 번째 트랙은 첫 번째 지정된 크기를 받고, 이후로 계속 진행합니다; 그리고 명시적 그리드 이전의 마지막 암시적 그리드 트랙은 마지막 지정된 크기를 받고, 이후로는 역방향으로 적용됩니다.

참고: 그리드 아이템이 grid-template-rows/grid-template-columns 및/또는 grid-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>
첫 번째 행+열에 명시적으로 20px×20px 그리드 셀이 하나 있고, 추가 그리드 아이템을 담기 위해 암시적으로 생성된 40px 열과 행으로 인해 세 개의 셀이 더 생기는 2×2 그리드.

7.7. 자동 배치: grid-auto-flow 속성

이름: grid-auto-flow
값: [ row | column ] || dense
초기값: row
적용 대상: 그리드 컨테이너
상속: 아니오
퍼센트값: 해당 없음
계산값: 지정된 키워드
표준 순서: 문법 순서대로
애니메이션 타입: 불연속

명시적으로 배치되지 않은 그리드 아이템그리드 컨테이너의 빈 공간에 자동 배치 알고리즘에 의해 자동 배치됩니다. grid-auto-flow자동 배치 알고리즘의 동작 방식을 제어하며, 자동 배치된 아이템이 그리드에 어떻게 흐르는지 명확히 지정합니다. 자동 배치 알고리즘의 정확한 동작 방식은 § 8.5 그리드 아이템 배치 알고리즘 참고.

row
자동 배치 알고리즘은 각 행을 차례로 채우며, 필요에 따라 새로운 행을 추가합니다. rowcolumn이 모두 없으면, row가 기본값입니다.
column
자동 배치 알고리즘은 각 열을 차례로 채우며, 필요에 따라 새로운 열을 추가합니다.
dense
지정된 경우 자동 배치 알고리즘은 "dense" 채우기 방식을 사용합니다. 이는 나중에 더 작은 아이템이 오면 그리드 앞부분의 빈 공간을 우선 채우려 시도합니다. 이로 인해, 아이템들이 원래 순서에서 벗어나 보일 수 있습니다. 더 큰 아이템이 남긴 빈 공간을 채우기 위해 아이템의 배치 순서가 달라질 수 있습니다.

생략된 경우, "sparse" 알고리즘이 사용되어, 배치 알고리즘은 아이템을 배치할 때 항상 그리드에서 앞으로만 이동하며, 빈 공간을 채우기 위해 되돌아가지 않습니다. 이 방식은 자동 배치된 아이템들이 순서대로 나타나도록 보장하지만, 나중 아이템으로 빈 공간을 채울 수 있어도 비어 있는 채로 둘 수 있습니다.

참고: 이 모듈의 향후 버전에서는 자동 위치 아이템을 하나의 "기본" 셀로 함께 흐르게 하는 값을 추가할 예정입니다.

자동 배치는 그리드 아이템order-modified document order에 따라 처리합니다.

아래 예시에서는 3개의 열이 있고, 각 열은 내용에 따라 자동 크기가 지정됩니다. 행은 명시적으로 정의되지 않았습니다. grid-auto-flow 속성은 row이며, 그리드는 첫 번째 행부터 세 개의 열을 탐색하고, 다음 행으로 넘어가며, 필요한 만큼 행을 추가하여 자동 배치된 그리드 아이템의 위치에 충분한 공간을 만들게 합니다.
Image: A form arranged using automatic placement.

자동 배치로 정렬된 폼 예시.

<style type="text/css">
form {
  display: grid;
  /* 세 개의 열을 정의하며, 모두 내용 기반 크기이고,
     해당 라인에 이름을 부여함. */
  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 {
  /* 모든 input/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-rows, grid-template-columns, grid-template-areas) 와 암시적 그리드 속성(grid-auto-rows, grid-auto-columns, grid-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 서브 속성은 초기값으로 초기화됩니다.

참고: 하나의 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와 같은 self-align 속성이 실제 위치를 결정합니다. 그리드 아이템이 차지하는 셀은 그리드의 행과 열 크기에도 영향을 주며, § 12 그리드 레이아웃 알고리즘에서 정의됩니다.

그리드 아이템그리드 영역그리드 내에서 어디에 위치하는지는 배치(placement) 에 의해 정의됩니다. 배치는 그리드 위치그리드 span으로 구성됩니다:

그리드 위치
그리드 아이템이 각 축에서 그리드 내에서 위치하는 곳. 그리드 위치확정적(명시적으로 지정됨) 또는 자동(자동 배치에 의해 결정됨)일 수 있습니다.
그리드 span
그리드 아이템이 각 축에서 차지하는 그리드 트랙의 개수. 한 축에서의 그리드 span암시적, 명시적, 자동일 수 있습니다:

grid-placement 속성—​롱핸드 grid-row-start, grid-row-end, grid-column-start, grid-column-end, 그리고 축약형 grid-row, grid-column, grid-area—​를 사용해 작성자는 그리드 아이템배치를 아래 여섯 가지 정보 중 아무거나(또는 아무것도)로 지정할 수 있습니다:

Start row-start 라인 column-start 라인
End row-end 라인 column-end 라인
Span row span column span

한 차원에서 Start, End, Span 중 두 개 값을 알면, 세 번째 값도 확정됩니다.

8.1. 그리드 배치의 일반적인 패턴

이 절은 참고용입니다.

grid-placement 속성 롱핸드는 세 가지 축약형으로 구성됩니다:

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. 숫자 인덱스와 span

그리드 아이템은 숫자로 위치와 크기를 지정할 수 있습니다. 이는 스크립트 기반 레이아웃에서 특히 유용합니다:

.two {
  grid-row: 2;    /* 두 번째 행에 아이템 배치 */
  grid-column: 3; /* 세 번째 열에 아이템 배치 */
  /* grid-area: 2 / 3; 과 동일 */
}

기본적으로 그리드 아이템의 span 값은 1입니다. 다른 span 값을 명시적으로 지정할 수 있습니다:

.three {
  grid-row: 2 / span 5;
  /* 2번째 행에서 시작,
     아래로 5행(span) 걸침(7번째 행에서 끝). */
}

.four {
  grid-row: span 5 / 7;
  /* 7번째 행에서 끝나고,
     위로 5행 걸침(2번째 행에서 시작). */
}

참고: 그리드 인덱스는 writing mode 기준입니다. 예를 들어 아랍어처럼 오른쪽에서 왼쪽으로 쓰는 언어에서는 첫 번째 열이 가장 오른쪽 열입니다.

8.1.3. 이름 라인과 span

라인을 숫자가 아니라 라인 이름으로 참조할 수도 있습니다:

.five {
  grid-column: first / middle;
  /* "first" 라인부터 "middle" 라인까지 span. */
}

참고: 만약 이름 있는 그리드 영역라인 이름과 동일한 이름을 가지면, 배치 알고리즘은 이름 영역의 라인을 우선 사용합니다.

동일한 이름의 라인이 여러 개 있으면, 실제로는 이름 집합이 만들어지고, 배치 시 이름으로 필터링해 인덱싱할 수 있습니다:

.six {
  grid-row: text 5 / text 7;
  /* "text" 이름의 5번째~7번째 라인 사이 span */
  grid-row: text 5 / span text 2;
  /* 위와 동일 - "text" 이름의 5번째 라인에서 시작,
     이후 "text" 라인 두 개(span) 걸쳐 7번째까지. */
}

8.1.4. 자동 배치

그리드 아이템은 다음 사용 가능한 빈 그리드 셀에 자동 배치될 수 있으며, 공간이 없으면 그리드가 자동으로 커집니다.

.eight {
  grid-area: auto; /* 초기값 */
}

예를 들어, 카탈로그 사이트에서 여러 판매 상품을 그리드 패턴으로 나열할 때 사용할 수 있습니다.

자동 배치와 명시적 span을 같이 쓸 수도 있어, 아이템이 여러 셀을 차지하게 할 수도 있습니다:

.nine {
  grid-area: span 2 / span 3;
  /* 자동 배치된 아이템이 두 행, 세 열을 차지. */
}

자동 배치 알고리즘이 행을 기준으로 탐색+추가할지, 열을 기준으로 탐색+추가할지는 grid-auto-flow 속성으로 제어합니다.

참고: 기본적으로 자동 배치 알고리즘은 그리드를 순차적으로 탐색하며 되돌아가지 않습니다. 큰 아이템을 배치하기 위해 빈 공간을 건너뛰면, 다시 돌아가서 그 공간을 채우지 않습니다. 이 동작을 바꾸려면, dense 키워드를 grid-auto-flow에 지정하면 됩니다.

8.2. 그리드 아이템 배치 vs. 소스 순서

“큰 힘에는 큰 책임이 따릅니다.”

grid-placement 속성의 기능으로 그리드 내에서 콘텐츠를 자유롭게 배치·순서 변경할 수 있어, 시각적 표현이 문서 소스 순서와 크게 달라질 수 있습니다. 이 기능을 활용하면 작성자가 다양한 기기, 다양한 표시 방식에 맞춰 렌더링을 자유롭게 조정할 수 있습니다 (예: 미디어 쿼리 등). 하지만 올바른 소스 순서의 대체는 아닙니다.

올바른 소스 순서는 음성, 순차 탐색(예: 키보드 탐색), 검색엔진·촉각 브라우저 등 CSS 아닌 UA에 중요합니다. 그리드 배치는 시각적 표현에만 영향을 줍니다! 작성자는 문서 소스를 비CSS/비시각적 상호작용에 최적화하고, 그리드 배치로 시각적 표현만 추가 조정하여 소스 순서를 그대로 유지할 수 있습니다.

8.3. 라인 기반 배치: grid-row-start, grid-column-start, grid-row-end, grid-column-end 속성

이름: grid-row-start, grid-column-start, grid-row-end, grid-column-end
값: <grid-line>
초기값: auto
적용 대상: 그리드 아이템, 포함 블록이 그리드 컨테이너인 절대 위치 박스
상속: 아니오
퍼센트값: 해당 없음
계산값: 지정된 키워드, 식별자, 정수
표준 순서: 문법 순서대로
애니메이션 타입: 불연속
<grid-line> =
  auto |
  <custom-ident> |
  [ [ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>? ] |
  [ span && [ <integer [1,∞]> || <custom-ident> ] ]

grid-row-start, grid-column-start, grid-row-end, grid-column-end 속성은 그리드 아이템의 크기와 위치를 그리드 내에서 라인, span, 혹은 자동(아무 것도 지정 안 함)으로 결정합니다. 즉, 배치에 기여하며, inline-start, block-start, inline-end, block-end 끝을 그리드 영역에서 지정합니다.

값의 의미는 다음과 같습니다:

<custom-ident>
먼저 그리드 영역의 끝을 이름 있는 그리드 영역과 매칭 시도: 그리드 라인라인 이름<custom-ident>-start(grid-*-start용) / <custom-ident>-end(grid-*-end용)인 라인이 있으면, 해당 라인 중 첫 번째를 그리드 아이템배치에 사용합니다.

참고: 이름 있는 그리드 영역은 이 형태의 암시적으로 할당된 라인 이름을 자동 생성하며, grid-row-start: foo 지정 시 해당 이름 영역의 시작 라인을 선택합니다(단, 앞서 명시적으로 foo-start가 지정되어 있으면 그 라인을 우선 사용).

그 외에는, 1 정수와 <custom-ident>가 함께 지정된 것과 동일하게 처리합니다.

[ <integer [-∞,-1]> | <integer [1,∞]> ] && <custom-ident>?
N번째 그리드 라인그리드 아이템배치에 사용합니다. 음수는 끝에서부터 역순으로 카운트하며, 명시적 그리드의 끝에서부터 시작합니다.

이름(<custom-ident>)이 있으면, 해당 이름 라인만 카운트합니다. 부족할 경우, 암시적 그리드 라인은 모두 해당 이름을 갖는 것으로 간주합니다.

<integer> 값이 0이면 선언이 무효입니다.

span && [ <integer [1,∞]> || <custom-ident> ]
grid span그리드 아이템배치에 기여하게 하며, 해당 그리드 아이템그리드 영역의 해당 끝이 반대쪽 끝에서 N 라인 떨어지도록 합니다. 예를 들어, grid-column-end: span 2grid-column-start 라인에서 끝 쪽으로 두 번째 그리드 라인을 의미합니다.

이름이 있으면(<custom-ident>), 해당 이름의 라인만 카운트합니다. 부족하면, 암시적 그리드 라인은 해당 방향의 명시적 그리드 끝 쪽에 모두 해당 이름을 갖는 것으로 간주하여 span을 카운트합니다.

예를 들어, 아래 선언을 보면:
.grid { grid-template-columns: 100px; }
.griditem { grid-column: span foo / 4; }

그리드 컨테이너명시적 그리드에 두 개의 그리드 라인(1, 2번)을 가지고 있습니다. 그리드 아이템의 column-end 끝은 4번 라인에 지정되어 있으므로, 끝 쪽에 암시적으로 두 개의 라인이 생성됩니다.

column-start 끝은 그 기준에서 시작 쪽으로 첫 번째 "foo" 라인을 찾으려 합니다. 그리드에 "foo" 라인이 없으므로, 가능한 라인은 암시적 그리드 쪽에만 있습니다. 3번 라인은 명시적 그리드의 끝 쪽에 있으므로 대상이 아니고, grid-column-start span은 시작 쪽을 탐색하므로, 결국 암시적 그리드가 명시적 그리드의 시작 쪽에 라인을 생성하게 됩니다.

결과 예시.

<integer>가 생략되면 기본값은 1입니다. 음수나 0은 무효입니다.

auto
속성은 그리드 아이템배치에 아무 것도 기여하지 않으며, 자동 배치 또는 기본 span 1을 의미합니다. (위의 § 8 그리드 아이템 배치하기 참고)

모든 위의 생산식에서, <custom-ident>spanauto 키워드를 추가로 제외합니다.

단일 행, 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;
/* 오류: 끝 span은 무시되며, 자동 배치 아이템은 이름 라인까지 span 불가.
   ''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. 그리드 배치 충돌 처리

배치에 두 개의 라인이 있을 때, 그리드 아이템start 라인이 end 라인보다 더 end-ward라면, 두 라인을 서로 바꿉니다. start 라인이 동일하다면 end 라인을 제거합니다.

배치에 두 개의 span이 있으면, end grid-placement 속성에서 기여된 span을 제거합니다.

배치가 이름 라인에 대한 span만 포함한다면, span을 1로 대체합니다.

8.4. 배치 축약형: grid-column, grid-row, grid-area 속성

이름: grid-row, grid-column
값: <grid-line> [ / <grid-line> ]?
초기값: auto
적용 대상: 그리드 아이템, 포함 블록이 그리드 컨테이너인 절대 위치 박스
상속: 아니오
퍼센트값: 해당 없음
계산값: 각 속성별로 다름
애니메이션 타입: 불연속
표준 순서: 문법 순서대로

grid-rowgrid-column 속성은 grid-row-start/grid-row-endgrid-column-start/grid-column-end의 축약형입니다.

두 개의 <grid-line> 값이 지정된 경우, grid-row-start/grid-column-start 롱핸드는 슬래시 앞의 값으로, grid-row-end/grid-column-end 롱핸드는 슬래시 뒤의 값으로 설정됩니다.

두 번째 값이 생략된 경우, 첫 번째 값이 <custom-ident>이면, grid-row-end/grid-column-end 롱핸드도 그 <custom-ident>로 설정됩니다. 아니면 auto로 설정됩니다.

이름: grid-area
값: <grid-line> [ / <grid-line> ]{0,3}
초기값: auto
적용 대상: 그리드 아이템, 포함 블록이 그리드 컨테이너인 절대 위치 박스
상속: 아니오
퍼센트값: 해당 없음
계산값: 각 속성별로 다름
애니메이션 타입: 불연속
표준 순서: 문법 순서대로

grid-area 속성은 축약형으로 grid-row-start, grid-column-start, grid-row-end 그리고 grid-column-end를 한 번에 설정합니다.

네 개의 <grid-line> 값이 지정된 경우, grid-row-start는 첫 번째 값, grid-column-start는 두 번째 값, grid-row-end는 세 번째 값, grid-column-end는 네 번째 값으로 설정됩니다.

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>이면, 모든 롱핸드가 그 값으로 설정됩니다. 아니면 auto로 설정됩니다.

참고: 이 축약형의 해석 순서는 row-start/column-start/row-end/column-end이며, CCW(LTR 페이지 기준)로 진행됩니다. 이는 margin 등 물리적 방향을 사용하는 관련 4-엣지 속성과 반대 방향입니다.

8.5. 그리드 아이템 배치 알고리즘

아래 그리드 아이템 배치 알고리즘자동 위치확정 위치로 변환하여, 모든 그리드 아이템이 명확한 그리드 영역에 배치되도록 합니다. (grid span은 특별한 해석 없이, 명시적으로 지정되지 않으면 기본값 1입니다.)

참고: 이 알고리즘은 암시적 그리드에 새로운 행이나 열을 만들 수도 있습니다. 명시적 그리드에 자동 배치된 그리드 아이템을 놓을 공간이 없을 때 발생합니다.

모든 그리드 셀(명시적암시적 그리드 모두) 점유됨 또는 비점유됨 상태가 될 수 있습니다. 셀은 grid area확정된 그리드 위치를 가진 그리드 아이템에 의해 덮여 있을 때 점유됨 상태입니다; 그렇지 않으면, 해당 셀은 비점유됨 상태입니다. 셀의 점유됨/비점유됨 상태는 이 알고리즘 중에 변경될 수 있습니다.

명확성을 위해, 이 알고리즘은 grid-auto-flowrow로 지정되어 있다고 가정합니다. column이라면, 아래 알고리즘의 행/열, 인라인/블록 관련 언급을 모두 바꿔 적용합니다.

참고: 자동 배치 알고리즘그리드 아이템order-modified document order 순서로 처리하며, 원래 문서 순서가 아님을 주의하세요.

  1. 익명 그리드 아이템 생성 § 6 그리드 아이템 참고. (익명 그리드 아이템은 항상 자동 배치되며, 박스에 grid-placement 속성을 지정할 수 없습니다.)

  2. 자동 배치가 아닌 아이템 배치.

  3. 특정 행에 고정된 아이템 처리.

    그리드 아이템확정된 행 위치가 있는 것(grid-row-start, grid-row-end 속성으로 확정 위치 정의됨)을 order-modified document order 순서로 다음과 같이 처리:

    "sparse" 채우기(기본 동작)

    해당 아이템의 배치에서 column-start 라인을 겹치지 않는 가장 빠른(가장 작은 양수 인덱스) 라인으로 설정, 이 행에서 앞선 단계에서 이미 배치된 다른 아이템 이후의 위치로 설정.

    "dense" 채우기(dense 지정)

    해당 아이템의 배치에서 column-start 라인을 겹치지 않는 가장 빠른(가장 작은 양수 인덱스) 라인으로 설정.

  4. 암시적 그리드에서 열 결정.

    암시적 그리드에서 열 생성:

    1. 명시적 그리드의 열로 시작.

    2. 모든 확정된 열 위치를 갖는 아이템(명시적 위치 지정, 앞 단계에서 배치된 아이템, 아직 배치 전이나 확정 열 위치 있음) 중, 그 아이템을 수용하기 위해 암시적 그리드의 시작/끝에 필요한 만큼 열 추가.

    3. 확정된 열 위치가 없는 아이템 중 가장 큰 열 span이 암시적 그리드 너비보다 크면, 그 span만큼 암시적 그리드 끝에 열 추가.

    아래 스타일 예시:
    #grid {
      display: grid;
      grid-template-columns: repeat(5, 100px);
      grid-auto-flow: row;
    }
    #grid-item {
      grid-column: 4 / span 3;
    }
    

    필요한 열 개수는 6개입니다. 명시적 그리드grid-template-columns에서 5개 열(1~6번 라인)을 제공하지만, #grid-item의 column 위치는 7번 라인에서 끝나므로, 암시적 그리드 끝에 열을 하나 더 추가해야 합니다.

  5. 나머지 그리드 아이템 배치.

    auto-placement 커서는 그리드의 현재 "삽입 위치"를 정의합니다. 행/열 그리드 라인 쌍으로 지정됩니다. 초기 커서는 암시적 그리드의 가장 시작 행/열 라인에 위치합니다.

    사용 중인 grid-auto-flow 값에 따라 아이템 배치 방식이 달라집니다:

    "sparse" 채우기(기본 동작)

    앞 단계에서 배치되지 않은 그리드 아이템order-modified document order로 처리:

    아이템에 확정된 열 위치가 있으면:
    1. 커서의 열 위치를 해당 아이템의 column-start 라인으로 설정. 이전 커서의 열 위치보다 작으면, 행 위치를 1만큼 증가.

    2. 커서의 행 위치를 해당 아이템이 채움 그리드 셀과 겹치지 않는 값이 될 때까지 증가 (필요하면 암시적 그리드에 행 추가).

    3. 아이템의 row-start 라인을 커서의 행 위치로, span에 따라 row-end 라인을 설정.

    두 축 모두 자동 위치이면:
    1. 커서의 열 위치를 해당 아이템이 그리드 영역에서 채움 셀과 겹치지 않거나, 커서 열 위치+아이템 column span이 암시적 그리드의 열 수를 넘길 때까지 증가.

    2. 겹치지 않는 위치가 있으면, 아이템의 row-start/column-start 라인을 커서 위치로 지정. 없으면, 커서의 행 위치를 증가(필요시 암시적 그리드에 행 추가), 커서의 열 위치를 가장 시작 열 라인으로 초기화, 이전 단계로 돌아감.

    "dense" 채우기(dense 지정)

    앞 단계에서 배치되지 않은 그리드 아이템order-modified document order로 처리:

    아이템에 확정된 열 위치가 있으면:
    1. 커서의 행 위치를 암시적 그리드의 가장 시작 행 라인으로 설정. 커서의 열 위치를 아이템의 column-start 라인으로 설정.

    2. 커서의 행 위치를 아이템이 채움 셀과 겹치지 않을 때까지 증가 (필요시 암시적 그리드에 행 추가).

    3. 아이템의 row-start 라인 인덱스를 커서의 행 위치로 설정 (span에 따라 row-end도 암시적으로 설정).

    두 축 모두 자동 위치이면:
    1. 커서의 행/열 위치를 암시적 그리드의 가장 시작 행/열 라인으로 설정.

    2. 커서의 열 위치를 아이템이 그리드 영역에서 채움 셀과 겹치지 않거나, 커서 열 위치+아이템 column span이 암시적 그리드의 열 수를 넘길 때까지 증가.

    3. 겹치지 않는 위치가 있으면, 아이템의 row-start/column-start 라인을 커서 위치로 지정. 없으면, 커서의 행 위치를 증가(필요시 암시적 그리드에 행 추가), 커서의 열 위치를 가장 시작 열 라인으로 초기화, 이전 단계로 돌아감.

9. 서브그리드(Subgrids)

서브그리드는 일반 그리드 컨테이너와 거의 동일하게 동작하지만, 다음과 같은 차이가 있습니다:

10. 절대 위치 지정

10.1. 그리드 컨테이너가 포함 블록일 때

절대 위치 요소의 포함 블록그리드 컨테이너에 의해 생성된 경우, 포함 블록은 해당 요소의 grid-placement 속성에 의해 결정된 그리드 영역에 대응합니다. offset 속성(top/right/bottom/left) 는 이 포함 블록의 해당 끝에서 안쪽으로의 오프셋을 평소처럼 나타냅니다.

참고: 절대 위치 요소를 그리드 컨테이너에 위치시키면 해당 컨테이너의 그리드 라인에 정렬할 수 있지만, 이런 요소는 공간을 차지하지 않으며 그리드 레이아웃에 영향을 주지 않습니다.

.grid {
  grid: 1fr 1fr 1fr 1fr / 10rem 10rem 10rem 10rem;
  /* 그리드 컨테이너에서 4개의 동일한 높이 행,
     각 열은 10rem */
  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 속성플로우 기준이며, offset 속성(left, right, top, bottom)은 물리적 기준입니다. direction이나 writing-mode 속성이 변경되면 그리드는 이에 맞게 변환되지만, offset은 변하지 않습니다.

자동 배치 대신, auto 값이 grid-placement 속성에 사용되면 해당 축에서 배치에 특수 라인이 추가되며, 그 위치는 그리드 컨테이너의 패딩 끝(컨테이너가 넘칠 경우 스크롤 영역의 패딩 끝)에 해당합니다. 이 라인은 절대 위치 아이템 배치에 사용하는 확장 그리드의 첫 번째와 마지막 라인(0번, -0번)이 됩니다.

참고: 기본적으로 절대 위치 박스의 포함 블록그리드 컨테이너의 패딩 끝에 대응하며, 블록 컨테이너와 동일합니다.

절대 위치 지정은 그리드와 그 플로우 내 내용의 레이아웃 이후에 발생하며, 어떤 그리드 트랙의 크기 산정에도 기여하지 않고 그리드의 크기/구성에도 영향을 주지 않습니다. grid-placement 속성이 존재하지 않는 라인을 참조하거나 기존 암시적 그리드 밖으로 span하면, 해당 라인은 새로운 암시적 그리드 라인을 생성하지 않고 auto로 처리됩니다.

참고: 암시적 라인은 모든 라인 이름을 갖는 것으로 간주하므로, 명시적으로 이름이 없는 라인을 참조해도 존재할 수 있습니다.

배치grid span만 포함하면, 해당 축에 auto 라인 두 개로 대체합니다. (이는 해당 축의 grid-placement 속성이 모두 span을 기여하고, § 8.3.1 그리드 배치 충돌 처리에서 두 번째 span이 무시된 경우 발생합니다.)

10.2. 그리드 컨테이너가 부모일 때

그리드 컨테이너의 절대 위치 자식은 플로우 밖이며 그리드 아이템이 아니어서, 다른 아이템의 배치나 그리드 크기에 영향을 주지 않습니다.

static position [CSS2]에서, 그리드 컨테이너의 절대 위치 자식은 해당 컨테이너의 콘텐츠 끝과 일치하는 그리드 영역의 유일한 그리드 아이템인 것처럼 static 위치가 결정됩니다.

참고: 이 위치는 자식의 justify-selfalign-self 값에 영향을 받으며, 대부분의 다른 레이아웃 모델과 마찬가지로, 절대 위치 자식은 포함 블록 크기나 내용 레이아웃에 영향을 주지 않습니다.

11. 정렬 및 간격

그리드 컨테이너그리드 트랙 크기가 결정되고, 모든 그리드 아이템의 크기가 확정된 후, 그리드 아이템은 자신의 그리드 영역 내에서 정렬될 수 있습니다.

참고: 서브그리드그리드 아이템도 정렬(베이스라인 정렬 포함)에 참여하며, 부모 그리드 아이템과 함께 동작합니다. 서브그리드 (h) 참고.

margin 속성을 사용하여, 블록 레이아웃에서와 같이 아이템을 정렬할 수 있습니다. 그리드 아이템박스 정렬 속성(CSS Box Alignment Module [CSS-ALIGN-3])도 지원하며, 행/열 모두에서 키워드 기반 정렬이 가능합니다.

기본적으로 그리드 아이템은 자신의 그리드 영역을 가득 채우도록 늘어납니다. 하지만 justify-self 또는 align-self 값이 stretch가 아니거나 margin이 auto면, 그리드 아이템은 내용에 맞게 자동 크기 지정됩니다.

11.1. gutter: row-gap, column-gap, gap 속성

row-gapcolumn-gap 속성 (그리고 gap 축약형)은 그리드 컨테이너에서 지정하면, gutter그리드 행그리드 열 사이에 정의합니다. 문법은 CSS Box Alignment 3 § 8 박스 간 간격(Gaps Between Boxes)에 정의되어 있습니다.

이 속성은 영향을 받는 그리드 라인이 두꺼워진 것처럼 동작합니다: 그리드 트랙은 두 그리드 라인 사이의 gutter 사이 공간입니다. 트랙 크기 산정을 위해, 각 gutter는 지정된 크기의 추가 빈, 고정 크기 트랙처럼 처리되며, 해당 그리드 라인을 span하는 그리드 아이템은 이 트랙을 함께 span합니다.

참고: justify-content/align-content로 인해 트랙 사이 간격이 추가될 수 있습니다. § 12.1 그리드 크기 산정 알고리즘 참고. 이 공간은 gutter 크기를 효과적으로 늘립니다.

그리드가 트랙 사이에서 fragmented된 경우, 해당 트랙 사이의 gutter 간격은 억제해야 합니다. gutter는 강제 개행 이후에도 억제되며, margin과 다릅니다.

gutter암시적 그리드의 트랙 사이에만 나타나며, 첫 번째 트랙 앞이나 마지막 트랙 뒤에는 gutter가 없습니다. (특히 암시적 그리드의 처음/마지막 트랙과 확장 그리드의 “auto” 라인 사이에는 gutter가 없습니다.)

축소된 트랙의 gutter가 겹침(collapse)되면, 두 gutter는 정확히 일치하며, 시작과 끝이 겹칩니다. 축소된 트랙의 한쪽에 gutter가 없다면 (암시적 그리드의 첫/마지막 트랙 등), gutter가 겹치면 양쪽 모두 gutter가 없어집니다.

11.2. auto margin으로 정렬하기

auto margin그리드 아이템에 사용되면 블록 레이아웃에서의 auto margin과 매우 비슷하게 동작합니다:

11.3. 인라인 축 정렬: justify-self, justify-items 속성

그리드 아이템그리드 아이템justify-self 속성이나 justify-items 속성을 그리드 컨테이너에 사용해 인라인 축에서 정렬할 수 있습니다. 자세한 내용은 [CSS-ALIGN-3] 참고.

예를 들어, 영어 문서에서는 인라인 축이 수평이므로, justify-* 속성으로 그리드 아이템을 수평 정렬합니다.

baseline 정렬이 해당 축에서 크기가 내재적으로 결정되는 트랙(크기가 아이템과 베이스라인 정렬에 의존, 순환 의존성 발생)에서 그리드 아이템에 지정되면, 그 아이템은 베이스라인 정렬에 참여하지 않고, 대체 정렬을 원래 지정된 것처럼 사용합니다. 이때 <flex> 트랙 크기도 그리드 컨테이너가 해당 축에서 불확정 크기를 가지면 "내재적으로 결정됨"으로 간주합니다.

참고: 대체 정렬(fallback alignment)이 사용되는지 여부는 레이아웃 과정에서 바뀌지 않으며, 순환이 있으면 항상 적용됩니다.

11.4. 블록 축 정렬: align-self, align-items 속성

그리드 아이템은 블록 축(인라인 축과 직교)에서도 그리드 아이템align-self 속성이나 align-items 속성을 그리드 컨테이너에 사용해 정렬할 수 있습니다. 자세한 내용은 [CSS-ALIGN-3] 참고.

baseline 정렬이 해당 축에서 크기가 내재적으로 결정되는 트랙(크기가 아이템과 베이스라인 정렬에 의존, 순환 의존성 발생)에서 그리드 아이템에 지정되면, 그 아이템은 베이스라인 정렬에 참여하지 않고, 대체 정렬을 원래 지정된 것처럼 사용합니다. 이때 <flex> 트랙 크기도 그리드 컨테이너가 해당 축에서 불확정 크기를 가지면 "내재적으로 결정됨"으로 간주합니다.

11.5. 그리드 정렬: justify-content, align-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-around, space-between, space-evenly) 트랙 간 간격을 띄우거나(stretch), 트랙을 크기 변경할 수 있습니다. 그리드가 트랙 사이에서 fragmented되면, 이런 추가 간격도 억제해야 합니다.

아래 그리드에서는 spanning 아이템의 그리드 영역이 정렬로 인해 gutter에 할당된 추가 공간만큼 늘어납니다:
.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; }
/* 마지막 두 아이템은 마지막 두 그리드 셀에 자동 배치됨 */
10px 갭이 있고 모든 열을 span하는 요소가 있는 그리드.
			          열의 합이 그리드 컨테이너 너비보다 작음.
정렬 전의 그리드
갭이 커져 그리드 컨테이너의 남은 너비를 흡수하는 동일한 그리드.
			          span 요소가 갭에 할당된 추가 공간만큼 커짐.
정렬 후의 그리드

정렬은 (gap 간격과 달리) 그리드 트랙 크기 산정 후에 이루어집니다. 만약 span된 아이템의 내용에 의해 트랙 크기가 결정된다면, 정렬 단계에서 정렬 간격에 맞춰 추가 공간을 갖게 됩니다.

11.6. 그리드 컨테이너 기준선

그리드 컨테이너의 첫(마지막) 기준선은 다음과 같이 결정됩니다:

  1. 그리드 컨테이너의 첫(마지막) 행 중에서 최소한 하나의 그리드 아이템이 있는 행을 찾습니다.

    해당 행을 교차하는 그리드 아이템 중 그 행에서 기준선 정렬에 참여하는 아이템이 있으면, 그리드 컨테이너의 기준선 집합은 해당 그리드 아이템의 공유된 정렬 기준선에서 생성됩니다.

    그렇지 않으면, 그리드 컨테이너의 첫(마지막) 기준선 집합은 행 우선 그리드 순서(컨테이너의 writing mode에 따름)에 따라 해당 행의 첫(마지막) 그리드 아이템정렬 기준선에서 생성됩니다. 만약 그리드 아이템에 그리드의 인라인 축에 정렬 기준선이 없으면, 먼저 테두리 끝에서 합성됩니다.

  2. 그리드 컨테이너그리드 아이템이 하나도 없으면, 그리드 컨테이너는 첫(마지막) 기준선 집합을 갖지 않으며, 필요하면 해당 정렬 컨텍스트의 규칙에 따라 합성됩니다. 이 알고리즘을 종료합니다.

그리드 수정 문서 순서(grid order)는 그리드의 그리드 셀을 순회할 때 그리드 아이템이 나타나는 순서입니다. 두 아이템이 동시에 나타나면, order-modified document order대로 처리합니다.

위 규칙에 따라 기준선을 계산할 때, 기준선을 제공하는 박스가 스크롤이 가능한 overflow 값을 가지면, 그 박스는 기준선 결정 시 초기 스크롤 위치에 있는 것으로 간주합니다.

테이블 셀의 기준선 결정에서, 그리드 컨테이너는 line box나 table-row처럼 기준선을 제공합니다. [CSS2]

기준선에 대한 더 자세한 내용은 CSS Writing Modes 3 § 4.1 기준선 소개CSS Box Alignment 3 § 9 기준선 정렬 상세 참고.

12. 그리드 레이아웃 알고리즘

이 절에서는 그리드 레이아웃 알고리즘을 정의합니다. 이 알고리즘은 그리드 컨테이너의 크기를 결정하고, 모든 그리드 트랙의 크기와 위치를 정하며, 배치된 그리드 영역 내의 그리드 아이템을 레이아웃합니다.

  1. 모든 Grid Item Placement Algorithm을 실행해 그리드 아이템 (서브그리드 및 그 하위 아이템 포함)을 그리드에 배치합니다.

  2. 그리드 컨테이너의 크기를 § 5.2 그리드 컨테이너 크기 지정에 따라 결정합니다.

    참고: 이 단계에서, 트랙 크기의 순환 <percentage>auto로 처리합니다.

  3. 결정된 그리드 컨테이너 크기를 기준으로 Grid Sizing Algorithm을 실행해 그리드의 크기를 결정합니다.

    참고: 이 단계에서는 트랙 크기의 <percentage>그리드 컨테이너 크기를 기준으로 해석됩니다.

  4. 그리드 아이템을 해당 포함 블록에 레이아웃합니다. 각 그리드 영역의 width, height는 이 목적에 대해 확정적(definite)으로 간주합니다.

    참고: 확정 크기만으로 계산된 공식(예: stretch fit 공식)은 역시 확정적이므로, stretch된 그리드 아이템의 크기도 확정적입니다.

12.1. 그리드 크기 산정 알고리즘

이 절에서는 그리드 크기 산정 알고리즘을 정의합니다. 이 알고리즘은 모든 그리드 트랙의 크기를 결정하며, 전체 그리드의 크기도 결정합니다.

각 트랙에는 최소최대 크기 산정 함수(같을 수도 있음)가 지정되어 있습니다. 각 크기 산정 함수는 다음 중 하나입니다:

그리드 크기 산정 알고리즘은 이러한 크기 제약을 실제 트랙 크기로 해석하는 방법을 정의합니다.

  1. 먼저 트랙 크기 산정 알고리즘으로 그리드 열의 크기를 결정합니다.

    이 과정에서, 그리드 컨테이너인라인 축에 서브그리드된 그리드 아이템은 비어있는 것처럼 처리하며, 그 그리드 아이템들(손자)은 그리드 컨테이너의 직접 자식으로 간주합니다. 이 introspection(내부 탐색)은 재귀적으로 적용됩니다.

    블록 축에만 서브그리드되고, 그리드 컨테이너의 인라인 축 크기가 내용에 따라 결정되는 아이템도 내부 탐색에 포함됩니다. 해당 아이템의 크기가 이 축에서 다른 축의 서브그리드 트랙 크기 산정에 의존할 수 있으므로, 해당 아이템이 이 그리드의 열 크기 산정에 기여하는 크기(Resolve Intrinsic Track Sizes 참고)는 해당 아이템의 트랙 크기 산정이 이 알고리즘의 같은 단계까지만 완료된 것처럼 간주합니다. 예를 들어 첫 단계에서는 해당 아이템의 트랙도 이 단계까지만 산정되며, 반복이 발생하면 해당 아이템도 1~3단계를 한 번, 현재 단계도 한 번 완료한 후 크기를 넘깁니다. 이 introspection도 재귀적으로 적용됩니다.

    이 단계에서 그리드 아이템의 레이아웃 계산이 사용 가능한 공간(블록 축 기준)에 따라 달라지면, 사용 가능한 공간을 확정 크기 max track sizing function이 있는 행은 해당 크기로, 나머지 행은 무한대로 간주합니다. 그리드 컨테이너와 모든 트랙이 확정적 크기이면, align-content도 적용해 해당 아이템이 span하는 gap의 최종 크기를 결정합니다. 아니면 트랙 정렬 효과는 무시합니다.

  2. 다음으로 트랙 크기 산정 알고리즘으로 그리드 행의 크기를 결정합니다.

    이 과정에서, 그리드 컨테이너블록 축에 서브그리드된 그리드 아이템은 비어있는 것처럼 처리하며, 그 그리드 아이템들(손자)은 그리드 컨테이너의 직접 자식으로 간주합니다. 이 introspection도 재귀적으로 적용됩니다.

    열 크기 산정과 마찬가지로, 인라인 축에만 서브그리드되고 그리드 컨테이너의 블록 축 크기가 내용에 따라 결정되는 아이템도 내부 탐색에 포함됩니다. (열 크기 산정과 동일하게, 행 크기 산정에 기여하는 크기는 이 알고리즘의 해당 단계까지만 산정된 것으로 간주하며, 이 introspection도 재귀적으로 적용합니다.)

    블록 축 크기 산정에 인라인 축 사용 가능한 공간이 필요한 아이템은, 이전 단계에서 산정된 그리드 열 크기를 사용합니다. 그리드 컨테이너인라인 크기확정적이면, justify-content도 적용해 효과적인 열 gap 크기를 반영합니다.

  3. 그리드 아이템의 min-content contribution이 2단계에서 산정된 행 크기와 정렬로 인해 변경된 경우, 그리드 열의 크기를 새로운 min-contentmax-content contribution으로(단 한 번) 다시 산정합니다.

    블록 축 크기 산정에 인라인 축 사용 가능한 공간이 필요한 아이템은, 이전 단계에서 산정된 그리드 행 크기를 사용합니다. 그리드 컨테이너블록 크기확정적이면, align-content도 적용해 효과적인 행 gap 크기를 반영합니다.

    이 반복은 인라인 크기그리드 아이템블록 크기에 따라 달라지는 경우에 필요합니다. 예: 열이 래핑된 flex 컨테이너 (flex-flow: column wrap), 직교 플로우 (writing-mode), 다단 컨테이너, 행 크기에 따라 크기가 결정되는 비율(aspect-ratio) 요소 및 자식이 비율을 가질 때 포함됨.
  4. 그리드 아이템의 min-content contribution이 3단계에서 산정된 열 크기와 정렬로 인해 변경된 경우, 그리드 행의 크기를 새로운 min-contentmax-content contribution으로(단 한 번) 다시 산정합니다.

    블록 축 크기 산정에 인라인 축 사용 가능한 공간이 필요한 아이템은, 이전 단계에서 산정된 그리드 열 크기를 사용합니다. 그리드 컨테이너인라인 크기확정적이면, justify-content도 적용해 효과적인 열 gap 크기를 반영합니다.

  5. 마지막으로 그리드 컨테이너 내에서 align-contentjustify-content 속성에 따라 트랙을 정렬합니다.

    참고: 이 과정에서 트랙 사이에 추가 공간이 생길 수 있으며, gap을 span하는 그리드 아이템의 영역이 트랙 크기 산정 시 할당된 공간보다 커질 수 있습니다.

참고: 서브그리드 축의 트랙 크기 산정에서는 해당 축의 트랙 내 각 아이템을 부모 그리드의 멤버로 간주합니다. 이런 interlacing(상호 끼워넣기) 때문에 그리드 크기 산정은 각 축별로 서브그리드까지 내려가서 처리해야 하며, 재귀할 때 두 축을 모두 완료하지 않습니다. 즉, 서브그리드직교 플로우를 설정하면, 트랙 크기 산정의 순서가 중첩 그리드와 반대가 될 수 있습니다.

다음 예시에서는 축별 서브그리드의 크기 산정 방법을 보여줍니다:

부모 그리드 컨테이너 A가 있고, 그 안에 열이 서브그리드된 아이템 B가 있으며, 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를 (자신만의 행과 아이템(C, D 등)이 있는 그리드 컨테이너) 단일 아이템으로 처리합니다. B가 행 크기를 산정할 때는 C의 아이템을 B의 행에 넣은 것처럼 처리하고, 열 크기를 산정할 때는 CD처럼 단일 아이템으로 처리합니다. C의 행과 A의 행은 관계가 없습니다. B의 행이 중첩(서브그리드 아님)이기 때문입니다.

고수준에서 그리드 알고리즘은 다음과 같습니다:

  1. 열 크기 산정
  2. 행 크기 산정
  3. 최종 행 크기에 따라 필요한 경우 열 조정

이 예시의 그리드 크기 산정 알고리즘은 다음과 같이 동작합니다:

  1. A의 그리드 열 크기 결정: A의 그리드 아이템 크기를 사용, B는 비어있는 것으로 처리하고, 그 자식들(C, D 포함)을 A의 아이템으로 취급.

    그리드 알고리즘은 D에 대해 단순히 재귀합니다. C는 더 복잡합니다:

    1. C의 열 크기 산정
    2. B의 행 크기를 산정하며 C의 행 크기도 산정
    3. C의 열 조정
    4. C의 최종 열 크기 반환

    B의 행 크기 산정에는 C의 최종 열 크기가 필요합니다. 행 크기가 열 크기에 따라 달라지므로, B의 행은 C의 최종 열 크기에 따라 결정될 수 있습니다. 이런 순환 의존성을 끊기 위해, 알고리즘을 C의 열 크기 초기값에 의존하도록 분리하고, 조정 패스를 나중에 수행해야 합니다. 그래서 C의 경우 열 크기 산정만 먼저 재귀적으로 실행하고, 그 초기 크기를 A에 넘겨 A의 초기 열 크기 산정에 사용합니다.

    나중에 B의 행을 산정할 때, C의 행(서브그리드)을 산정하고, C의 열 크기도 최종 결정합니다. 이로 인해 A의 열 조정 패스에서 B의 열 크기 산정도 다시 트리거할 수 있습니다.

  2. 다음으로 A의 행 크기 결정: A의 그리드 아이템 크기를 사용, B는 단일 아이템으로 처리.

    B는 서브그리드이므로 크기 산정이 다단계로 분리되며, 그리드 알고리즘은 B에 대해 행 크기 산정만 재귀적으로 실행합니다: B의 행 크기를 결정할 때 D는 단일 아이템으로 처리해 최종 크기를 구하고, C는 비어있는 아이템으로 처리하며 자식들을 B의 아이템으로 끌어올림.

    B는 최종 행 크기를 반환하며, 이는 A의 행 크기 산정에 반영됩니다.

  3. 마지막으로 A의 열 크기 확정. B의 행 크기 산정 과정에서 C의 최종 크기가 변하면, B의 열 크기 산정이 다시 트리거되고, A의 열 조정 패스도 다시 실행되어야 합니다.

12.2. 트랙 크기 용어

최소 트랙 크기 함수
트랙이 minmax() 함수로 크기 지정된 경우, 이 값은 해당 함수의 첫 번째 인자입니다. 트랙이 <flex> 값이나 fit-content() 함수로 지정되면 auto입니다. 그 외에는 트랙의 크기 함수입니다.
최대 트랙 크기 함수
트랙이 minmax() 함수로 크기 지정된 경우, 이 값은 해당 함수의 두 번째 인자입니다. 그 외에는 트랙의 크기 함수입니다. 모든 경우, autofit-content()max-content로 취급합니다. 단, fit-content()에 명시적으로 다른 규정이 있으면 예외입니다.
사용 가능한 그리드 공간
각 축별로 독립적으로, 사용 가능한 그리드 공간은 다음과 같습니다:

참고: auto 크기는 내용 기반 크기를 의미하며 (예: 수평 writing mode에서 블록 레벨 박스의 높이), max-content와 동일하게 처리됩니다.

모든 경우, 사용 가능한 그리드 공간그리드 컨테이너의 min/max-width/height 속성이 확정적이면 그에 따라 clamp(제한)해야 합니다.

여유 공간
사용 가능한 그리드 공간에서 모든 그리드 트랙(구터 포함)의 기본 크기 합을 뺀 값이며, 0 이하일 경우 0으로 바닥처리합니다. 사용 가능한 그리드 공간불확정적이면, 여유 공간불확정적입니다.
span 개수
해당 축에서 그리드 아이템이 교차하는 그리드 트랙의 개수입니다.

참고: 구터(gutter)는 그리드 크기 산정 알고리즘에서 min/max 크기 함수가 모두 구터의 실제 크기로 고정된 트랙(고정 크기 트랙)으로 처리됩니다. 구터 폭도 트랙 크기 산정 알고리즘 계산에 반드시 포함되어야 합니다.

12.3. 트랙 크기 산정 알고리즘

이 절의 나머지는 트랙 크기 산정 알고리즘입니다. 이 알고리즘은 minmax 트랙 크기 함수에서 실제 트랙 크기를 계산합니다. 각 트랙에는 기본 크기와, 알고리즘 진행 중 증가하는 <length>가 있으며, 이는 결국 트랙의 최종 크기가 됩니다. 그리고 성장 한계가 있으며, <length>로, 기본 크기의 최대치 역할을 합니다. 단계는 총 5단계입니다:

  1. 트랙 크기 초기화(Initialize Track Sizes)
  2. 내재적 트랙 크기 산정(Resolve Intrinsic Track Sizes)
  3. 트랙 최대화(Maximize Tracks)
  4. 가변 트랙 확장(Expand Flexible Tracks)
  5. 자동 트랙 확장(Expand Stretched auto Tracks)

12.4. 트랙 크기 초기화

각 트랙의 기본 크기와 성장 한계를 초기화합니다. 각 트랙에 대해, 해당 트랙의 최소 트랙 크기 함수가 다음 중 하나이면:

고정 크기 함수
절대 길이로 해석하여 그 값을 트랙의 초기 기본 크기로 사용합니다.

참고: 불확정적 길이는 발생할 수 없으며, auto로 처리됩니다.

내재 크기 함수
초기 기본 크기는 0으로 사용합니다.

각 트랙에 대해, 해당 트랙의 최대 트랙 크기 함수가 다음 중 하나이면:

고정 크기 함수
절대 길이로 해석하여 그 값을 트랙의 초기 성장 한계로 사용합니다.
내재 크기 함수
가변 크기 함수
초기 성장 한계는 무한대로 사용합니다.

모든 경우, 성장 한계기본 크기보다 작으면, 성장 한계기본 크기와 같도록 증가시킵니다.

참고: 구터(gutter)는 트랙 크기 산정 알고리즘에서 빈 고정 크기 트랙으로 처리됩니다.

12.5. 내재적 트랙 크기 해석

이 단계는 내재적 트랙 크기 함수를 절대 길이로 해석합니다. 먼저 하나의 트랙에 완전히 포함된 아이템을 기준으로 크기를 해석합니다. 이후 여러 트랙을 span하는 아이템의 공간 요구를 점진적으로 추가하여, 그 추가 공간을 해당 트랙들 사이에 가능한 한 고르게 분배합니다.

참고: 이 단계가 끝나면, 모든 내재적 기본 크기성장 한계는 절대 길이로 해석됩니다.

참고: 참고 fit-content()auto 최대 트랙 크기 함수는 명시적으로 다르게 규정된 경우를 제외하고 max-content와 동일하게 처리됩니다.

  1. 기준선 정렬된 아이템에 shim(여분 margin)을 추가하여 내재적 크기 기여가 기준선 정렬을 반영하도록 함.기준선 공유 그룹에 속한 아이템에 대해, 첫/마지막 기준선 정렬(행 시작/끝 기준 정렬)에 맞게 각 아이템의 시작/끝 쪽에 "shim"(추가 margin)을 넣어, 함께 정렬될 때 기준선이 규정대로 맞춰지도록 합니다.

    이 shim을 아래 트랙 크기 산정 시 아이템의 내재적 크기 기여에 포함시킵니다. 아이템이 여러 내재적 크기 기여를 갖는 경우, 각각에 대해 shim이 다를 수 있습니다.

    예를 들어, 그리드 컨테이너불확정 크기일 때, 처음에는 min/max-content 제약 하에서 레이아웃하여 크기를 찾고, 그 크기로 실제 레이아웃을 진행합니다 (percent 트랙 등에도 영향). 각 단계에서 추가되는 shim은 독립적이며, 해당 단계의 레이아웃에만 영향을 줍니다.

    참고: 기준선 self-align기준선 content-align 아이템 모두 이 단계에서 고려됩니다.

    참고: 자신의 크기가 내재적 크기 트랙 크기에 의존하는 그리드 아이템기준선 정렬에 참여하지 않으므로, shim을 추가하지 않습니다.

  2. span이 1인 아이템에 맞게 트랙 크기 지정: 내재적 트랙 크기 함수를 가지며 가변 크기 함수가 아닌 각 트랙에 대해, span이 1인 아이템을 고려:
    min-content minimum:
    트랙이 min-content 최소 트랙 크기 함수를 가지면, 그 기본 크기를 해당 아이템의 min-content 기여의 최댓값(0 이상)으로 설정.
    max-content minimum:
    트랙이 max-content 최소 트랙 크기 함수를 가지면, 그 기본 크기를 해당 아이템의 max-content 기여의 최댓값(0 이상)으로 설정.
    auto minimum:
    트랙이 auto 최소 트랙 크기 함수이고, 그리드 컨테이너min-/max-content 제약에서 크기 지정 중이면, 트랙의 기본 크기를 해당 아이템의 제한된 min-content 기여의 최댓값(0 이상)으로 설정. 제한된 min-/max-content 기여는 (이 목적에서) 해당 아이템의 min-/max-content 기여(상황에 따라), 최대 트랙 크기 함수(예: fit-content() 함수의 인자)가 고정일 때 해당 값 이하로 제한, 그리고 최종적으로 최소 기여(아래 정의)로 바닥처리함.

    그 외에는, 트랙의 기본 크기를 해당 아이템의 최소 기여의 최댓값(0 이상)으로 설정. 최소 기여는 아이템이 가질 수 있는 가장 작은 외부 크기입니다. 구체적으로, 아이템의 계산된 선호 크기auto로 동작하거나 해당 축의 포함 블록 크기에 의존할 경우, 최소 기여는 아이템의 실제 사용 최소 크기를 선호 크기로 가정했을 때의 외부 크기입니다; 그렇지 않으면 최소 기여는 해당 아이템의 min-content 기여입니다. 최소 기여는 내용 크기에 따라 달라질 수 있으므로, 내재적 크기 기여의 한 종류로 간주합니다.

    참고: auto (초기값)로 명시된 최소 크기를 가진 아이템의 경우, 최소 기여는 보통 min-content 기여와 동일하지만, 일부 예외가 있습니다. § 6.6 그리드 아이템의 자동 최소 크기 참고. 또한 최소 기여min-content 기여max-content 기여입니다.

    min-content maximum:
    트랙이 min-content 최대 트랙 크기 함수를 가지면, 성장 한계를 해당 아이템의 min-content 기여의 최댓값으로 설정.
    max-content maximum:
    트랙이 max-content 최대 트랙 크기 함수를 가지면, 성장 한계를 해당 아이템의 max-content 기여의 최댓값으로 설정. fit-content() 최대값인 경우에는 성장 한계fit-content() 인자값으로 제한함.

    모든 경우, 트랙의 성장 한계기본 크기보다 작으면, 성장 한계기본 크기와 같게 늘립니다.

    참고: 이 단계는 아래 span 아이템 처리 단계를 단순화한 것으로, span이 1인 아이템에 대해 아래 지침을 실행한 것과 동일한 결과를 내야 합니다.

  3. 여러 트랙을 span하는 아이템을 수용하도록 트랙 크기 증가: 다음으로 span이 2이면서 가변 크기 함수 트랙을 span하지 않는 아이템을 고려합니다.
    1. 내재적 minimum: 먼저 내재적 최소 트랙 크기 함수를 가진 트랙의 기본 크기에 추가 공간을 분배하여, 해당 아이템의 최소 기여를 수용함.

      그리드 컨테이너가 min- 또는 max-content 제약에서 크기 지정 중이면, 해당 아이템의 제한된 min-content 기여최소 기여 대신 사용합니다. (여러 트랙을 span하는 아이템의 제한된 min-/max-content 기여 산정 시, 상한값은 해당 아이템이 span하는 모든 트랙의 고정 최대 트랙 크기 함수의 합이며, span하는 모든 트랙이 고정인 경우에 적용.)

    2. 내용 기반 minimum: 다음으로 min-content 또는 max-content 최소 트랙 크기 함수를 가진 트랙의 기본 크기에 추가 공간을 분배하여, 해당 아이템의 min-content 기여를 수용함.
    3. max-content minimum: 다음으로 그리드 컨테이너가 max-content 제약에서 크기 지정 중이면, auto 또는 max-content 최소 트랙 크기 함수를 가진 트랙의 기본 크기에 해당 아이템의 제한된 max-content 기여를 분배함.

      모든 경우, max-content 최소 트랙 크기 함수를 가진 트랙의 기본 크기에도 해당 아이템의 max-content 기여를 분배함.

    4. 여기서 트랙의 성장 한계기본 크기보다 작으면, 성장 한계기본 크기와 같게 늘립니다.
    5. 내재적 maximum: 다음으로 내재적 최대 트랙 크기 함수를 가진 트랙의 성장 한계에 해당 아이템의 min-content 기여를 분배함. 이 단계에서 성장 한계가 무한대에서 유한대로 변한 트랙은 다음 단계에서 무한 성장 가능으로 표시함.
      무한 성장 가능 플래그가 필요한가?

      Peter Salas의 설명:

      예시:
      
      두 개의 "auto" 트랙(''minmax(min-content, max-content) minmax(min-content, max-content)'').
      아이템 1이 트랙 1에 있고, min-content = max-content = 10.
      아이템 2가 트랙 1과 2를 span하고, min-content = 30, max-content = 100.
      
      첫 번째 아이템의 min-content/max-content 해석 후:
      
      트랙 1: 기본 크기 = 10 성장 한계 = 10
      
      트랙 2: 기본 크기 = 0 성장 한계 = 무한대
      
      그 다음 두 번째 아이템의 min-content/max-content 해석.
      
      1단계에서 트랙 2의 기본 크기를 20으로 설정(두 트랙의 합이 30).
      2단계는 해당 트랙 없음.
      3단계에서 트랙 2의 성장 한계를 20으로 설정(합이 30).
      4단계에서 아이템 2를 수용하기 위해 성장 한계의 합을 70만큼 늘려야 함.
      두 가지 옵션:
      
      1. 두 트랙의 성장 한계를 균등하게 늘리면, [45, 55]가 됨.
      2. 두 번째 트랙만 늘리면, [10, 90]이 됨.
      
      방금 설정한 성장 한계를 분배할 때 제약으로 간주하지 않고(무한대로 처리),
      두 번째 결과를 얻음. 이게 첫 번째 트랙이 정확히 첫 아이템 크기만큼만 커지므로 더 좋다고 판단.
      
    6. max-content maximum: 마지막으로 max-content 최대 트랙 크기 함수를 가진 트랙의 성장 한계에 해당 아이템의 max-content 기여를 분배함.

    span이 더 큰 아이템에 대해 단계적으로 반복하여 모든 아이템을 반영합니다.

  4. 가변 트랙을 span하는 아이템도 크기 증가: 다음 단계에서는 이전 단계와 동일하게 진행하되, span하는 트랙 중 가변 크기 함수를 갖는 모든 아이템을 (span 크기별로 묶지 않고) 함께 고려함.
  5. 아직 성장 한계가 무한대인 트랙(예: 아이템 없음, 가변 트랙 등)은, 성장 한계기본 크기로 설정함.

참고: 여러 트랙을 span하는 아이템의 내재적 크기 제약을 만족시키는 방법은 하나가 아닙니다. 이 알고리즘은 실제 사례에서 좋은 결과를 내는 다양한 휴리스틱을 구현합니다. 향후 더 고급 휴리스틱이 확인되면 이 알고리즘이 업데이트될 수 있습니다.

12.5.1. span된 트랙에 추가 공간 분배하기

추가 공간 분배(distribute extra space)하려면, 다음 단계들을 입력값과 함께 수행합니다:
  1. affected track별로 planned increase를 따로 유지하며, 초기값은 0으로 설정합니다. (이로 인해 크기 증가가 순서에 따라 달라지지 않음.)
  2. 각 accommodated item에 대해, 아이템이 span하는 트랙만 고려:
    1. 분배할 공간 찾기: 아이템의 size contribution에서 span된 모든 트랙의 affected size를 빼고, 0으로 바닥처리함. (무한대 성장 한계일 경우, 트랙의 기본 크기로 대체함.) 남은 크기 기여가 space가 됨.
      space = max(0, size contribution - ∑track-sizes)
    2. space를 한계까지 분배:

      affected track별로 item-incurred increase를 구함: space를 해당 트랙들에 균등 분배, 각 트랙의 affected size+item-incurred increaselimit에 도달하면 그 트랙은 freeze하고, 나머지 unfrozen 트랙은 계속 증가시킴.

      기본 크기의 경우, limit성장 한계이며, fit-content() 인자값으로 상한 처리. 성장 한계의 경우, 성장 한계가 유한하고 해당 트랙이 무한 성장 가능이 아니면 그 값이 한계, 아니면 fit-content() 인자값, 없으면 무한대.

      참고: affected size성장 한계이고, 해당 트랙이 무한 성장 가능이 아니면, 각 item-incurred increase는 0이 됨.

    3. 비조정 트랙에 space 분배:

      이 시점에 추가 space가 남아있고, 아이템이 affected track 및 비-affected track을 모두 span하면, 앞 단계와 동일하게 남은 공간을 비-affected track에 분배.

      참고: 이로 인해 성장 한계에 도달하지 않은 트랙에 남은 공간을 분배하며, affected track의 성장 한계를 침범하지 않음.

    4. 한계를 넘는 space 분배:

      이 시점에 추가 space가 남아있으면, freeze를 해제하고 다음에 대해 item-incurred increase를 계속 분배함…

      이때 최대 트랙 크기 함수fit-content() 트랙이면, 해당 트랙이 fit-content() 인자값에 도달할 때까지는 max-content로 취급, 도달하면 최대 트랙 크기 함수는 해당 인자의 고정 크기 함수로 취급 (이로 인해 어떤 트랙에 계속 공간 분배할지 바뀔 수 있음).

      참고: 이 단계는 트랙의 현재 성장 한계를 넘는 size contribution에 대해, 최대 트랙 크기 함수 종류에 따라 우선적으로 공간 분배함.

    5. affected track에 대해, 해당 트랙의 item-incurred increaseplanned increase보다 크면, planned increase를 그 값으로 설정함.
  3. 트랙의 affected sizeplanned increase만큼 늘려서 갱신 (다음 라운드 공간 분배 시 반영됨). (affected size가 무한대 성장 한계면, 트랙의 기본 크기+planned increase로 설정.)

12.6. 트랙 최대화(Maximize Tracks)

여유 공간이 양수라면, 모든 트랙의 기본 크기에 고르게 분배하고, 트랙이 성장 한계에 도달하면 freeze하고, 나머지 unfrozen 트랙은 계속 증가시킴.

이 단계에서: 그리드 컨테이너max-content 제약으로 크기 지정하면, 여유 공간은 무한대; min-content 제약이면 여유 공간은 0.

이로 인해 그리드가 그리드 컨테이너내부 크기 (max-width/height 속성으로 제한됨)보다 커지면, 이 단계를 다시 실행하여 사용 가능한 그리드 공간을 그리드 컨테이너의 내부 크기로 처리함.

12.7. 가변 트랙 확장(Expand Flexible Tracks)

이 단계에서는 가변 트랙의 크기를 fr에 할당할 수 있는 가장 큰 값으로 지정하며, 사용 가능한 공간을 넘지 않도록 조정함.

먼저, 그리드의 실제 flex fraction을 구함:

여유 공간이 0이거나, 그리드 컨테이너min-content 제약으로 크기 지정하는 경우:
사용 flex fraction은 0.
그 외, 여유 공간확정 길이인 경우:
사용 flex fraction은 모든 그리드 트랙채울 공간에 대해 fr 크기 찾기의 결과.
그 외, 여유 공간불확정 길이인 경우:
사용 flex fraction은 다음 중 최대값:

flex fraction을 사용할 때, 그리드그리드 컨테이너min-width/height보다 작아지거나 그리드 컨테이너max-width/height보다 커지면, 이 단계를 다시 실행하여 여유 공간을 확정 값으로, 사용 가능한 그리드 공간그리드 컨테이너내부 크기에 맞게 크기 지정된 것으로 처리함 (min-width/height, max-width/height).

가변 트랙에 대해, 사용 flex fraction과 트랙의 flex factor의 곱이 트랙의 기본 크기보다 크면, 기본 크기를 해당 곱으로 설정함.

12.7.1. fr 크기 찾기

이 알고리즘은 fr 단위가 목표 크기를 넘지 않도록 할당할 수 있는 최대 크기를 찾습니다. 그리드 트랙 집합과 채울 공간(space to fill)을 입력으로 호출해야 합니다.

  1. 남은 공간(leftover space)채울 공간에서 비가변 그리드 트랙기본 크기 합을 뺀 값.
  2. flex factor 합가변 트랙flex factor 합. 이 값이 1보다 작으면 1로 설정.
  3. 가상 fr 크기(hypothetical fr size)남은 공간flex factor 합으로 나눈 값.
  4. 가상 fr 크기와 각 가변 트랙flex factor의 곱이 해당 트랙의 기본 크기보다 작으면, 해당 트랙을 inflexible로 간주하고 이 알고리즘을 다시 시작.
  5. 가상 fr 크기 반환.

12.8. auto 트랙 늘리기(Stretch auto Tracks)

content-distribution property그리드 컨테이너에서 해당 축에 대해 normal 또는 stretch이면, auto 최대 트랙 크기 함수를 가진 트랙을 남은 양의 확정적 여유 공간을 트랙끼리 고르게 분배해 확장함. 여유 공간불확정이라도, 그리드 컨테이너확정적 min-width/height를 가지면, 해당 크기로 여유 공간을 계산해 사용함.

13. 그리드 레이아웃 분할(Fragmenting Grid Layout)

그리드 컨테이너는 행 또는 열 사이, 그리고 아이템 내부에서 페이지 분할이 가능합니다. break-* 속성은 그리드 컨테이너에 참여하는 포맷팅 컨텍스트에 대해 정상적으로 적용됩니다. 이 절에서는 그리드 아이템과 그 내용에 어떻게 적용되는지 정의합니다.

다음 분할 규칙은 분할 컨테이너(fragmentation container)를 "페이지"로 지칭합니다. 동일 규칙은 다른 분할 컨텍스트(fragmentation context)에도 적용됩니다. (필요하면 "페이지" 대신 알맞은 분할 컨테이너 유형으로 대체.) CSS Fragmentation Module [CSS3-BREAK] 참고.

분할된 그리드 컨테이너의 정확한 레이아웃은 이 그리드 레이아웃 수준에서 정의되지 않습니다. 하지만 그리드 컨테이너 내의 분할은 다음 규칙을 따릅니다:

13.1. 분할 샘플 알고리즘(Sample Fragmentation Algorithm)

이 절은 규범적인 내용이 아닙니다.

이 알고리즘은 한 가지 가능한 분할 알고리즘의 초안이며, [CSS-FLEXBOX-1] 알고리즘과의 일관성 검토가 필요합니다. 피드백 환영; 구현 지침으로는 위의 규칙을 참고하세요.

  1. § 12 그리드 레이아웃 알고리즘을 따라, 분할 컨테이너의 인라인 크기를 사용하고 블록 크기는 무제한으로 가정하여 그리드를 레이아웃합니다. 이 단계에서 모든 grid-row autofr 값은 모두 해석되어야 합니다.
  2. 이전 단계에서 해석한 값으로 그리드 컨테이너를 레이아웃합니다.
  3. 그리드 영역 크기가 분할로 인해 변경되면(행 span 아이템은 제외), 다음 행 중에서 행 크기를 늘립니다:
    • 내용 min 트랙 크기 함수를 가진 행.
    • 명시적 높이가 없는 그리드에서 해당 행이 가변적일 때.
  4. 그리드 높이가 auto이면, 그리드의 높이는 최종 행 크기의 합이 되어야 합니다.
  5. 분할 중 margin이 겹쳐져 그리드 영역이 그리드 컨테이너를 넘칠 경우, 그리드 영역을 포함하도록 그리드 컨테이너를 확장합니다(이 단계는 분할로 인한 순환적 레이아웃 의존을 피하기 위해 필요).

그리드의 높이가 명시되어 있으면, 3, 4단계에서 행이 그리드를 넘칠 수 있습니다.

14. 개인 정보 고려사항

그리드 레이아웃은 새로운 개인 정보 유출을 도입하지 않습니다.

15. 보안 고려사항

그리드 레이아웃은 새로운 보안 고려사항을 도입하지 않습니다.

16. 변경 사항

16.1. 2020년 12월 18일 CR 이후 변경 사항

16.2. 2020년 8월 CR 이후 변경 사항

2019년 12월 CSS Grid Layout Level 2 Working Draft 이후 변경 사항

없음. 단, CSS Grid level 1 전체 본문을 포함함.

이전 변경 사항은 Working Draft 변경 사항 참고.

16.3. Level 1 이후 추가 사항

Level 1 이후 다음 기능이 추가되었습니다:

17. 감사의 글

Mozilla의 Mats Palmgren에게 깊은 감사를 전합니다. 그의 지원과 피드백 없이는 서브그리드 기능이 진전될 수 없었습니다. Daniel Tonon에게도 감사드립니다. 서브그리드에서 gap의 지능적인 처리와 예시 그림을 직접 기여해주셨고, Rachel Andrew와 Jen Simmons는 CSS 워킹 그룹과 웹 디자인/저작 커뮤니티 간의 피드백 격차를 해소하는데 도움을 주었습니다.

마지막으로, CSS Grid Level 2의 감사 섹션은 CSS Grid Level 1의 거대한 작업을 가능하게 한 모든 분들에 대한 감사 없이는 완전하지 않을 것입니다.

적합성(Conformance)

문서 규칙(Document conventions)

적합성 요구사항은 설명적 주장과 RFC 2119 용어의 조합으로 표현됩니다. “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, “OPTIONAL” 키워드는 문서의 규범적 부분에서 RFC 2119에 따라 해석되어야 합니다. 가독성을 위해, 이 단어들은 명세 전체에서 모두 대문자로 표기하지 않습니다.

이 명세의 모든 본문은 규범적입니다. 단, 명시적으로 비규범적임을 표시한 곳, 예제, 주석은 제외합니다. [RFC2119]

이 명세의 예제는 “for example”이라는 문구로 시작하거나, 아래처럼 class="example"로 구분됩니다:

이것은 정보성 예시입니다.

정보성 주석은 “Note”라는 문구로 시작하며, 아래처럼 class="note"로 구분됩니다:

참고, 이것은 정보성 주석입니다.

권고(advisement)는 특별한 주의가 필요한 규범적 섹션으로, 아래처럼 <strong class="advisement">으로 구분됩니다: UA는 반드시 접근 가능한 대안을 제공해야 합니다.

적합성 클래스

이 명세에 대한 적합성은 세 가지 클래스에 대해 정의됩니다:

스타일 시트
CSS 스타일 시트.
렌더러
UA로, 스타일 시트의 의미를 해석하고 해당 스타일 시트를 사용하는 문서를 렌더링합니다.
저작 도구
UA로, 스타일 시트를 작성합니다.

스타일 시트가 이 명세에 적합하려면 이 모듈에서 정의한 문법을 사용하는 모든 선언문이 일반 CSS 문법 및 각 기능별 개별 문법에 따라 유효해야 합니다.

렌더러가 이 명세에 적합하려면 스타일 시트를 해당 명세에 따라 해석하는 것 외에도, 이 명세에서 정의한 모든 기능을 올바르게 파싱하고 문서를 그에 따라 렌더링해야 합니다. 단, UA가 기기 한계로 인해 문서를 올바르게 렌더링하지 못하는 경우 비적합으로 간주되지 않습니다. (예: UA가 흑백 모니터에서 컬러를 렌더링할 필요는 없음.)

저작 도구가 이 명세에 적합하려면 이 모듈의 일반 CSS 문법 및 각 기능의 개별 문법에 따라 문법적으로 올바른 스타일 시트를 작성하고, 이 모듈에서 설명한 스타일 시트의 모든 다른 적합성 요구사항도 충족해야 합니다.

부분 구현(Partial implementations)

저자가 향후 호환성 파싱 규칙을 활용해 대체값을 지정할 수 있도록, CSS 렌더러는 반드시 지원 가능한 수준이 없는 모든 at-규칙, 속성, 속성값, 키워드, 기타 문법적 구조를 잘못된 것으로 간주(적절히 무시)해야 합니다. 특히 UA는 지원하지 않는 값만 무시하고 멀티값 속성 선언에서 지원되는 값만 적용해서는 안 됩니다: 어떤 값이 잘못된 것으로 간주되면(CSS 요구사항대로 지원하지 않는 값은), 전체 선언을 무시해야 합니다.

불안정 및 독점 기능의 구현(Implementations of Unstable and Proprietary Features)

향후 안정적인 CSS 기능과의 충돌을 피하기 위해, CSSWG는 최선의 구현 관행을 따라 불안정 기능 및 독점 확장 기능을 구현할 것을 권장합니다.

비실험적 구현(Non-experimental implementations)

명세가 Candidate Recommendation 단계에 도달하면, 비실험적 구현이 가능하며, 구현자는 명세대로 올바르게 구현된 CR 수준 기능은 접두어 없이 출시해야 합니다.

CSS의 상호운용성을 확보·유지하기 위해, CSS 워킹 그룹은 비실험적 CSS 렌더러가 구현 보고서(필요시 해당 테스트케이스 포함)를 W3C에 제출할 것을 요청합니다. 구현 보고서에 제출된 테스트케이스는 CSS 워킹 그룹에서 검토·수정될 수 있습니다.

테스트케이스 및 구현 보고서 제출 방법은 CSS 워킹 그룹 웹사이트 https://www.w3.org/Style/CSS/Test/에서 확인할 수 있습니다. 문의는 public-css-testsuite@w3.org 메일링 리스트에 보내면 됩니다.

CR 종료 기준(CR exit criteria)

이 명세가 Proposed Recommendation 단계로 진행되려면, 각 기능에 대해 최소 두 개의 독립적이고 상호운용 가능한 구현이 있어야 합니다. 각 기능은 서로 다른 제품에서 구현될 수 있으며, 모든 기능을 단일 제품에서 구현할 필요는 없습니다. 이 기준에 대해 다음 용어를 정의합니다:

독립적(independent)
각 구현은 서로 다른 당사자가 개발해야 하며, 다른 구현의 코드를 공유, 재사용, 파생해서는 안 됩니다. 이 명세 구현에 영향 없는 코드 부분은 예외입니다.
상호운용 가능(interoperable)
공식 CSS 테스트 스위트의 해당 테스트케이스를 통과하거나, Web 브라우저가 아닌 경우 동등한 테스트를 통과함. 모든 관련 테스트는 동등한 테스트가 생성되어야 하며, 해당 UA가 상호운용성 주장에 사용될 경우, 그 동등 테스트를 통과할 추가 UA도 필요. 동등 테스트는 동료 평가를 위해 공개되어야 함.
구현(implementation)
다음을 만족하는 사용자 에이전트:
  1. 명세를 구현함.
  2. 일반 대중에게 공개됨. 출시 제품 또는 공개 베타, 프리뷰, "nightly build" 등. 출시되지 않은 버전은 기능이 최소 한 달간 구현되어 안정성을 입증해야 함.
  3. 실험적이지 않음(테스트 스위트 통과만을 위한 버전이 아니고, 앞으로 정상적으로 사용할 목적이 아님).

명세는 최소 6개월간 Candidate Recommendation 단계에 머무릅니다.

색인(Index)

이 명세서에서 정의한 용어

참조로 정의된 용어

참고 문헌

규범 참고 문헌

[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.; et al. 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.; et al. 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; et al. 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; et al. 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; et al. 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; et al. 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; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/

속성 색인(Property Index)

이름(Name) 값(Value) 초기값(Initial) 적용 대상(Applies to) 상속 여부(Inh.) 백분율(%ages) 애니메이션 타입(Anim­ation type) 정식 순서(Canonical order) 계산 값(Com­puted value)
grid <'grid-template'> | <'grid-template-rows'> / [ auto-flow && dense? ] <'grid-auto-columns'>? | [ auto-flow && dense? ] <'grid-auto-rows'>? / <'grid-template-columns'> none 그리드 컨테이너(grid containers) 각 속성 참조 각 속성 참조 각 속성 참조 문법에 따라(per grammar) 각 속성 참조
grid-area <grid-line> [ / <grid-line> ]{0,3} auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 N/A 불연속(discrete) 문법에 따라 각 속성 참조
grid-auto-columns <track-size>+ auto 그리드 컨테이너 아니오 트랙 크기 산정 참조 리스트 길이가 같으면 아이템별 계산 값 타입, 아니면 불연속 문법에 따라 트랙 크기 산정 참조
grid-auto-flow [ row | column ] || dense row 그리드 컨테이너 아니오 n/a 불연속(discrete) 문법에 따라 지정된 키워드
grid-auto-rows <track-size>+ auto 그리드 컨테이너 아니오 트랙 크기 산정 참조 리스트 길이가 같으면 아이템별 계산 값 타입, 아니면 불연속 문법에 따라 트랙 크기 산정 참조
grid-column <grid-line> [ / <grid-line> ]? auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 N/A 불연속(discrete) 문법에 따라 각 속성 참조
grid-column-end <grid-line> auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 n/a 불연속 문법에 따라 지정된 키워드, 식별자, 또는 정수
grid-column-start <grid-line> auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 n/a 불연속 문법에 따라 지정된 키워드, 식별자, 또는 정수
grid-row <grid-line> [ / <grid-line> ]? auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 N/A 불연속 문법에 따라 각 속성 참조
grid-row-end <grid-line> auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 n/a 불연속 문법에 따라 지정된 키워드, 식별자, 또는 정수
grid-row-start <grid-line> auto 그리드 아이템 및 포함 블록이 그리드 컨테이너인 절대 위치 박스 아니오 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 그리드 컨테이너 아니오 n/a 불연속 문법에 따라 키워드 none 또는 문자열 리스트
grid-template-columns none | <track-list> | <auto-track-list> | subgrid <line-name-list>? none 그리드 컨테이너 아니오 콘텐츠 영역의 해당 차원 참조 리스트 길이가 같으면 계산 값 타입, 아니면 불연속 문법에 따라 키워드 none 또는 계산 트랙 리스트
grid-template-rows none | <track-list> | <auto-track-list> | subgrid <line-name-list>? none 그리드 컨테이너 아니오 콘텐츠 영역의 해당 차원 참조 리스트 길이가 같으면 계산 값 타입, 아니면 불연속 문법에 따라 키워드 none 또는 계산 트랙 리스트

이슈 색인(Issues Index)

이 Grid Layout Module과 Flexible Box Layout Module 사이에 불일치가 있으면, CSSWG에 알려주세요. 이는 오류일 가능성이 높습니다.
위 리스트의 첫 번째 항목은 암시적 트랙이 grid-template-rows 등에서 직렬화된다는 의미입니다. 실제로 작성자는 암시적 트랙 크기를 해당 속성들에 명시적으로 지정할 수 없음에도 불구하고! 그래서 grid-template-rowsgrid-template-columns 값은 올바르게 round-trip되지 않을 수 있습니다:
const s = getComputedStyle(gridEl);
gridEl.style.gridTemplateRows = s.gridTemplateRows;
// 이런 코드는 원래 아무 변화가 없어야 하는데,
// 암시적 행이 있으면,
// 이 코드가 암시적 행을 명시적 행으로 바꿔버려,
// 그리드 아이템 배치가 바뀌거나
// 전체 그리드 크기가 바뀔 수 있음!

이것은 초기 구현에서 우연히 생긴 특성으로, 이후 구현에 별 생각 없이 전파되었습니다. 우리는 이 부분을 명세에서 제거할 계획이지만, 암시적 트랙 정보를 얻을 CSSOM API를 아직 정의하지 않았기 때문에 현재로서는 이 방법밖에 정보를 얻을 수 없고 많은 페이지가 이에 의존합니다.

CSS 워킹 그룹은 grid-placement 속성에 대해 사용된 값도 반환할지 검토 중이며, 구현자들의 의견을 찾고 있습니다. 논의 보기.