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)로 이루어진 영역입니다.