그리드
2차원(행/열) 레이아웃 도구이자 CSS 모듈이다.
지원 브라우저 별 버전
can i use 사이트에서 확인 가능하다.
용어
- Grid Container
display : grid가 적용되는 요소로 Grid Item 들을 포함하는 부모가 된다. - Grid Item
Grid Container의 자식이다.
<div class="container"> <div class="item"> </div> <div class="item"> </div> </div>
- Grid Line
그리드의 수직선/수평선을 뜻한다. 맨 좌측끝 부터 1,2,3... 카운트 된다.
수직선 = 열 격자선, 수평선 = 행 격자선 - Gird Shell
인접한 4개의 Grid Line 사이의 공간을 뜻한다. Grid의 단일 단위이다.
- Grid Track
2개의 Grid Line 사이의 공간이다. 행 또는 열로 생각하면 된다.
수평선 a번 ~ 수평선 b번 → 행 (row)
수직선 c번 ~ 수직선 d번 → 열 (column)
- Grid Area
4개의 Grid Line으로 둘러싸인 전체 공간이다. 여러 Grid Shell로 구성될 수 있다. - Grid Gap
Grid Shell 사이의 간격
Display (그리드 컨테이너 정의)
.container {
display: grid | inline-grid;
}
- grid (기본값) : grid 레이아웃 적용
- inline-grid : grid 레이아웃 적용, container 영역이 item에 딱 맞춰짐
Display (그리드 컨테이너 정의)
.container {
display: grid | inline-grid;
}
- grid (기본값) : 블록-level grid 레이아웃 적용
- inline-grid : 인라인-level grid 레이아웃 적용
grid-template-rows, colums (그리드 행/열 정의)
.container {
grid-template-rows: ... ...;
grid-template-columns: ... ...;
}
- track-size : 길이(px, auto), 백분율(%), 여유공간(fr) 등이 올 수 있다. (공백 구분)
예를 들어 1fr 4개면 4개의 행 또는 열이 생성된다.
이때 똑같은 1fr이 반복되므로, repeat(반복횟수, 반복값)를 써서 깔끔하게 작성가능하다.
※ fr (fraction)은 숫자 비율대로 grid track 크기를 나누는 단위 (1fr 4개면 1:1:1:1)
(예시1 - repeat)
.container { grid-template-rows: 1fr 1fr 1fr 1fr; grid-template-rows: repeat(4, 1fr); }
또한 px, auto, fr 단위를 섞어서 써도 된다.
만약 1열의 크기는 고정시키고 나머지 부분만 조절하고 싶다면, 아래와 같이 하나만 px로 고정.
(얘시2 - 혼용)
.container { grid-template-columns: 100px 1fr 1fr 1fr }
만약 특정 범위 안에서만 크기가 변경되게 만들고 싶다면, minmax(최소값, 최대값)를 사용한다.
아래 예시는 모든 grid 들이 최소한 100px 크기를 유지하고, 내용이 커지면 auto(자동)으로 늘어나게된다.
(예시3 - minmax)
.container { grid-template-columns: minmax(100px, auto) }
- line-name : grid line(수평선)에 지정한 이름
grid line마다 이름을 붙여놓고 크기 조절을 해줄 수 있다.
이름 붙이는 방법은 아래와 같다.
1. 라인명에 접미사(-start, -end) 를 붙여서 지정하면 접미사 뗀 "라인명" 이라는 grid area에 적용이 된다.
ex) main-start, main-end는 main영역에 적용
그런데.container { grid-template-columns: [라인명-start] 크기 [라인명-end] ...; }
(예시4 - line-name)
.container { grid-template-columns: [main-start] 40px [content-start] 50px [content-end] 40px [main-end]; grid-template-rows: [row1-start] 25% [row1-end] 100px [row2-start] auto [row2-end]; } .a { grid-area: main; } .b { grid-area: content; }
2. grid-template-areas 으로 이름 붙이기
이어지는 아래 내용 참고바람.
grid-template-areas (그리드 영역 정의)
.container {
grid-template-areas:
"<grid-area-name> | . | none | ..."
...
"<grid-area-name> | . | none | ...";
}
- grid-area-name : 그리드 영역의 이름
- . : 마침표는 empty grid shell을 나타냄
- none : grid area가 정의되지 않음.
아래와 같이 미리 레이아웃을 그리므로 한눈에 보기도 좋고, 반응형 디자인 만들때도 매우 유용하다.
.container { display: grid; grid-template-columns: repeat(9, 1fr); grid-auto-rows: minmax(100px, auto); grid-template-areas: "hd hd hd hd hd hd hd hd hd" "sd sd sd main main main main main main" "ft ft ft ft ft ft ft ft ft"; } .header { border: 4px solid red; grid-area: hd; } .footer { border: 4px solid ; grid-area: ft; } .content { border: 4px solid blue; grid-area: main; } .sidebar { border: 4px solid green; grid-area: sd; } /* html */ <body> <div class="container"> <div class="header">Header</div> <div class="sidebar">Sidebar</div> <div class="content">Content</div> <div class="footer">Footer</div> </div> </body>
참고
repeat(auto-fill, minmax(min-content, 250px));
이런 식으로도 합쳐서 사용하기도 하는데
auto-fill과 auto-fit은 차이점은 뭘까?
그리드 컨테이너가 하나의 행/열(Track)에 모든 아이템을 수용하고 남는 공간이 있을 때 발생한다. auto-fill은 남는 공간(빈 트랙)을 그대로 유지하고, auto-fit은 남는 공간을 축소합니다.
minmax는 창 크기변했을때 각 그리드 요소들의 최소크기/최대크기를 지정하는 것이다.
grid-template (grid-template-rows + columns + area)
.container {
grid-template: none | <grid-template-rows> / <grid-template-columns>;
}
grid-template는 rows,columns,area 3가지를 한번에 작성하는 방법이다.
.container {
grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
grid-template-columns: auto 50px auto;
grid-template-areas:
"header header header"
"footer footer footer";
}
위의 구문은 아래와 동일하다.
.container {
grid-template:
[row1-start] "header header header" 25px [row1-end]
[row2-start] "footer footer footer" 25px [row2-end]
/ auto 50px auto;
}
아래와 같이 line-name없이 작성해도 된다.
.container {
grid-template:
"a a a" 40px
"b c c" 40px
"b c c" 40px / 1fr 1fr 1fr;
}
ㅊdge 16, Chrome66 이상 등... 에서 지원됨.
예를 들어 2x4 그리드에 gap을 추가해주면 아래와 같이 gap이 생긴다.
.container {
list-style: none;
display: inline-grid;
grid-template-columns: repeat(4, 1fr);
column-gap: 5px;
row-gap: 5px;
}
정렬
정렬 부분을 시작하기 전에 개인적으로 헷갈린 부분 짚고 넘어가려 한다.
-content 가 붙은 것은 블록단위가 컨테이너인 정렬
-items 가 붙은 것은블록단위가 각 item인 정렬
Flexbox
- justify-content : 메인 축 정렬 (블록단위 : 컨테이너)
- align-items : 크로스 축 정렬 (블록단위 : 각 item)
- align-content : 크로스 축 정렬 (flex-wrap : wrap 에서만 동작) (블록단위 : 컨테이너)
Grid
- justify-items : 가로 방향 정렬 (블록단위 : 각 item)
- align-items : 세로 방향 정렬 (블록단위 : 각 item)
- justify-content : 가로 방향 정렬 (블록단위 : 컨테이너)
- align-content : 세로 방향 정렬 (블록단위 : 컨테이너)
justify-items (가로 방향 정렬, 블록단위 : 각 item)
.container {
justify-items: start | end | center | stretch;
}
- stretch (기본값) : 늘리기 (item의 width: auto 일 때만 적용됨)
- start : 시작 가장자리로 정렬
- end : 끝 가장자리로 정렬
- center : 중앙으로 정렬
align-items (세로 방향 정렬, 블록단위 : 각 item)
.container {
align-items: start | end | center | stretch;
}
flexbox에서는 justify-content(메인 축 정렬), align-items(크로스 축 정렬), justify-items(wrap된 요소들의 정렬)
grid에서는 justify-items(가로 방향 정렬), align-items(세로 방향 정렬)
- stretch (기본값) : 늘리기 (item의 height: auto 일 때만 적용됨)
- start : 시작 가장자리로 정렬
- end : 끝 가장자리로 정렬
- center : 중앙으로 정렬
justify-content (가로 방향 정렬, 블록단위 : 컨테이너)
.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
- stretch (기본값) : 끝까지 늘림 (grid-template-colums 값이 고정 단위면 적용안됨)
- start : 컨테이너의 시작 부분으로 배치됨
- end : 컨테이너 끝 부분으로 배치됨
- center : 컨테이너 중앙에 배치됨
- space-around : item 주변에 동일한 여백으로 배치
- space-between : 양끝 부분을 밀착시키고 중간 item들을 동일 간격 배치
- space-evnely : 양끝을 포함한 모든 여백을 동일하게
align-content (세로 방향 정렬, 블록단위 : 컨테이너)
.container {
align-items: start | end | center | stretch;
}
- stretch (기본값) : 끝까지 늘림 (item값이 height: auto여야 적용됨)
- start : 컨테이너의 시작 부분으로 배치됨
- end : 컨테이너 끝 부분으로 배치됨
- center : 컨테이너 중앙에 배치됨
- space-around
- space-between
- space-evnely
place-content (align-content + justify-content, 블록단위 : 컨테이너)
.container {
place-content: <align-content> / <justify-content>
}
.container {
place-content: start / center
}
grid-auto-columns, rows (암시적 grid track 크기 설정)
.container {
grid-auto-columns: <track-size> ...;
grid-auto-rows: <track-size> ...;
}
- track-size : 암시적 그리드 트렉의 크기.
기본적으로 암시적 grid track 크기는 grid-template-columns/rows에 설정된 값을 따라가는데 크기를 따로 설정해주고 싶을 때 사용한다.
auto-fill과 auto-fit은 차이점은 그리드 컨테이너가 하나의 행/열(Track)에 모든 아이템을 수용하고 남는 공간이 있을 때 발생합니다.
다음과 같이 auto-fill은 남는 공간(빈 트랙)을 그대로 유지하고, auto-fit은 남는 공간을 축소합니다.
※ 암시적 grid track (자동 생성된 grid track) : 사용자가 설정하지 않은 임의의 트렉이 만들어지는 것.
예를 들어 grid-template로 설정된 레이아웃 크기를 벗어나는 값을 grid-row, grid-column 를 통해 가리키면 임의의 트렉이 추가된다. 이를 암시적 grid track이라 함.
grid-auto-flow (미배치된 grid-area를 포함한 item을 배치하는 알고리즘 작동 방식 제어)
.container {
grid-auto-columns: <track-size> ...;
grid-auto-rows: <track-size> ...;
}
- row (기본값) : 각 행을 차례로 채우고, 필요에 따라 새 행을 추가
- column : 각 열을 차례로 채우고, 필요에 따라 새 행을 추가
- row dense (dense) : (빈영역을 최대한 채우며) 각 행을 차례로 채우는데, 필요에 따라 새 행을 추가
- column dense : (빈영역을 최대한 채우며) 각 열을 차례로 채우고, 필요에 따라 새 열을 추가
grid (grid-template-rows, columns, areas + grid-auto-rows, columns, flow)
.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: auto-flow dense 100px / 1fr 2fr;
}
/* 위와 동일한 구문임*/
.container {
grid-auto-flow: row dense;
grid-auto-rows: 100px;
grid-template-columns: 1fr 2fr;
}
- none : 모든 하위 속성을 초기값 설정
- grid-template
- grid-template-rows / [auto-flow && dense?] grid-auto-columns
- [auto-flow && dense?] grid-auto-rows? / grid-template-columns
grid-column-start, end / grid-row-start, end (grid item 위치 결정)
.item {
grid-column-start: <number> | <name> | span <number> | span <name> | auto;
grid-column-end: <number> | <name> | span <number> | span <name> | auto;
grid-row-start: <number> | <name> | span <number> | span <name> | auto;
grid-row-end: <number> | <name> | span <number> | span <name> | auto;
}
- line : grid line 번호 또는 line을 참조하는 이름
a번 부터 b번 까지 라는 뜻.
.item { grid-column-start:1; grid-column-end: 3; grid-row-start: 1; grid-row-end: 2; }
- span number : number 만큼 line을 확장 (default : 1)
a번 부터 +number 만큼 이라는 뜻 - span name : 라인을 참조하는 이름을 사용함. 동작은 위와 동일
물론 -로 확장도 가능함. (끝이 3이고 3-2=1까지).item { grid-column-start:1; grid-column-end: span 2; grid-row-start: 1; grid-row-end: span 1; }
.item { grid-column-start: span 2; grid-column-end: 3; }
- auto : 자동 배치, 자동 범위 or 기본 범위
grid-column (grid-column-start + end)
grid-row (grid-row-start + end)
.item {
grid-column: <start-line> / <end-line> | <start-line> / span <value>;
grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}
start 와 end를 한꺼번에 작성하는 방식이다.
grid-area (grid-template-areas 에서 참조하도록 item에 이름 붙이기)
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
container에 grid-template-areas에서 참조하는 이름이다.
원하는 item에 grid-area: header; 이런 식으로 붙이면 된다.
- name : 선택한 이름
- row-start / column-start / row-end / column-end (숫자 또는 이름) :
.item-d { grid-area: 1 / col4-start / last-line / 6; }
justify-self (가로 방향 정렬, 블록 단위 : 단일 item)
.item {
justify-self: start | end | center | stretch;
}
- stretch (기본값) : 늘리기
- start : 시작점으로 정렬
- end : 끝점으로 정렬
- center : 중앙 정렬
align-self (세로 방향 정렬, 블록 단위 : 단일 item)
.item {
align-self: start | end | center | stretch;
}
- stretch (기본값) : 늘리기
- start : 시작점으로 정렬
- end : 끝점으로 정렬
- center : 중앙 정렬
place-self (align-self + justify-self, 블록 단위 : 단일 item)
.item {
align-self: <align-self> / <justify-self>
}
'프론트엔드 개발 > HTML CSS' 카테고리의 다른 글
CSS - inline, block, inline-block (0) | 2021.09.19 |
---|---|
CSS - 텍스트 정렬, 간격 조절 (0) | 2021.09.13 |
CSS - Flexbox, Grid 연습 사이트 (0) | 2021.09.07 |
CSS - Flexbox (플렉스 박스) (0) | 2021.09.06 |
CSS - 텍스트 스타일 (0) | 2021.09.03 |