아래 예시 코드로 공부 진행합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
block 속성을 갖는 div 박스가 9개가 쌓여있다.
* display: grid;
grid container 박스를 정의해준다.
예시 코드에서 grid-container 클래스를 갖는 div 박스에 display: grid를 써주면 아무 변화가 없다.
하지만 grid-item 클래스를 갖는 div 박스들이 block요소가 아니라 inline-block 요소일 때, grid-container 클래스를 갖는 div 박스에 display: grid를 써주면 item들이 block요소로 쌓이게 된다.
* grid-template-columns
열의 개수와 넓이를 결정한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: 200px 300px;
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
.grid-container에 grid-template-columns: 200px 300px;을 부여하면 첫 번째 열이 200px이고 두 번째 열이 300px인 div 박스가 만들어진다.
grid-template-columns: 1fr 1fr 1fr이면 같은 1:1:1 비율로 3개의 열이 생겨난다. 그리고 1fr이 반복적으로 쓰이므로 grid-template-columns: repeat(3, 1fr)로 쓸 수 있다.
만약 grid-template-columns: repeat(3, 1fr 2fr 1fr)을 쓰면 1:2:1 비율로 3번 반복돼서 9개의 열이 나타난다.
* grid-template-rows
행의 개수와 높이를 정한다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: 200px 300px;
grid-template-rows: 100px 100px 100px;
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
.grid-container 박스에 grid-template-rows: 100px 100px 100px을 적용시키니까 3개의 행이 100px을 갖는 것을 볼 수 있다.
정의되지 않은 박스들은 기본 높이값을 갖는다.
grid-template-columns와 같이 repeat() 함수를 사용할 수 있다.
기본적으로 부모 container 박스 높이를 따라간다. 1fr 단위를 사용한 것과 같은 출력 모습이 나온다.
몇몇 item에 내용을 넣어보면 다음과 같다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: 200px 300px;
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium nam esse ad at dolore provident impedit ut a sapiente omnis.</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
높이의 최솟값과 최댓값을 넣을 수 있다.
* minmax()
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: 200px 300px;
grid-template-rows: repeat(3, minmax(100px, auto));
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium nam esse ad at dolore provident impedit ut a sapiente omnis.</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
5번과 6번 셀을 보면 최솟값인 100px 높이가 유지되는 것을 볼 수 있고, 내용물이 100px 높이를 넘어가는 셀은 자동으로 내용물 높이로 유지되는 것을 볼 수 있다.
* auto-fill / auto-fit
repeat() 함수에서 열의 개수를 정해두지 않아도 정해진 넓이만큼 셀이 채워진다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(20%, auto));
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium nam esse ad at dolore provident impedit ut a sapiente omnis.</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
repeat() 함수에 숫자 대신 auto-fill을 사용해서 최소 넓이가 20% 박스들이 한 행에 5개가 들어간 것을 볼 수 있다.
미디어쿼리를 사용하지 않아도 반응형 페이지를 만들 수 있게 해 준다.
auto-fit도 auto-fill과 같은 역할을 하는데, 둘의 차이점은 다음과 같다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(20%, auto));
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
</div>
</body>
</html>
auto-fill은 부모의 공간이 남아도 각자 20% 넓이를 유지하지만,
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(20%, auto));
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
</div>
</body>
</html>
auto-fill은 부모의 공간이 남으면 남은 공간까지 채운다.
* row-gap / column-gap / gap
셀의 간격을 만들어준다.
예전에는 grid-gap이라고 쓰였었다.
기본값은 0이다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>그리드 연습</title>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(3, minmax(20%, auto));
row-gap: 10px;
}
.grid-item {
border: 1px solid #000;
background-color: orange;
}
</style>
</head>
<body>
<div class="grid-container">
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Quas, libero!</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Doloremque error cupiditate nostrum ad dolorum soluta non maiores in dignissimos reprehenderit cumque voluptatibus, ducimus nihil, reiciendis quasi. Optio alias assumenda ratione?</div>
<div class="grid-item">3</div>
<div class="grid-item">Lorem ipsum dolor sit amet consectetur adipisicing elit. Laudantium nam esse ad at dolore provident impedit ut a sapiente omnis.</div>
<div class="grid-item">5</div>
<div class="grid-item">6</div>
<div class="grid-item">7</div>
<div class="grid-item">8</div>
<div class="grid-item">9</div>
</div>
</body>
</html>
row-gap으로 행의 간격이 10px 생겨난 것을 볼 수 있다.
위 사진은 row-gap 대신 column-gap: 10px을 준 사진이다.
gap은 행과 열, 둘 다 간격을 줄 수 있다.
* grid-auto-columns / grid-auto-rows
열과 행의 개수에 상관없이 모든 셀의 넓이와 높이를 정할 수 있다. (셀이 몇 개 생겨날지 모를 경우 사용)
* grid-column-start / grid-column-end / grid-column / grid-row-start / grid-row-end / grid-row
셀의 영역을 지정해준다.
grid-column과 grid-row는 축약형이다. (ex. grid-column: 1/3;)
grid-column: 3 / span 2;는 3번 열 3번 라인으로부터 2칸을 차지하겠다는 의미이다.
한 칸만 차지할 경우 end는 안 써줘도 된다.
* grid-template-areas
셀의 이름을 사용하여 영역을 지정할 수 있다.
각 item에 grid-area로 이름을 지정해준다.
* grid-auto-flow: row(기본) / column / dense / row dense / column dense;
grid-column: auto / span 3;을 사용하여 자동으로 셀이 채워질 때, 빈 공간을 채울 건지 빈 공간으로 둘 건지 정할 수 있다.
* align-items: stretch(기본) / start / center / end;
item들을 세로 방향으로 정렬한다.
* justify-items: stretch(기본) / start / center / end;
item들을 가로 방향으로 정렬한다.
* place-items
align-items와 justify-items를 같이 쓸 수 있는 축약형 속성이다.
속성을 하나만 쓰면 둘 다 적용이 된다.
* align-content: stretch(기본) / start / center / end / space-between / space-around / space-evenly
item들의 높이를 모두 합한 값이 컨테이너 높이보다 작을 때 item들을 통째로 세로 정렬한다.
셀 하나당 정렬되는 것이 아니라 컨테이너 안에서 item들이 통째로 정렬된다는 것이 특징이다.
* justify-content: stretch(기본) / start / center / end / space-between / space-around / space-evenly
item들을 통째로 가로 정렬한다.
* place-content
align-content와 justify-content를 같이 쓸 수 있는 축약형 속성이다.
* align-self: stretch(기본) / start / center / end;
item에 적용하는 속성으로 item 개별적으로 세로 정렬된다.
* justify-self: stretch(기본) / start / center / end;
item에 적용하는 속성으로 item 개별적으로 가로 정렬된다.
* place-self
align-self와 justify-self를 같이 쓸 수 있는 축약형 속성이다.
* order
item의 웹에서 보이는 순서를 정할 수 있다.
스크린 리더가 읽는 순서와 다를 수 있다.
* z-index
숫자가 클수록 위로 올라온다.
'CSS' 카테고리의 다른 글
CSS 우선순위 (0) | 2020.07.14 |
---|---|
CSS 선언 방법 (0) | 2020.07.14 |
CSS 네이밍 케이스 (0) | 2020.07.14 |
CSS3 Design (0) | 2020.07.14 |
Css Flex 속성 (0) | 2020.06.23 |