1분코딩 공부 내용을 바탕으로 정리한 글 입니다.
<div class="container">
<div class="item">A</div>
<div class="item">B</div>
<div class="item">C</div>
</div>
용어 | 설명 |
---|---|
그리드 컨테이너 | display: grid를 적용하는, Grid의 전체 영역이다. Grid 컨테이너 안의 요소들이 Grid 규칙의 영향을 받아 정렬된다고 생각하면 된다. |
그리드 아이템 | Grid 컨테이너의 자식 요소들입니다. 바로 이 아이템들이 Grid 규칙에 의해 배치되는 거예요 |
그리드 트랙 | Grid의 행(Row) 또는 열(Column) |
그리드 셀 | Grid의 한 칸을 가리키는 말이다. <div >같은 실제 html 요소는 그리드 아이템이고, 이런 Grid 아이템 하나가 들어가는 “가상의 칸(틀)”이라고 생각하면 됟다. |
그리드 라인 | Grid 셀을 구분하는 선 |
그리드 번호 | Grid 라인의 각 번호 |
그리드 갭 | Grid 셀 사이의 간격 |
그리드 영역 | Grid 라인으로 둘러싸인 사각형 영역으로, 그리드 셀의 집합 |
Flex와 마찬가지로, Grid는 컨테이너에 display: grid; 를 설정하는 것으로 시작한다.
/* 아이템들이 block 요소라면 이 한 줄 만으로는 딱히 변화 없다. */
.container {
display: grid;
/* display: inline-grid; */
}
컨테이너에 Grid 트랙의 크기들을 지정해주는 속성
grid-template-rows는 행(row)의 배치,
grid-template-columns는 열(column)의 배치를 결정해준다.
여러가지 단위를 사용할 수 있고 섞어서 쓸 수도 있다.
.container {
grid-template-columns: 200px 200px 500px;
/* grid-template-columns: 1fr 1fr 1fr */
/* grid-template-columns: repeat(3, 1fr) */
/* grid-template-columns: 200px 1fr */
/* grid-template-columns: 100px 200px auto */
grid-template-rows: 200px 200px 500px;
/* grid-template-rows: 1fr 1fr 1fr */
/* grid-template-rows: repeat(3, 1fr) */
/* grid-template-rows: 200px 1fr */
/* grid-template-rows: 100px 200px auto */
}
.container {
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, minmax(100px, auto));
}
grid-template-columns(또는 grid-template-rows)의 통제를 벗어난 위치에 있는 트랙의 크기를 지정하는 속성이다.
columns나 row 개수를 미리 알 수 없는 경우에 사용한다.
.container {
grid-auto-rows: minmax(100px, auto);
}
auto-fill
.container {
grid-template-columns: repeat(auto-fill, minmax(20%, auto));
}
auto-fit
column-gap
.container {
grid-column-gap: 10px;
/* column의 간격을 10px로 */
}
row-gap
.container {
grid-row-gap: 10px;
/* row의 간격을 10px로 */
}
gap
.container {
grid-gap: 10px;
/* 전체적으로 gap을 부여함 */
}
grid-column-start
grid-column-end
grid-column
grid-row-start
grid-row-end
grid-row
위의 빨간색 영역을 코드로 쓰면 아래와 같다.
.item1 {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 2;
}
.item1 {
grid-column: 1 / 3;
grid-row: 1 / 2;
}
위의 파란색색 영역을 코드로 쓰면 아래와 같다.
.item1 {
grid-column-start: 3;
grid-column-end: 4;
grid-row-start: 2;
grid-row-end: 4;
}
.item1 {
grid-column: 3 / 4;
grid-row: 2 / 4;
}
.item1 {
grid-column: 3 / -1;
grid-row: 2 / -1;
}
시작번호 / 끝번호를 지정하는 방법 외에, 몇 개의 셀을 차지하게 할 것인지를 지정해줄 수도 있다.
.item1 {
/* 1번 라인에서 2칸 */
grid-column: 1 / span 2;
/* 1번 라인에서 3칸 */
grid-row: 1 / span 3;
}
grid-column을 이용해 ‘통제받지 않는’ column들을 만들 수 있다.
.container {
grid-template-columns: 50px;
grid-auto-columns: 1fr 2fr;
}
.item:nth-child(1) { grid-column: 2; }
.item:nth-child(2) { grid-column: 3; }
.item:nth-child(3) { grid-column: 4; }
.item:nth-child(4) { grid-column: 5; }
.item:nth-child(5) { grid-column: 6; }
.item:nth-child(6) { grid-column: 7; }
/* end를 생략하면 그냥 한 칸임 */
grid-template-areas
.container {
grid-template-areas:
"header header header"
" a main b "
" . . . "
"footer footer footer";
}
각 영역의 이름을 매칭하기 위해 해당 아이템 요소에 grid-area 속성으로 이름을 지정해주면 된다.
.header { grid-area: header; }
.sidebar-a { grid-area: a; }
.main-content { grid-area: main; }
.sidebar-b { grid-area: b; }
.footer { grid-area: footer; }
/* 이름 값에 따옴표가 없는 것에 주의 */
grid-auto-flow
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(25%, auto));
grid-template-rows: repeat(5, minmax(50px,auto));
grid-auto-flow: dense;
}
item:nth-child(2) { grid-column: auto / span 3; }
item:nth-child(5) { grid-column: auto / span 3; }
item:nth-child(7) { grid-column: auto / span 2; }
align-items
.container {
align-items: stretch;
/* align-items: start; */
/* align-items: center; */
/* align-items: end; */
}
justify-items
.container {
justify-items: stretch;
/* justify-items: start; */
/* justify-items: center; */
/* justify-items: end; */
}
.container {
place-items: center start;
}
align-content
.container {
align-content: stretch;
/* align-content: start; */
/* align-content: center; */
/* align-content: end; */
/* align-content: space-between; */
/* align-content: space-around; */
/* align-content: space-evenly; */
}
justify-content
.container {
justify-content: stretch;
/* justify-content: start; */
/* justify-content: center; */
/* justify-content: end; */
/* justify-content: space-between; */
/* justify-content: space-around; */
/* justify-content: space-evenly; */
}
.container {
place-content: space-between center;
}
align-self
.item {
align-self: stretch;
/* align-self: start; */
/* align-self: center; */
/* align-self: end; */
}
justify-self
.item {
justify-self: stretch;
/* justify-self: start; */
/* justify-self: center; */
/* justify-self: end; */
}
.item {
place-self: start center;
}
order
.item:nth-child(1) { order: 3; } /* A */
.item:nth-child(2) { order: 1; } /* B */
.item:nth-child(3) { order: 2; } /* C */
.item:nth-child(5) {
z-index: 1;
transform: scale(2);
}
/* z-index를 설정 안하면 0이므로, 1만 설정해도 나머지 아이템을 보다 위로 올라온다 */