Grid


상단에는 헤더, 왼쪽에는 사이드바, 그리고 메인 콘텐츠 영역과 푸터가 있는 페이지가 있다고 해봅시다. 컨테이너를 겹겹이 중첩해서 하나씩 자리를 맞춰 넣을 수도 있고, 배치를 바꿔야 하는 날이 오기 전까지는 대체로 잘 동작할 것입니다. CSS 그리드는 바로 이런 형태의 문제, 즉 페이지를 행과 열 양쪽 방향으로 동시에 배치하는 문제를 위해 만들어졌습니다. 레이아웃을 트랙의 집합으로 표현할 수 있게 되면, 래퍼와 float를 이리저리 조정하던 작업 대부분이 사라집니다.
그리드 컨테이너
어떤 요소에든 display: grid를 지정하면 그 요소를 그리드로 바꿀 수 있습니다. 그 요소는 **그리드 컨테이너**가 되고, 그 직속 자식들은 여러분이 정의한 그리드에 맞춰 배치되는 아이템이 됩니다. display: grid만으로는 별다른 일이 일어나지 않으므로, 열과 행을 몇 개로 나눌지, 각각의 크기를 얼마로 할지도 함께 지정해야 합니다.
열은 grid-template-columns로, 행은 grid-template-rows로 정의합니다. 목록의 각 값이 하나의 트랙이고, 트랙은 하나의 열 또는 행을 의미합니다.
.layout {
display: grid;
grid-template-columns: 200px 1fr; /* 두 개의 열: 고정폭 하나, 그리고 나머지 */
grid-template-rows: 80px 400px; /* 두 개의 행: 짧은 것 하나, 긴 것 하나 */
}display: grid를 추가하면 그 요소는 그리드 컨테이너가 되고, 직속 자식들이 그 안에 아이템으로 자리 잡습니다. 그런 다음 grid-template-columns와 grid-template-rows로 열과 행을 몇 개로 할지 정하는데, 트랙마다 값 하나씩 지정합니다. 이 트랙을 정의하기 전까지는 아무것도 정렬되지 않으므로, 이 작업이 언제나 첫 번째 단계입니다. 유연한 트랙
고정 픽셀 열도 괜찮지만, 대부분의 레이아웃은 공간을 균등하게 나눠 가지면서 화면 크기에 맞춰 늘어나는 열을 원합니다. 바로 그런 용도로 쓰는 것이 **fr 단위**입니다. 1fr은 남는 공간의 몫 하나를 의미하므로, 1fr씩 세 개의 열이 있으면 컨테이너를 3분의 1씩 나눠 갖습니다.
.gallery {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 동일한 크기의 세 열 */
}1fr을 세 번 타이핑하는 건 번거로우니, repeat()가 대신 써줍니다. 그리고 gap은 트랙 사이의 간격을 지정해주므로, 아이템마다 마진을 일일이 넣을 필요가 없습니다.
.gallery {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 위와 같은 동일한 크기의 세 열 */
gap: 16px; /* 행과 열 사이의 간격 */
}1fr 하나는 남는 공간의 몫 하나를 의미하므로, 1fr 1fr 1fr이면 동일한 크기의 열 세 개가 나옵니다. 같은 값을 계속 반복해서 타이핑하지 않으려면 repeat(3, 1fr)을 쓰고, 트랙 사이의 간격에는 gap을 쓰세요. fr이 이해되고 나서부터는 아무리 더해도 딱 맞지 않던 백분율을 더 이상 쓰지 않게 됐습니다. 아이템 배치하기
기본적으로 각 아이템은 순서대로 다음 빈 셀에 하나씩 들어갑니다. 아이템이 여러 셀에 걸쳐 있게 하려면 grid-column과 grid-row로 지정합니다. 트랙 사이의 선은 1부터 번호가 붙으므로, grid-column: 1 / 3은 "1번 선에서 시작해서 3번 선에서 끝난다"는 뜻이 되어 두 개의 열을 차지합니다.
.featured {
grid-column: 1 / 3; /* 1번 열 선부터 3번 선까지, 두 열 너비 차지 */
}선을 일일이 세고 싶지 않다면, span으로 아이템이 놓인 자리부터 몇 개의 셀을 차지할지 말할 수 있습니다.
.featured {
grid-column: span 2; /* 이 아이템이 놓인 자리부터 두 열을 차지 */
}grid-column이나 grid-row를 씁니다. 선 번호는 1부터 시작하므로 grid-column: 1 / 3은 두 열을 차지하고, 세고 싶지 않다면 span 2를 쓰면 됩니다. 이것만 알아도 영역에 이름을 붙이기 전에 대부분의 레이아웃을 만들 수 있습니다. 미디어 쿼리 없이 반응형 그리드 만들기
카드 한 줄을 넓은 화면에서는 세 개씩, 태블릿에서는 두 개씩, 폰에서는 한 개씩 보여줘야 하는 상황이 있습니다. 브레이크포인트를 하나도 쓰지 않고 그리드만으로 이걸 해낼 수 있습니다. 핵심은 한 줄입니다.
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 16px;
}안쪽부터 읽어보세요. minmax(200px, 1fr)은 각 열이 최소 200px, 최대는 공간의 몫 하나만큼이라는 뜻입니다. 그런 다음 auto-fit이 컨테이너에 들어갈 수 있는 만큼 그 열들을 최대한 채워 넣습니다. 화면이 넓으면 더 많은 열이 들어가고, 좁으면 더 적게 들어가면서 카드들이 스스로 다시 배치됩니다.
repeat(auto-fit, minmax(200px, 1fr))은 브레이크포인트 없이도 카드가 스스로 다시 배치되게 합니다. 각 열은 최소 200px, 최대 공간의 몫 하나이고, auto-fit이 들어갈 수 있는 만큼 채워 넣습니다. 200px을 바꾸면 나란히 놓이는 카드 개수가 달라집니다. 
