[DAY-30] CSS ์ฌํ (2)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
์ค๋์ ์๊ฐ์?
๊ฒํฅ๊ธฐ ์์ผ๋ก ์๊ณ ์์๋ Grid์ ๋ํด ์์ธํ ์ ์ ์์ด ์ข์์ต๋๋ค.
ํนํ auto-fit, auto-fill์ ์ฌ์ฉํ๋ฉด ๋ฐ์ํ ์น๊น์ง ์งค ์ ์์ ๊ฒ ๊ฐ์์!๐ฏ
๋
ธ์
ํด๋ก๋ ํ๋ก์ ํธ ๋ฆฌํฉํ ๋ง์ ์ฌ์ฉํด๋ณด๊ณ ์ถ์ต๋๋ค. ๋๊ทผ๋๊ทผ
CSS ์ฌ๋ฏธ์์ด์ ์ ๋ฆฌํ๋ ๋ด์ฉ์ด ์ ์ ๊ธธ์ด์ง๋ ๊ฒ ๊ฐ์์..
[1] CSS Grid
Grid๋ 2์ฐจ์ ๋ ์ด์์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๋ CSS ๊ธฐ์ ์ ๋๋ค.
2๊ฐ์ ์ถ์ ์ฌ์ฉํด์ ๋ ์ด์์์ ์งค ์ ์์ต๋๋ค.
[1-1] Grid Container
display: grid
๊ฐ ๋ถ์ฌ๋ ๋ถ๋ชจ ์์๊ฐ ๋ฐ๋ก Grid Container์
๋๋ค.
๋ณดํต grid๋ 3๊ฐ์ง ๊ฐ์ ๊ธฐ๋ณธ์ผ๋ก ๊ฐ์ง๋๋ค.
.container {
display: grid;
grid-template-rows: 100px 100px;
grid-template-columns: 200px 200px 200px;
}
display๋ grid์ inline-grid๋ฅผ ์ ํํ ์ ์์ผ๋ฉฐ,
rows๋ ์ธ๋ก ์นธ์ ๊ฐฏ์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ฉฐ, columns๋ ๊ฐ๋ก ์นธ์ ๊ฐฏ์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค.
px๋ก ๋ ํน์ ํ ๋จ์๊ฐ ์๋, ํ๋ฉด ๋น์จ๋ก rows์ columns์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ค ์ ์์ต๋๋ค.
์ด๋ fraction
๋จ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
.container {
display: grid;
grid-template-rows: 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr;
}
์ด fraction
๋จ์๋ฅผ ์ฌ์ฉํ๋ฉด, ํ๋ฉด ๋น์จ์ ๋ง์ถฐ ๊ทธ๋ฆฌ๋๊ฐ ์์ฑ๋ฉ๋๋ค.
๋ํ fraction
๋จ์๋ฅผ ์ฌ์ฉํ ๋, ์ฌ์ฉํ ์ ์๋ grid ํจ์ repeat๊ฐ ์์ต๋๋ค.
grid-template-columns: 1fr 1fr 1fr;
grid-template-columns: repeat(3, 1fr); /* ๊ฐ์ ์๋ฏธ์
๋๋ค. */
๋จ fraction ๋จ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ container์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ด์ผ ํฉ๋๋ค.
[1] auto-rows/ auto-columns
grid-template-rows
์ grid-template-columns
๋ฅผ ์ฌ์ฉํ์ฌ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ค ์ ์์ง๋ง,
์ง์ ์ด ๋์ง ์๋ ํ์ ์์๋ค์ ์๋์ผ๋ก ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ค ์ ์๋ ์์ฑ์ด ์์ต๋๋ค.
๋ฐ๋ก grid-auto-rows
/ grid-auto-columns
์
๋๋ค.
template๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ ํด์ค ํ๊ณผ ์ด์ ํฌ๊ธฐ๊ฐ 5, 6๋ฒ์ ์ง์ ์ด ๋์ง ์๋ ์ํฉ์ ๊ฐ์ ํด๋ด ์๋ค.
์ด๋ grid-auto-rows๋ grid-auto-columns๋ฅผ ์ง์ ํด์ฃผ๋ฉด ๋๋จธ์ง ์์์ ํด๋น ํฌ๊ธฐ๊ฐ ์ง์ ๋จ์ ํ์ธํ ์ ์์ต๋๋ค.
grid-template- : ๋ช ์์ ํฌ๊ธฐ(๋น์จ)
grid-auto- : ์์์ ํฌ๊ธฐ(๋น์จ)
[2] grid-auto-flow
ํด๋น ์์ฑ์ ์ด๋ป๊ฒ grid cell๋ค์ flow๊ฐ ํ๋ฌ๊ฐ ๊ฒ์ธ์ง (๋ฐฐ์น๋ ๊ฒ์ธ์ง) ์ง์ ํ ์ ์์ต๋๋ค.
- row : row ๋ฐฉํฅ์ผ๋ก ์์ ๋๋ค. (default)
- column : column ๋ฐฉํฅ์ผ๋ก ์์ ๋๋ค.
- dense : ๋น ๊ณต๊ฐ์ด ์๊ธฐ๋ฉด ๊ทธ ๊ณต๊ฐ์ ์์๋ค์ ๋ฐฐ์นํฉ๋๋ค.
- column dense: column์ถ์ผ๋ก ์์ด๋ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๋ฉด ์์๋ค์ ๋ฐฐ์นํฉ๋๋ค.
- row dense : row์ถ์ผ๋ก ์์ด๋ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๋ฉด ์์๋ค์ ๋ฐฐ์นํฉ๋๋ค.
[3] justify-content / align-content
ํด๋น ์์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ถ๋ชจ ์์์ ์ฌ๋ฐฑ์ด ์์ด์ผ ํฉ๋๋ค.
Flex๋ ์ถ์ด 1๊ฐ๋ผ๋ฉด, grid๋ ์ถ์ด 2๊ฐ์ด๋ฏ๋ก justify(ํ์ถ)์ align(์ด์ถ)์ ๋๋ค ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ถ๋ชจ ์์ ๋ด๋ถ grid์ ์์น๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
- normal : flex์ stretch์ ๊ฐ์ ๊ฐ๋ ์ผ๋ก, ์์ดํ ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๋ถ๋ชจ ์ปจํ ์ด๋์ ๋ง์ถฐ ์์ดํ ๋ค์ด ๋์ด๋ฉ๋๋ค. (default)
- space-between : ์์์ ๊ณผ ๋์ ์ ๋ถ์ด ๋๋จธ์ง ๊ณต๊ฐ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํฉ๋๋ค.
- space-around : ๊ฐ ์ด(ํ)์ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ฌ๋ฐฑ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํฉ๋๋ค.
- space-evenly : ํ(์ด) ์ถ ๋ด์์ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ฌ๋ฐฑ์ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํฉ๋๋ค.
[4] justify-items / align-items
ํด๋น ์์ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ Cell ๋ด ์ฌ๋ฐฑ์ด ์์ด์ผ ํฉ๋๋ค.
๊ฐ Cell ๋ด๋ถ item์ ์์น๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
- normal : ์์ดํ ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด ๊ฐ cell์ ํฌ๊ธฐ์ ๋ง์ถฐ ์์ดํ ์ด ๋์ด๋ฉ๋๋ค.
- center : ํ(์ด)์ถ์ ๊ฐ์ด๋ฐ ์ ๋ ฌ์ด ๋ฉ๋๋ค.
- start : ํ(์ด)์ถ์ ์์์ ์ผ๋ก ์ ๋ ฌ์ด ๋ฉ๋๋ค.
- end : ํ(์ด)์ถ์ ๋์ ์ผ๋ก ์ ๋ ฌ์ด ๋ฉ๋๋ค.
[5] grid-template-areas
grid-template-areas
๋ฅผ ์ฌ์ฉํ๋ฉด, grid-area
์ด๋ฆ์ ์ง์ ํด์ค ๊ตฌ์ญ์ผ๋ก ์ง์ ๋ ์ด์์์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
.container {
border: 4px solid;
display: grid;
grid-template-rows: repeat(4, 100px);
grid-template-columns: repeat(3, 1fr);
grid-template-areas:
"header header header"
"main main aside"
". . aside" /* ๋ง์นจํ(๋น ๋ถ๋ถ) ๋์ none์ ์
๋ ฅํด๋ ๋ฉ๋๋ค. */
"footer footer footer"; /* ๋ ์ด์์์ ์ง์ ์
๋ ฅํ ์ ์์ต๋๋ค. */
}
.container > * {
border: 2px solid;
}
.container header {
grid-area: header;
}
.container main {
grid-area: main;
}
.container aside {
grid-area: aside;
}
.container footer {
grid-area: footer;
}
์ด๋ ๊ทธ๋ฆฌ๋ ์ฌ์ด์ gab(Gutter)์ ์ง์ ํด์ค ์ ์์ต๋๋ค.
grid-gap: 10px 10px; /* ํ๋์ ๊ฐ๋ง ์์ฑํด๋ ๋๊ณ , ํ๊ณผ ์ด์ ๋ฐ๋ก ์ง์ ํด์ค ์๋ ์์ต๋๋ค. */
grid-row-gap: 10px; /* ๊ฐ๋ณ ์์ฑ์ผ๋ก๋ ์ ์ ์ ์์ต๋๋ค. */
grid-column-gap: 10px;
[1-2] Grid Items
display: grid
๊ฐ ๋ถ์ฌ๋ ๋ถ๋ชจ ์์ ๋ฐ์, ๋ค์ด์๋ item๋ค์ด ๋ฐ๋ก ๋ฐ๋ก Grid items์
๋๋ค.
grid๋ก ์ค์ ๋ container๋ cell ์์ญ์ ๊ฐ์ง๊ฒ ๋๊ณ , ํด๋น cell๋ค์ line์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํด๋น item๋ค์ ์ด๋ค line์์ ์์ํ๊ณ ์ด๋ค line์์ ๋๋๋์ง ์ง์ ํ ์ ์์ต๋๋ค.
[1] row/column-start/end
grid-row(column)-start
๋ ์ด๋ค ๋ผ์ธ์์ ์์ดํ
์ด ์์๋ ๊ฒ์ธ์ง,
grid-row(column)-end
๋ ์ด๋ค ๋ผ์ธ๊น์ง ์ฑ์ธ ๊ฒ์ธ์ง ์ง์ ํ ์ ์์ต๋๋ค.
๋ํ start์ row๋ ์ค์ฌ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
.container .item:nth-child(1) {
grid-column: 1 / 4; /* start์ end */
}
ํด๋น ์์ฑ์ line์ ๋ฒํธ๋ฅผ ์ง์ ํด์ค ์ ์์ง๋ง, ์ผ๋ง๋ ์ฑ์ธ ๊ฒ์ธ์ง ๋ํ๋ผ ์ ์์ต๋๋ค.
.container .item:nth-child(1) {
grid-row-start: span 2; /* span ํค์๋๋ ํ์ฅ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. */
}
span 2 ์ฒ๋ผ ์ฌ์ฉํ๋ฉด, 2๋งํผ ๋๋ฆฌ๊ฒ ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
๋ฐ๋ผ์ start, end๋ฅผ ๋ฐ๋ก ์ ์ํ์ง ์์๋ grid๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
[2] justify/align-self
๊ฐ๋ณ์ ์ผ๋ก cell ๋ด์์์ item ์ ๋ ฌ์ ํธ๋ค๋งํ ์ ์์ต๋๋ค.
์์ฑ์ justify/align-items
์ ๊ฐ์ต๋๋ค.
.container .item:nth-child(1) {
justify-self: center;
align-self: end;
}
[3] order
order๋ Flex์์ ์ฌ์ฉํ ๊ฒ๊ณผ ๊ฐ์ด ์ ๋ ฌ ์์๋ฅผ ํธ๋ค๋งํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ๊ฐ์ 0์์ ์์ํ๋ฉฐ, ์ซ์๊ฐ ์์ผ๋ฉด ์์์๋ก ์ฐ์ ์์๊ฐ ๋์์ง๋๋ค.
๋ฐ๋๋ก ์ปค์ง๋ฉด ๋ค์ชฝ์ผ๋ก ๋ฐ๋ ค๋๊ฒ ์ฃ .
.container .item:nth-child(1) {
order: 1;
}
.container .item:nth-child(3) {
order: -1;
}
[4] z-index
CSS์ ์์ ๋งฅ๋ฝ๊ณผ ์ฐ๊ด๋๋ ๋ด์ฉ์ผ๋ก, ์์๊ฐ ๊ฒน์ณค์ ๋, ์ฐ์ ์์๋ฅผ ์ง์ ํด์ค ์ ์์ต๋๋ค.
์์์ position์ด๋ผ๋ ๊ฐ์ ์ฌ์ฉํ๊ฑฐ๋ flex, grid๋ฅผ ์ฌ์ฉํ ๋, ์์ ์์๋ฅผ ํธ๋ค๋งํ ์ ์์ต๋๋ค.
ํฐ ๊ฐ์ผ์๋ก ์์ชฝ์ ์์ด๊ฒ ๋ฉ๋๋ค.
[1-3] Grid Functions
[1] minmax()
grid-template-columns(rows)
๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ์ง์ ํด์ฃผ๋ฉด, ๋ถํ์ํ ์ฌ๋ฐฑ์ด ์๊ธธ ์ ์์ต๋๋ค.
์ด๋ด ๋ ํฌ๊ธฐ์ ์ต์, ์ต๋๊ฐ์ ์ง์ ํด์ค ์ ์๋ minmax() ํจ์๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
grid-template-columns: minmax(100px, 1fr) minmax(200px, 1fr);
/* ์ต์, ์ต๋๊ฐ์ ์
๋ ฅํ ์ ์์ต๋๋ค. */
ํด๋น ํจ์๋ ๋ช
์์ ์ธ ํฌ๊ธฐ ๋ฟ๋ง ์๋, ์์์ ์ธ ํฌ๊ธฐ (grid-auto-rows/columns
)๋ฅผ ์ง์ ํ ๋๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
[2] fit-content()
grid item์ด ๊ฐ์ง๊ณ ์๋ content ๋๋น์ ๋ง์ถฐ์ฃผ๋ ํจ์์ ๋๋ค.
fit-content(100px)
๋ก ์ต๋๊ฐ์ ๋ช
์ํด์ค ์ ์์ต๋๋ค.
[1-4] Grid Unit
grid์์ ํ๋จํ๋ ๋จ์๋ ํ๊ธ๊ณผ ์๋ฌธ์ด ์กฐ๊ธ ๋ค๋ฆ ๋๋ค.
ํ๊ธ์ ๊ฒฝ์ฐ, ํ ๊ธ์ ํ ๊ธ์๊ฐ ๋จ์๋ก ํ๋จ๋๋ฉฐ
์๋ฌธ์ ๊ฒฝ์ฐ, ๋์ด์ฐ๊ธฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋จ์๊ฐ ํ๋จ๋ฉ๋๋ค.
min-content
๋ฅผ ์ด์ฉํ๋ฉด ์ต์ํ์ ๋๋น๋ก ์ด(ํ)์ ๋๋น๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ด๋ ๋จ์ด ๋จ์๋ก ํ์ ๋๊ธฐ์, ์กฐ๊ธ ๋ ์ฝ๊ฒ ํ๊ธ๊ณผ ์๋ฌธ์ ์ฐจ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ํ๊ธ์ ๊ฒฝ์ฐ ํ ๊ธ์๊ฐ ๋จ์๋ก ํ๋จ๋์ด ๋ชจ๋ ๊ธ์๊ฐ ์ค๋ฐ๊ฟ์ด ๋ฐ์ํฉ๋๋ค.
max-content
๋ฅผ ์ด์ฉํ๋ฉด ์ต๋ํ์ ๋๋น๋ก ์ด(ํ)์ ๋๋น๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
[1] word-break
word-break๋ ์ค๋ฐ๊ฟ์ ๊ธฐ์ค์ ์ง์ ํ ์ ์์ต๋๋ค.
์ด๋ ํ๊ธ๋ ๋์ด์ฐ๊ธฐ ๋จ์๋ก ์ค๋ฐ๊ฟ์ ํ ์ ์๊ฒ ๋ง๋ค์ด์ค๋๋ค.
.container {
border: 4px solid;
display: grid;
grid-template-rows: 100px;
grid-template-columns: repeat(4, min-content);
}
ํด๋น ์์์ฒ๋ผ min-content๋ฅผ ์ฌ์ฉํ์ ๋, ํ๊ธ์ด ํ ๊ธ์ ๋จ์๋ก ์ค๋ฐ๊ฟ์ด ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
.container .item {
border: 2px solid;
font-size: 30px;
word-break: keep-all;
}
- normal : ๊ธฐ๋ณธ ์ค ๋ฐ๊ฟ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค. (default)
- keep-all : ์์ด ๋ฟ๋ง ์๋ ํ๊ธ๋ ๋์ด์ฐ๊ธฐ ๋จ์๋ก ๋จ์ด๋ฅผ ํ๋จํฉ๋๋ค.
- break-all : ์ค๋ฒํ๋ก๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ด๋ ํ ๋ ๋ฌธ์ ์ฌ์ด์๋ ์ค ๋ฐ๊ฟ์ด ์ผ์ด๋ฉ๋๋ค.
[2] auto-fill/ auto-fit
repeat
ํจ์์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋จ์์
๋๋ค.
๋ช๊ฐ์ ์ด๊ณผ ํ์ ์ฌ์ฉํ ๊ฑด์ง ๋ช ์ํ์ง ์์๋, ์๋์ผ๋ก ๋จ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
- auto-fit
์ง์ ํ ์ ์๋ ์ต๋์ ๋๋น๋ฅผ ์ฐ์ ํด์ ๋จ์๋ฅผ ์ ํด์ค๋๋ค.
.container {
border: 4px solid;
display: grid;
grid-template-rows: 100px;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
}
- auto-fill
์ง์ ํ ์ ์๋ ์ต์ ๋๋น๋ฅผ ์ฐ์ ํด์ ๋จ์๋ฅผ ์ ํด์ค๋๋ค.
.container {
border: 4px solid;
display: grid;
grid-template-rows: 100px;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}
minmax ํจ์ ๋ด ์ต์๊ฐ์ 100px๋ก ์ง์ ํ์ผ๋ฏ๋ก ๊ฐ cell์ 100px๊ฐ ๋๋ฉฐ
container์ ๋น ๊ณต๊ฐ์ด ์๊ธฐ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