Record

개념

  • CSS Grid(그리드)는 2차원(행과 열)의 레이아웃 시스템을 제공합니다. Flexible Box도 훌륭하지만 비교적 단순한 1차원 레이아웃을 위하며, 좀 더 복잡한 레이아웃을 위해 우리는 CSS Grid를 사용할 수 있습니다.

  • CSS Grid는 CSS Flex와 같이 Container(컨테이너)와 Item(아이템)이라는 두 가지 개념으로 구분되어 있습니다. Container는 Items를 감싸는 부모 요소이며, 그 안에서 각 Item을 배치할 수 있습니다.

참조

목차

Grid Container

속성   의미
display   그리드 컨테이너(Container)를 정의
grid-template-rows   명시적 행(Track)의 크기를 정의
grid-template-columns   명시적 열(Track)의 크기를 정의
grid-template-areas   영역(Area) 이름을 참조해 템플릿 생성
grid-template   grid-template-xxx의 단축 속성
row-gap(grid-row-gap)   행과 행 사이의 간격(Line)을 정의
column-gap(grid-column-gap)   열과 열 사이의 간격(Line)을 정의
gap(grid-gap)   xxx-gap의 단축 속성
grid-auto-rows   암시적인 행(Track)의 크기를 정의
grid-auto-columns   암시적인 열(Track)의 크기를 정의
grid-auto-flow   자동 배치 알고리즘 방식을 정의
grid   grid-template-xxx과 grid-auto-xxx의 단축 속성
align-content   그리드 콘텐츠(Grid Contents)를 수직(열 축) 정렬
justify-content   그리드 콘텐츠를 수평(행 축) 정렬
place-content   align-content와 justify-content의 단축 속성
align-items   그리드 아이템(Items)들을 수직(열 축) 정렬
justify-items   그리드 아이템들을 수평(행 축) 정렬
place-items   align-items와 justify-items의 단축 속성

display

  의미
grid   Block 특성의 Grid Container를 정의
inline-grid   Inline 특성의 Grid Container를 정의

grid-template-rows

  • 명시적 행(Track)의 크기를 정의합니다.
  • 동시에 라인(Line)의 이름도 정의할 수 있습니다.
  • fr(fraction, 공간 비율) 단위를 사용할 수 있습니다.
    grid-template-columns: repeat(12, 1fr);
  • repeat() 함수를 사용할 수 있습니다.
    grid-template-columns: repeat(12, 100px);

grid-template-columns

  • 명시적 열(Track)의 크기를 정의합니다.
  • 동시에 라인(Line)의 이름도 정의할 수 있습니다.
  • fr(fraction, 공간 비율) 단위를 사용할 수 있습니다.
  • repeat() 함수를 사용할 수 있습니다.

grid-template-areas

  • 지정된 그리드 영역 이름(grid-area)을 참조해 그리드 템플릿을 생성합니다.
  • (마침표)를 사용하거나 명시적으로 none을 입력해 빈 영역을 정의할 수 있습니다.

.container {
  display: grid;
  grid-template-rows: repeat(4, 100px);
  grid-template-columns: repeat(3, 1fr);
  grid-template-areas:
    "header header header"
    "main . ."
    "main . aside"
    "footer footer footer";
}
header { grid-area: header; }
main   { grid-area: main;   }
aside  { grid-area: aside;  }
footer { grid-area: footer; }

grid-template

  • grid-template-rows, grid-template-columns 그리고 grid-template-areas의 단축 속성입니다.

.container {
  display: grid;
  grid-template:
    "header header header" 80px
    "main main aside" 350px
    "footer footer footer" 130px
    / 2fr 100px 1fr;
}
header { grid-area: header; }
main   { grid-area: main; }
aside  { grid-area: aside; }
footer { grid-area: footer; }


.container {
  display: grid;
  grid-template-rows: 80px 350px 130px;
  grid-template-columns: 2fr 100px 1fr;
  grid-template-areas:
    "header header header"
    "main main aside"
    "footer footer footer";
}

