[CSS] CSS Grid 완벽 정리
by 한만섭
이 글은 CSS Grid에 대해서 몰랐던 내용들과 개념을 정리하는 글입니다. 자세한 속성과 사용법에 대해서는 참고 사이트 확인해주세요.
`
Grid를 언제 왜 써야하는지 알아야 사용할 이유가 생기기 때문에 이 부분에 대해서 정리해보겠습니다.
결론부터 말씀드리면 flex
는 하나의 행 또는 열 즉, 1차원의 레이아웃을 잡는데 용이하고, Grid
는 행과열을 동시에 사용하는 2차원 레이아웃을 잡는데 용이합니다.
flex
기존에 float
혹은 table
로 수평 레이아웃을 잡는 어려움을 해결하기 위해 flex
가 나왔습니다. 덕분에 flex
를 통해서 수평, 혹은 수직에 대해서 구조를 잡을 때 쉽게 잡을 수 있게 되었습니다.
하지만 flex
에서도 아래와 같은 상황에서는 문제가 발생합니다.
아래처럼 flex_container
가 자식 요소들의 너비보다 클 경우 넘치지 않지만,
.flex_container {
width: 500px;
height: 100px;
display: flex;
flex-wrap: wrap;
}
.flex_item {
flex: 1 1 100px;
}
아래처럼 아이템의 크기를 늘리게 될 경우 넘치게 됩니다.
.flex_item {
flex: 1 1 150px;
}
4번과 5번이 1,2번과 함께 수직 정렬이 되지 않고 늘어나게 됩니다. 이렇게 되는 이유는 flex는 각각의 행이 기준이 되어 정렬을 하기 때문입니다.
Grid
Grid로는 아래와 같이 해결할 수 있습니다.
.grid_container {
width: 500px;
border: 1px solid #333;
height: 100px;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, auto));
margin: 50px auto 0;
}
Grid는 언제 써야할까?
이 부분에 대해서 정답이 있는 것은 아니지만, 2차원 구조를 쉽게 잡을 수 있다는 점이 있기 때문에 세부적인 콘텐츠를 배치할 때 사용하기 보다 전체적인 페이지 레이아웃을 작성할 때 사용하면 좋습니다. 따라서 전체적인 레이아웃을 grid
를 통해서 잡은 후에 콘텐츠에 들어가는 요소들을 flex
로 배치하는 방식으로 많이 사용하고 있습니다.
하지만 새로운 기술인 만큼 지원하지 않는 브라우저도 많습니다.
IE에서는 11에서도 -ms-
prefix를 붙혔을 때 일부 기능만 제공 합니다. 대부분의 속성들이 지원하지 않기 때문에 웹 서비스에서 사용할 수 있는 일은 없을 것 같습니다.
auto-fit 과 auto-fill
Auto-fit과 auto-fill의 차이점은 컨테이너에 콘텐츠들을 채워놓고 남은 공간을 어떻게 사용하는지입니다.
Auto-fill
auto-fill
은 아래와 같이 콘텐츠들을 채우고 남는 공간을 그대로 놔둡니다.
.grid_container {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
auto-fit
auto-fit
은 아래와 같이 콘텐츠들을 채우고 남는 공간을 콘텐츠들이 나눠가져 남는 공간이 없게 합니다.
.grid_container {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
auto-fit
과 minmax
를 이용한다면 브라우저의 크기에 따라 부드럽게 변하는 반응형 레이아웃을 쉽게 제작할 수 있을 것 같습니다.
grid 속성의 단위
fr (fractional unit)
grid
를 사용하면 fr
이라는 단위를 많이 사용합니다. 처음에는 이것의 숫자가 크면 많은 공간을 차지하는 줄로만 알았습니다. 틀린 얘기는 아니지만, 정확히 얘기하면
남는 공간에 대한 비율이라고 얘기할 수 있습니다.
.grid_container {
max-width: 1000px;
display: grid;
grid-template-columns: 50px 25% 1fr 1fr 1fr;
}
첫번째 상자는 50px, 두번 째 상자는 25%인 250px의 너비를 갖게됩니다. 나머지 아이템들은 각각 1fr씩 갖게 되는데 위에서 말했던 것 처럼 남는공간 즉, 700px에 대한 공간을 1/3씩 가져가게 됩니다.
fr
은 비율이라서 상대적으로 적용되기 때문에 아래와 같은 상황에서는 fr
값에 1말고도 다른 어떤 값을 넣어도 같은 결과가 나옵니다. 나눠가질 값을 비교할 상대가 없기 때문입니다.
.grid_container {
max-width: 1000px;
display: grid;
grid-template-columns: repeat(4, 100px) 1fr;
}
grid에서의 fr
은 flex
에서 공간을 차지할 비율을 결정하는 방식과 동일합니다.
.flex_container {
display: flex;
}
.flex_item:nth-child(1) {flex: 1;}
.flex_item:nth-child(2) {flex: 2;}
.flex_item:nth-child(3) {flex: 2;}
.flex_item:nth-child(4) {flex: 2;}
.flex_item:nth-child(5) {flex: 1;}
min-content
grid아이템이 최소 너비를 갖게 해주는 단위입니다.
auto
값과 동일한 것 아냐? 라고 생각했었지만 auto
와 min-content
는 아래와 같이 차이가 있습니다.
auto
.grid_container {
display: grid;
grid-template-columns: auto repeat(4, 1fr);
}
min-content
.grid_container {
display: grid;
grid-template-columns: min-content repeat(4, 1fr);
}
한글의 경우 한글자 단위가 최소 콘텐츠라고 계산하여 한글자 단위로 자르게 됩니다. 영어는 단어를 최소 단위로 계산합니다.
word-break
속성을 통해서 원하는 기준으로 바꾸면 됩니다. 개행없는 최소 길이를 원한다면break-all
한글 단어 단위로 자르고 싶다면 keep-all
을 하게 되면 콘텐츠의 내용에 따라서 길이를 조절할 수 있습니다.
max-content
min-content
와는 반대로 최대 콘텐츠 길이를 뜻하는데 이 것과 minmax
속성을 이용하면 아래와 같이 콘텐츠 영역보다 작아졌을 때는 줄어들지 않도록 작성할 수 있습니다. auto
와 비교하면 아래와 같습니다.
max-content
.grid_container {
display: grid;
grid-template-columns: repeat(5, minmax(max-content, 1fr));
}
auto
auto
로 하게 될 경우 단어 단위로 쪼갤 수 있기 때문에 콘텐츠의 최소 너비가 더 줄어든 것을 확인할 수 있습니다.
.grid_container {
display: grid;
grid-template-columns: repeat(5, minmax(auto, 1fr));
}
이 속성을 사용하면 가변적인 콘텐츠에서의 대응이 가능할 것 같습니다.
Subscribe via RSS