[MDN Study] CSS 레이아웃 - grid

기술 노트
2025. 12. 10. 09:42
2025. 12. 10. 15:13

1. 개요

CSS 레이아웃의 핵심 요소 display의 속성값 중 하나인 grid에 대해 다룬다.

부모 요소에 적용하여 자식 요소를 2차원(행과 열)으로 배치할 수 있게 지원하는 속성이다.

그리드는 수평선, 수직선으로 이루어진 집합체로, 디자인 요소를 정렬할 수 있는 대상 패턴을 생성한다.

이 디자인은 문서에서 문서로 이동할 때 요소가 널뛰거나 너비가 바뀌지 않는 디자인 생성에 도움을 주어 일관성을 높인다.

문서가 중구난방하지 않고 깔끔하게 보이도록 뼈대 역할을 해준다.

2. grid 레이아웃 구조

grid.png

하나의 그리드는 columns(열), rows(행)로 구성되며, 각 행과 열의 공백은 gutters라 부른다.

3. grid 자식 요소 배치 방법

먼저 부모 요소에 다음과 같이 열을 추가해 그리드의 시각적 효과를 볼 수 있다.

.container {
  display: grid;
  grid-template-columns: 200px 200px 200px;
}

위와 같이 설정하면 자식 요소가 200px의 열 3개로 배치된 것을 볼 수 있다.

3.1. 가변 그리드 설정

fr 단위로 가변 그리드 설정이 가능하다.

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
}

fr 단위는 그리드 컨테이너에서 그리드의 행과 열 크기를 유연하게 조정할 수 있는 백분율이다.

공간을 비례적으로 나눠 분배하는 단위이다.

.container {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
}

위와 같이 설정하면 첫 번째 열이 사용 가능한 공간을 다른 열보다 두 배를 차지한다.

3.2. item별 간격 설정

grid-gap으로 item별 간격을 설정할 수 있다.

.container {
  display: grid;
  grid-template-columns: 2fr 1fr 1fr;
  grid-gap: 20px;
}

위와 같이 설정하면 각 item은 20px만큼의 간격을 가지게 된다.

gird-gap은 fr 단위 설정이 불가능하다.

3.3. repeat() 함수로 목록 반복

repeat() 함수를 사용해 item 목록의 일부 또는 전체를 반복 설정할 수 있다.

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 20px;
}

위와 같이 설정하면 3개의 1fr 설정과 동일한 효과를 얻는다.

첫 번째 인자에 반복할 횟수, 두 번째 인자에 값을 지정할 수 있다.

3.4. 암시적 그리드

위 css를 보면 행은 지정하지 않고 열만 지정하고 있는데, 그리드 레이아웃은 행이나 열 중 하나를 따로 지정하지 않아도 알아서 만들어진다.

이를 암시적 그리드라고 하며, 크기를 지정할 수도 있다.

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
  grid-gap: 20px;
}

3.5. minmax() 함수로 최소·최대 크기 설정

minmax() 함수를 이용해 item의 최소·최대 크기를 설정할 수 있다.

.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: minmax(100px, auto);
  gap: 20px;
}

첫 번째 인자에 최소 크기, 두 번째 인자에 최대 크기를 지정한다.

최대 크기에 auto를 넣으면 더 많은 컨텐츠를 수용하기 위해 자동 확장된다.

3.6. 자동 열 생성

컨테이너에 들어갈 수 있을 만큼 자동으로 열을 생성하도록 응용할 수 있다.

repeat() 함수를 사용해 grid-template-columns값을 설정하되 숫자 대신 auto-fit을 전달한다.

두 번째 인자에 최솟값은 원하는 item 크기를, 최댓값은 1fr인 minmax()를 아래와 같이 지정했다.

.container {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  grid-auto-rows: minmax(100px, auto);
  gap: 20px;
}

그리드가 컨테이너에 들어갈 수 있을 만큼 200px 열을 생성한 다음 모든 열에 남은 공간을 공유시킨다.

3.7. 라인 기반 배치

라인을 기반으로 item을 배치할 수 있다.

그리드에는 항상 라인이 있으며, 값은 1부터 시작한다.

시작과 끝 라인을 지정하여 이 라인에 따라 사물을 정렬한다. 속성은 다음과 같다.

  • grid-column-start

  • grid-column-end

  • grid-row-start

  • grid-row-end

이 속성들은 모두 라인 번호를 값으로 사용할 수 있다.

라인 기반 배치의 약칭 속성은 다음과 같다.

  • grid-column

  • grid-row

이 속성들로 시작 줄과 끝 줄을 슬래시(/)로 구분하여 한 번에 지정할 수 있다.

header {
  grid-column: 1 / 3; /* 열 기준 1부터 3까지 점유 */
  grid-row: 1;
}
article {
  grid-column: 2;
  grid-row: 2;
}
aside {
  grid-column: 1;
  grid-row: 2;
}
footer {
  grid-column: 1 / 3;
  grid-row: 3;
}

결과는 아래와 같이 배치된다.

스크린샷 2025-12-10 235843.png위의 사진은 grid-template-areas, 그리드 프레임워크의 결과와 동일하다.

3.8. grid-template-areas로 위치 잡기

grid-template-areas를 이용해 아래와 같이 위치를 지정할 수 있다.

.container {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
  grid-template-columns: 1fr 3fr;
  gap: 20px;
}
header {
  grid-area: header;
}
article {
  grid-area: content;
}
aside {
  grid-area: sidebar;
}
footer {
  grid-area: footer;
}

결과는 라인 기반 배치의 사진과 동일하다.

grid-template-areas의 몇 가지 규칙

  • 그리드로 이루어진 전체 셀을 채우도록 해야 한다.

  • 두 개의 셀을 합치려면 해당 이름을 반복해야 한다.

  • 셀을 비우려면 마침표(.)를 사용한다.

  • 영역은 반드시 직사각형이어야 한다.

  • 영역은 다른 위치에서 반복될 수 없다.

3.9. 그리드 프레임워크

그리드 프레임워크는 12열 또는 16열 그리드를 기반으로 하는 경우가 많다.

그리드에는 이런 사양이 기본적으로 제공된다.

라인 기반 배치를 사용해 12열 그리드에 컨텐츠를 배치할 수 있다.

header {
  grid-column: 1 / 13;
  grid-row: 1;
}
article {
  grid-column: 4 / 13;
  grid-row: 2;
}
aside {
  grid-column: 1 / 4;
  grid-row: 2;
}
footer {
  grid-column: 1 / 13;
  grid-row: 3;
}

결과는 라인 기반 배치의 사진과 동일하다.

출처

Grid