flex-direction

  • Items의 주 축(main-axis)을 설정합니다.
  의미   기본값
row   Itmes를 수평축(왼쪽에서 오른쪽으로)으로 표시   row
row-reverse   Items를 row의 반대 축으로 표시    
column   Items를 수직축(위에서 아래로)으로 표시    
column-reverse   Items를 column의 반대 축으로 표시    
  • 주 축(main-axis)과 교차 축(cross-axis) : 방향(수평, 수직)에 따라 주 축과 교차 축이 달라집니다.
  • 시작점(flex-start)과 끝점(flex-end) : 방향에 따라 시작점과 끝점이 달라집니다

flex-wrap

  • Items의 여러 줄 묶음(줄 바꿈)을 설정합니다.
  의미   기본값
nowrap   모든 Itmes를 여러 줄로 묶지 않음(한 줄에 표시)   nowrap
wrap   Items를 여러 줄로 묶음    
wrap-reverse   Items를 wrap의 역 방향으로 여러 줄로 묶음    

row-gap(grid-row-gap)

  • 각 행과 행 사이의 간격(Gutter)을 지정합니다.

column-gap (grid-column-gap)

  • 각 열과 열 사이의 간격(Gutter)을 지정합니다.

gap (grid-gap)

  • 각 행과 행, 열과 열 사이의 간격(Gutter)을 지정합니다.

.container {
  gap: <grid-row-gap> <grid-column-gap>;
}

grid-auto-rows

  • 암시적 행(Track)의 크기를 정의합니다. 아이템(Item)이 grid-template-rows로 정의한 명시적 행 외부에 배치되는 경우 암시적 행의 크기가 적용됩니다.

.container {
  width: 300px;
  height: 200px;
  display: grid;
  grid-template-rows: 100px 100px; /* 명시적 2개 행 정의 */
  grid-template-columns: 150px 150px; /* 명시적 2개 열 정의 */
  grid-auto-rows: 100px; /* 그 외(암시적) 행의 크기 정의 */
}
.item:nth-child(3) {
  grid-row: 3 / 4;
}

grid-auto-columns

  • 암시적 열(Track)의 크기를 정의합니다. 아이템(Item)이 grid-template-columns로 정의한 명시적 열 외부에 배치되는 경우 암시적 열의 크기가 적용됩니다.

.container {
  width: 300px;
  height: 200px;
  display: grid;
  grid-template-rows: 100px 100px;
  grid-template-columns: 150px 150px;
  grid-auto-rows: 100px;
  grid-auto-columns: 100px;
}
.item:nth-child(3) {
  grid-row: 3 / 4;
  grid-column: 3 / 4;
}


grid-auto-flow

  • 배치하지 않은 아이템(Item)을 어떤 방식의 ‘자동 배치 알고리즘’으로 처리할지 정의합니다.
  의미   기본값
row   각 행 축을 따라 차례로 배치   row
column   각 열 축을 따라 차례로 배치    
row dense(dense)   각 행 축을 따라 차례로 배치, 빈 영역 메움!    
column dense   각 열 축을 따라 차례로 배치, 빈 영역 메움!    

/* For row & row dense */
.container {
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  grid-template-columns: repeat(3, 1fr);
  grid-auto-flow: row || row dense || dense;
}
.item:nth-child(2) {
  grid-column: span 3;
}

grid

  • grid-template-xxx과 grid-auto-xxx의 단축 속성입니다.

.container {
  grid: <grid-template>;
  grid: <grid-template-rows> / <grid-auto-flow> <grid-auto-columns>;
  grid: <grid-auto-flow> <grid-auto-rows> / <grid-template-columns>;
}


.container {
  grid: <grid-template>;
}
.container {
  grid:
    "header header header" 80px
    "main main aside" 350px
    "footer footer footer" 130px
    / 2fr 100px 1fr;
}
.container {
  grid-template:
    "header header header" 80px
    "main main aside" 350px
    "footer footer footer" 130px
    / 2fr 100px 1fr;
}

