✔️ CSS Layout
이번 시간에는 minmax 에 대해 알아볼 것 이다.
가장 좋은 예로는 요소가 가능한 엄청 크길 원하는데 하지만 동시에 엄청 작게 되진 않길 원할때 쓸 수 있다.
먼저 우리의 코드를 확인해보면...
<body>
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
</div>
</body>
.grid {
color: white;
display: grid;
gap: 5px;
grid-template-columns: repeat(10, 1fr);
grid-template-rows: repeat(4, 100px);
grid-auto-columns: 100px;
}
.item:nth-child(odd) {
background-color: #2ecc71;
}
.item:nth-child(even) {
background-color: #3498db;
}
column 을 10칸으로 1fr 로 설정해둔 것이다.
만약 공간을 줄인다면...
각 박스들의 가로 길이가 확연히 줄어든 걸 알 수 있다.
그 이유는 1fr 은 엄청 작은 공간때문에 작어졌다.
우리는 이 item 들이 원하는 만큼 충분한 공간을 가지고 있었으면 한다.
그러니까 화면을 줄어들더라도, 너무 많이 안 줄었으면 한다.
이 때, 제한을 두는 것이다. (바로 minmax 를 사용하는 것!)
grid-template-columns: repeat(10, minmax(100px, 1fr));
minmax 안에 첫 번째 인자로는 최소 크기를 지정해주고, 두 번째는 최대 크기를 지정한 것이다.
이제 화면을 스크롤하면서 item 들을 볼 수 있는데 그 이유는 최소한의 크기가 100px 이기 때문이다.
그 이상으로 줄어들 수 없다!
아 그리고 다음처럼 코드를 바꿔준다.
(10칸이 아니라 5칸으로 수정해주었다.)
grid-template-columns: repeat(5, minmax(100px, 1fr));
최대 크기는 1fr 이고 최소한으로 줄여보면...
100px 가로 길이로 된다.
다음으로 넘어가서...
이번엔 CSS grid 를 이용해서 쉽게 반응형 디자인을 만들 수 있는지 알아보자!
특히 auto-fit 이랑 auto-fill 을 이용해서 알아보는 것이다!
이 두 키워드는 repeat 함수에만 사용할 것 이다.
먼저 코드를 보면...
<body>
auto-fill
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
auto-fit
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
</body>
.grid {
color: white;
display: grid;
gap: 5px;
grid-auto-rows: 100px;
margin-bottom: 30px;
}
.item:nth-child(odd) {
background-color: #2ecc71;
}
.item:nth-child(even) {
background-color: #3498db;
}
.grid:first-child {
grid-template-columns: repeat(5, minmax(100px, 1fr));
}
.grid:last-child {
grid-template-columns: repeat(5, minmax(100px, 1fr));
}
2개의 grid 를 만들었는데 하나는 auto-fill grid 이고 다른 하나는 auto-fit grid 이다.
아직까지는 서로 똑같다.
(5개의 column 이 반복되고 최소 100px 크기와 최대 1fr 의 크기를 가진다.)
그럼 약간 코드를 수정해보면...
.grid:first-child {
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}
.grid:last-child {
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
}
repeat 함수안에 첫 번째 인자로 박스 칸을 적은게 아니라 이름을 적어주었다.
결과는...
뭔가 바뀌었다. (전처럼 특정한 수치를 적어주지 않았다. (예 5, 6, 20) )
auto-fill 이 하는 일은 column 을 만들어주는 일을 가능한 많이 해주는 것이다.
화면을 크게 늘려보면...
빈 column 을 많이 갖게 된다.
이거는 다 공간을 준것이다.
정확히는 auto-fill 이 해당 row 를 column 이 있는 만큼 가능한 채우는것이다.
column 이 비었더라도 말이다.
다음으로 auto-fit 을 알아보면...
이 기능은 현재의 요소를 늘려서 row 에 딱 맞게 맞추는 것이다.
정리하면
작은 화면으로 보면...
2 grid 가 다 똑같다.
화면의 크기를 키우면...
하나는 점점 커지고, 다른 하나는 그대로 있는다.
더 늘릴수록 auto-fill 은 grid 가 더 많은 공간에 더 많은 column 들을 차지한다.
(존재하지 않아도 말이다.)
근데 auto-fit 은 빈 공간을 만들지 않는다.
(현재 item 들이 빈 공간없이 채워지는 것이다.)
이 기능들을 쓰는 이유는 item 들의 개수를 모를 때 편리하기 때문이다.
그럼 각각 6번째 요소가 들어오면 어떨까?
<body>
auto-fill
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
auto-fit
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
</body>
6번째가 오면, auto-fill 에서는 column 에 빈 공간중에 하나를 주는 것이다.
근데 auto-fit 은 6번째가 오면 row 안에 맞추기 위해서 다른 요소들의 사이즈를 줄인다.
5개 element 들이 있을때
6개로 늘어난다면...
auto-fit 은 유동적인 사이즈를 위해서 쓰이고, auto-fill 은 정확한 사이즈를 원할 때 쓰인다!
이제 마지막 파트인 min-content 와 max-content 에 대해서 배울것이다!
이 기능들은 좋은게 우리는 이때가지 크기나 fr 를 살펴봤는데 가끔은 머리속에 있는 content 를 디자인하고 싶을때가 있다.
이러한게 진짜 CSS grid 의 쿨한 이유다.
생각했던 content 사이즈를 직접 디자인할 수 있으니까 말이다.
min-content 와 max-content 이 둘의 의미하는 것은 크기다.
우선 min-content 는 만약 box 를 만든다고 하면 content 가 작아질 수 있는 만큼 작아지는 거고...
max-content 는 박스를 content 가 필요한 만큼 크게 만드는 거다.
코드를 보면...
<body>
<div class="grid">
<div class="item">This is a very long text</div>
<div class="item">This is a very long text</div>
</div>
</body>
.grid {
color: white;
display: grid;
gap: 5px;
grid-template-columns: 100px 100px;
grid-auto-rows: 100px;
margin-bottom: 30px;
}
.item:nth-child(odd) {
background-color: #2ecc71;
}
.item:nth-child(even) {
background-color: #3498db;
}
첫 번째 column 을 max-content 로 바꿔준다.
grid-template-columns: max-content 100px;
결과는...
위의 초록색 박스는 필요한 content 크기만큼 커졌다.
이게 max-content 의 예다.
그럼 min-content 를 해보면...
grid-template-columns: max-content min-content;
min-content 는 content 가 얼마나 작게 될 수 있는거다.
이게 진심 멋진거는 우리는 안에 뭐가 들었는지에 대해서 디자인하는 것이다.
(div 안에 뭐가 들어갔는지 대해서 디자인하는 것이다.)
그리고 어떻게 content 가 보여야하는지 대해서 말이다.
그러니까 우리가 이전에 배운것들과 결합할 수도 있다. (완벽한 반응형 디자인을 할 수 있다.)
정리하면...
max-content 는
min-content 는
그럼 이번에는 각 요소마다 길이가 조금 다른 문장들을 가지고 있다고 했을 때 알아보자!
<body>
<div class="grid">
<div class="item">This is a very long text</div>
<div class="item">This is a very longer longer long text</div>
<div class="item">This is a text</div>
<div class="item">
Not long at all, or maybe, who knows? Maybe you know, love you.
</div>
<div class="item">This is a very longer long text</div>
</div>
</body>
.grid {
color: white;
display: grid;
gap: 5px;
grid-template-columns: max-content min-content;
grid-auto-rows: 100px;
margin-bottom: 30px;
}
.item:nth-child(odd) {
background-color: #2ecc71;
}
.item:nth-child(even) {
background-color: #3498db;
}
다른 길이의 문장들을 가진 박스들을 grid 로 디자인하고 싶다고 가정하면...
(모든 text 들이 좋아보이고 줄어들거나 확장되기도 하면서 말이다.)
그럼 그동안 배운것들을 써보면...
grid-template-columns: repeat(5, minmax(max-content, 1fr));
그러니까 최소값은 max-content 가 되는거다.
그리고 최대값은 1fr 이 되는것이다.
세 번째 박스를 보면...
1fr 로 작동하는데 빈 공간들은 다 1fr 때문에 나온것이다.
이러한 것이 box 를 content 사이즈에 따라서 만들 수 있는 것이다.
최소값은 min-content 로 해보면...
grid-template-columns: repeat(5, minmax(min-content, 1fr));
우리가 box 를 원하는 만큼 줄일 수 있고
아니면 엄청 크게 만들 수 있다.
또한 auto-fill 을 min-content 와 결합 할 수도 있다.
grid-template-columns: repeat(auto-fill, minmax(20px, max-content));
이게 auto-fill 형태이고...
auto-fit 은
grid-template-columns: repeat(auto-fit, minmax(20px, max-content));
끝으로 :