align-content

  • 그리드 콘텐츠(Contents)를 수직(열 축) 정렬합니다. 그리드 콘텐츠의 세로 너비가 그리드 컨테이너(Container)보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(위쪽) 정렬    
center   수직 가운데 정렬    
end   끝점(아래쪽) 정렬    
space-around   각 행 위아래에 여백을 고르게 정렬    
space-between   첫 행은 시작점에, 끝 행은 끝점에 정렬되고 나머지 여백으로 고르게 정렬    
space-evenly   모든 여백을 고르게 정렬    
stretch   열 축을 채우기 위해 그리드 콘텐츠를 늘림    

.container {
  width: 450px;
  height: 450px;
  display: grid;
  grid-template-rows: repeat(3, 100px);
  grid-template-columns: repeat(3, 100px);
  align-content: <align-content>;
}

justify-content

  • 그리드 콘텐츠(Contents)를 수평(행 축) 정렬합니다. 그리드 콘텐츠의 가로 너비가 그리드 컨테이너(Container)보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(왼쪽) 정렬    
center   수평 가운데 정렬    
end   끝점(오른쪽) 정렬    
space-around   각 열 좌우에 여백을 고르게 정렬    
space-between   첫 열은 시작점에, 끝 열은 끝점에 정렬되고 나머지 여백으로 고르게 정렬    
space-evenly   모든 여백을 고르게 정렬    
stretch   행 축을 채우기 위해 그리드 콘텐츠를 늘림    

.container {
  width: 450px;
  height: 450px;
  display: grid;
  grid-template-rows: repeat(3, 100px);
  grid-template-columns: repeat(3, 100px);
  justify-content: <justify-content>;
}

place-content

  • align-content와 justify-content의 단축 속성입니다. 하나의 값만 입력하면 두 속성에 모두 적용됩니다.

.container {
  place-content: <align-content> <justify-content>;
}

align-items

  • 그리드 아이템(Items)들을 수직(열 축) 정렬합니다. 그리드 아이템의 세로 너비가 자신이 속한 그리드 행(Track)의 크기보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(위쪽) 정렬    
center   수직 가운데 정렬    
end   끝점(아래쪽) 정렬    
stretch   열 축을 채우기 위해 그리드 아이템을 늘림    

.container {
  width: 450px;
  height: 450px;
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  grid-template-columns: repeat(3, 1fr);
  align-items: <align-items>;
}

justify-items

  • 그리드 아이템(Items)들을 수평(행 축) 정렬합니다. 그리드 아이템의 가로 너비가 자신이 속한 그리드 열(Track)의 크기보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(왼쪽) 정렬    
center   수평 가운데 정렬    
end   끝점(오른쪽) 정렬    
stretch   행 축을 채우기 위해 그리드 아이템을 늘림    

.container {
  width: 450px;
  height: 450px;
  display: grid;
  grid-template-rows: repeat(3, 1fr);
  grid-template-columns: repeat(3, 1fr);
  justify-items: <justify-items>;
}

place-items

  • align-items와 justify-items의 단축 속성입니다. 하나의 값만 입력하면 두 속성에 모두 적용됩니다.

.container {
  place-items: <align-items> <justify-items>;
}

Grid Items

속성   의미
grid-row-start   그리드 아이템(Item)의 행 시작 위치 지정
grid-row-end   그리드 아이템의 행 끝 위치 지정
grid-row   grid-row-xxx의 단축 속성(행 시작/끝 위치)
grid-column-start   그리드 아이템의 열 시작 위치 지정
grid-column-end   그리드 아이템의 열 끝 위치 지정
grid-column   grid-column-xxx의 단축 속성(열 시작/끝 위치)
grid-area   영역(Area) 이름을 설정하거나, grid-row와 grid-column의 단축 속성
align-self   단일 그리드 아이템을 수직(열 축) 정렬
justify-self   단일 그리드 아이템을 수평(행 축) 정렬
place-self   align-self와 justify-self의 단축 속성
order   그리드 아이템의 배치 순서를 지정
z-index   그리드 아이템의 쌓이는 순서를 지정

grid-row-start

  • 그리드 아이템(Item)을 배치하기 위해 그리드 선(Line)의 ‘시작 위치’와 ‘끝 위치’를 지정합니다. ‘숫자’를 지정하거나, ‘선 이름’을 지정하거나, span 키워드를 사용합니다.

.container {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(3, 1fr);
}
.item:nth-child(1) {
  grid-row-start: 1;
  grid-row-end: 3;
  grid-column-start: 2;
  grid-column-end: 4;
}

grid-row-end

  • 그리드 아이템(Item)을 배치하기 위해 그리드 선(Line)의 ‘시작 위치’와 ‘끝 위치’를 지정합니다. ‘숫자’를 지정하거나, ‘선 이름’을 지정하거나, span 키워드를 사용합니다.

grid-row

  • grid-row-start과 grid-row-end의 단축 속성입니다. 각 속성을 /로 구분하는 것에 주의하세요.

.item {
  grid-row: <grid-row-start> / <grid-row-end>;
}

grid-column-start

  • 그리드 아이템(Item)을 배치하기 위해 그리드 선(Line)의 ‘시작 위치’와 ‘끝 위치’를 지정합니다. ‘숫자’를 지정하거나, ‘선 이름’을 지정하거나, span 키워드를 사용합니다.

grid-column-end

  • 그리드 아이템(Item)을 배치하기 위해 그리드 선(Line)의 ‘시작 위치’와 ‘끝 위치’를 지정합니다. ‘숫자’를 지정하거나, ‘선 이름’을 지정하거나, span 키워드를 사용합니다.

grid-column

  • grid-column-start과 grid-column-end의 단축 속성입니다. 각 속성을 /로 구분하는 것에 주의하세요.

.item {
  grid-column: <grid-column-start> / <grid-column-end>;
}

grid-area

  • grid-row-start, grid-column-start, grid-row-end 그리고 grid-column-end의 단축 속성입니다. 혹은 grid-template-areas가 참조할 영역(Area) 이름을 설정할 수도 있습니다. 영역 이름을 설정할 경우 grid-row와 grid-column 개념은 무시됩니다.

.item {
  grid-area: <grid-row-start> / <grid-column-start> / <grid-row-end> / <grid-column-end>;
  grid-area: 영역이름;
}

align-self

  • 단일 그리드 아이템(Item)을 수직(열 축) 정렬합니다. 그리드 아이템의 세로 너비가 자신이 속한 그리드 행(Track)의 크기보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(위쪽) 정렬    
center   수직 가운데 정렬    
end   끝점(아래쪽) 정렬    
stretch   열 축을 채우기 위해 그리드 아이템을 늘림    

.container {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(2, 1fr);
}
.item:nth-child(1) { align-self: start; }
.item:nth-child(2) { align-self: center; }
.item:nth-child(3) { align-self: end; }
.item:nth-child(4) { align-self: stretch; }

justify-self

  • 단일 그리드 아이템(Item)을 수평(행 축) 정렬합니다. 그리드 아이템의 가로 너비가 자신이 속한 그리드 열(Track)의 크기보다 작아야 합니다.
  의미   기본값
normal   stretch와 같습니다.   normal
start   시작점(왼쪽) 정렬    
center   수평 가운데 정렬    
end   끝점(오른쪽) 정렬    
stretch   행 축을 채우기 위해 그리드 아이템을 늘림    

.container {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(2, 1fr);
}
.item:nth-child(1) { justify-self: start; }
.item:nth-child(2) { justify-self: center; }
.item:nth-child(3) { justify-self: end; }
.item:nth-child(4) { justify-self: stretch; }

place-self

  • align-self와 justify-self의 단축 속성입니다. 하나의 값만 입력하면 두 속성에 모두 적용됩니다.

.item {
  place-self: <align-self> <justify-self>;
}

order

  • 그리드 아이템이 자동 배치되는 순서를 변경할 수 있습니다. 숫자가 작을수록 앞서 배치됩니다.

.container {
  display: grid;
  grid-template-rows: repeat(2, 1fr);
  grid-template-columns: repeat(3, 1fr);
}
.item:nth-child(1) { order: 1; }
.item:nth-child(3) { order: 5; }
.item:nth-child(5) { order: -1; }

z-index

  • z-index 속성을 이용해 아이템이 쌓이는 순서를 변경할 수 있습니다.

.item:nth-child(1) {
  grid-area: 1 / 1 / 2 / 3;
}
.item:nth-child(2) {
  grid-area: 1 / 2 / 3 / 3;
  z-index: 1;
}
.item:nth-child(3) {
  grid-area: 2 / 2 / 3 / 4;
}

Grid Functions

repeat

  • repeat() 함수는 행/열(Track)의 크기 정의를 반복합니다.
    • ‘반복되는 횟수’와 ‘행/열의 크기 정의’를 인수로 사용합니다.
    • grid-template-rows와 grid-template-columns에서 사용합니다.

/* 9컬럼 그리드 */
.container {
  grid-template-columns: 100px 100px 100px 100px 100px 100px 100px 100px 100px;
}
.container {
  grid-template-columns: repeat(9, 100px);
}

minmax

  • minmax() 함수는 행/열(Track)의 ‘최소/최대 크기’를 정의합니다.
    • 첫 번째 인수는 ‘최솟값’이고 두 번째 인수는 ‘최댓값’입니다.
    • grid-template-rows, grid-template-columns, grid-auto-rows 그리고 grid-auto-columns에서 사용합니다.

.container {
  grid-template-columns: minmax(100px, 1fr) minmax(200px, 1fr);
}

fit-content

  • fit-content() 함수는 행/열(Track)의 크기를 그리드 아이템(Item)이 포함하는 내용(Contents) 크기에 맞춥니다.
    • ‘내용의 최대 크기’를 인수로 사용합니다.

.container {
  grid-template-columns: fit-content(300px) fit-content(300px);
}

Grid Units

  • 그리드에서 사용하는 주요 단위

fr

  • fr(fractional unit)은 사용 가능한 공간에 대한 비율을 의미합니다.

다음 예제는 그리드 컨테이너의 3번째 컬럼에 100px, 4번째 컬럼에 25%를 사용하고 남은 공간을 1번째 컬럼에 ‘1/3’, 2번째 컬럼에 ‘2/3’ 만큼 사용합니다.

.container {
  grid-template-columns: 1fr 2fr 100px 25%;
}

min-content

  • 그리드 아이템이 포함하는 내용(Contents)의 최소 크기를 의미합니다.
    • 한글을 사용하는 경우 word-break: keep-all;를 설정하면 정상적으로 동작합니다.

max-content

  • 그리드 아이템이 포함하는 내용(Contents)의 최대 크기를 의미합니다.

다음 예제는 총 4컬럼 그리드를 생성하며 각 열(Track)은 최대 1fr 크기를 가지지만, max-content를 통해 포함된 그리드 아이템의 내용보다 작아질 수 없습니다.

.container {
  grid-template-columns: repeat(4, minmax(max-content, 1fr));
}

auto-fill, auto-fit

  • 행/열(Track)의 개수를 그리드 컨테이너(Container) 및 행/열 크기에 맞게 자동으로(암시적) 조정합니다.
    • repeat() 함수와 같이 사용하며, 행/열과 아이템(Item) 개수가 명확할 필요가 없거나 명확하지 않은 경우 유용합니다.(반응형 그리드)

용어 정리

Track

  • 트랙(Track)은 하나의 행(Row) 혹은 열(Column)을 의미합니다.

Line

  • 선(Line)은 일반적으로 거터(Gutter)라고 하는 트랙과 트랙 사이의 간격을 의미합니다.

Cell

  • 셀(Cell)은 아이템(Item)이 배치되는 최소 단위의 영역(Area)입니다.

Area

  • 영역(Area)은 아이템이 배치되는, 하나 이상의 셀(Cell)로 이루어진 영역입니다.