CSS Grid๋ 2์ฐจ์ ๋ ์ด์์์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋์์ฃผ์ด ๋ณต์กํ ๋์์ธ๋ ๊ฐ๋จํ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ด ๊ธ์ ๋ชฉ์ ์ CSS Grid๋ฅผ ์ฒ์ ์ ํ๋ ์ด๋ณด์๋ถํฐ ๊ณ ๊ธ ์ฌ์ฉ์๊น์ง ๋ชจ๋๊ฐ ์ดํดํ๊ณ ํ์ฉํ ์ ์๋๋ก ๋๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ๋ , ํต์ฌ ์์ฑ, ์ค์ ์์ ๋ฅผ ํตํด CSS Grid๋ฅผ ์๋ฒฝํ ๋ง์คํฐํด ๋ณด์ธ์.
โฃ ๋ชฉ์ฐจ
ํจ๊ณผ์ ์ธ ๋ ์ด์์์ ์ํ CSS ์์ฑ ์ค์๋ Flexbox์ Grid๊ฐ ์์ต๋๋ค. CSS Grid์ Flexbox์ ์ฐจ์ด์ ์ Flexbox๋ 1์ฐจ์ ๋ ์ด์์์ ๋ค๋ฃจ๋ ๋ฐ๋ฉด, CSS Grid๋ 2์ฐจ์ ๋ ์ด์์์ ๋ค๋ฃน๋๋ค. ๊ฐ๊ฐ์ ์ฅ์ ์ ํ์ฉํ์ฌ ๋ ๊ธฐ์ ์ ํผํฉํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. Flexbox์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ํฌ์คํ ์ ํ์ธํด ์ฃผ์ธ์! ๐
CSS Grid๋ ๋ฌด์์ธ๊ฐ?๐
CSS Grid์ ๊ฐ์์ ์ค์์ฑ
CSS Grid๋ ์น๋์์ธ์ ์ํ 2์ฐจ์ ๋ ์ด์์ ์์คํ
์
๋๋ค. ํ๋ ์ค๋ฐ์ค(Flexbox)์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ ์ด์์๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. CSS Grid๋ ํ(row)๊ณผ ์ด(column)์ ๋์์ ์ ์ดํ ์ ์์ด ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ๋ ๋ฐ ํ์ํฉ๋๋ค.
CSS Grid์ ์ฅ์
- 2์ฐจ์ ๋ ์ด์์์ ์์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ก ๋ณต์กํ ๋ ์ด์์์ ๊ตฌํํ ์ ์์ต๋๋ค.
- ๋ฐ์ํ ๋์์ธ์ ๊ตฌํํ๋ ๋ฐ ์ ๋ฆฌํฉ๋๋ค.
CSS Grid์ ๊ธฐ๋ณธ ๊ฐ๋ ๐
- Grid Container: CSS Grid๋ฅผ ์ ์ฉํ๋ ์ปจํ ์ด๋ ์์์ ๋๋ค.
- Grid Item: Grid Container ๋ด์ ์๋ ์์ ์์๋ค์ ๋๋ค.
- Row: CSS Grid์์ ์์ง ๋ฐฉํฅ์ผ๋ก ๋ ์ด์์์ ๋๋๋ ์์๋ฅผ ๋งํฉ๋๋ค. ํ์ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ grid-template-rows ์์ฑ์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค.
- Column: CSS Grid์์ ์ํ ๋ฐฉํฅ์ผ๋ก ๋ ์ด์์์ ๋๋๋ ์์๋ฅผ ๋งํฉ๋๋ค. ์ด์ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ grid-template-columns ์์ฑ์ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค.
- Grid Cell: ๊ทธ๋ฆฌ๋์ ํ ์นธ์ ๊ฐ๋ฆฌํค๋ฉฐ, ํน์ ํ๊ณผ ์ด์ด ๋ง๋๋ ์ง์ ์ ๋๋ค.
- Grid Gap: ๊ทธ๋ฆฌ๋ ์ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๋งํฉ๋๋ค. ํ๊ณผ ์ด ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ค์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- Grid Item: ๊ทธ๋ฆฌ๋ ์์ ๋ค์ด๊ฐ๋ ๊ฐ๊ฐ์ ์์๋ฅผ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ์ํด ๋ฐฐ์น๋ฉ๋๋ค.
- Grid Line: ๊ทธ๋ฆฌ๋ ์ ์ ๊ฐ๋ก์ง๋ฅด๋ ์์ง ๋๋ ์ธ๋ก ์ ์ ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ๋ผ์ธ์ ๊ฐ ์ด๊ณผ ํ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๋ ๋๋ค.
- Grid Number: ๊ทธ๋ฆฌ๋ ์์ดํ ์ด๋ ์ ์ ์๋ณํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฒํธ๋ฅผ ๋งํฉ๋๋ค. ์ฃผ๋ก ํ๊ณผ ์ด์ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
CSS Grid์ ๊ธฐ๋ณธ ์์ฑ๐ฎ
display: grid
- Grid ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ด ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ปจํ ์ด๋์ ์์ ์์๋ค์ด ๊ทธ๋ฆฌ๋ ์์ดํ ์ผ๋ก ๋ฐฐ์น๋ฉ๋๋ค.
.container {
display: grid;
}
grid-template-column๊ณผ grid-template-rows
- grid-template-columns: ์ด์ ์์ ๋๋น๋ฅผ ์ ์ํฉ๋๋ค.
- grid-template-rows: ํ์ ์์ ๋์ด๋ฅผ ์ ์ํฉ๋๋ค.
- ํฝ์ , ๋ฐฑ๋ถ์จ, fr ๋จ์ ๋ฑ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
.container {
grid-template-columns: 100px 200px 1fr;
grid-template-rows: 50px auto;
}
โญfr ๋จ์โญ
fr ๋จ์๋ CSS Grid์์ ์ฌ์ฉ๋๋ ์๋์ ์ธ ๋จ์ ์ค ํ๋์ ๋๋ค. ์ด๋ "fraction"์ ์ฝ์๋ก, ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋ ๋ด์์ ๋น์จ์ ๋ฐ๋ผ ๋ถ๋ฐฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
fr ๋จ์๋ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ๋จ์ ๊ณต๊ฐ์ ๋ถํ ํ์ฌ ์ค์ ๋ ๋น์จ์ ๋ฐ๋ผ ๊ฐ ์ด ๋๋ ํ์ ํ ๋นํฉ๋๋ค. ์ด๋ ๋ฐ์ํ ๋์์ธ์ ์ํด ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
grid-gap
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋จ์ถ ์์ฑ์ ๋๋ค. ์ด ๋จ์ถ ์์ฑ์ row-gap๊ณผ column-gap์ ์ถ์ฝํ์ ๋๋ค.
- grid-gap: ๊ทธ๋ฆฌ๋ ์์ดํ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์ง์ ํฉ๋๋ค. row-gap ๋ฐ column-gap ๊ฐ์ ๋์์ ์ค์ ํ ์ ์์ต๋๋ค.
- column-gap: ๊ทธ๋ฆฌ๋ ์์ดํ ์ฌ์ด์ ์ํ ๊ฐ๊ฒฉ์ ์ง์ ํฉ๋๋ค.
- row-gap: ๊ทธ๋ฆฌ๋ ์์ดํ ์ฌ์ด์ ์์ง ๊ฐ๊ฒฉ์ ์ง์ ํฉ๋๋ค.
.container {
grid-gap: 10px;
}
grid-template-areas
- ์ด๋ฆ์ ์ง์ ํ ๊ทธ๋ฆฌ๋ ์์ญ์ ์ ์ํฉ๋๋ค.
.container {
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
CSS Grid์ ์ ๋ ฌ ์์ฑ↔
justify-items
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋ ๋ด์ ๋ชจ๋ ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์ํ ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: start, end, center, stretch (๊ธฐ๋ณธ๊ฐ)
.container {
display: grid;
justify-items: center; /* ๋ชจ๋ ์์ดํ
์ ์ํ ์ค์์ ์ ๋ ฌํฉ๋๋ค. */
}
align-items
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋ ๋ด์ ๋ชจ๋ ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์์ง ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: start, end, center, stretch (๊ธฐ๋ณธ๊ฐ)
.container {
display: grid;
align-items: center; /* ๋ชจ๋ ์์ดํ
์ ์์ง ์ค์์ ์ ๋ ฌํฉ๋๋ค. */
}
justify-content
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋ ๋ด์ ๊ทธ๋ฆฌ๋ ํธ๋(์ ์ฒด ๊ทธ๋ฆฌ๋)์ ์ํ ๋ฐฉํฅ์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
- ๊ฐ: start, end, center, stretch, space-between, space-around, space-evenly
.container {
display: grid;
justify-content: space-between; /* ์ ์ฒด ๊ทธ๋ฆฌ๋๋ฅผ ์ํ ๋ฐฉํฅ์ผ๋ก ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํฉ๋๋ค. */
}
align-content
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋ ๋ด์ ๊ทธ๋ฆฌ๋ ํธ๋(์ ์ฒด ๊ทธ๋ฆฌ๋)์ ์์ง ๋ฐฉํฅ์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ์ฌ๋ถ์ ๊ณต๊ฐ์ด ์์ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ฐ: start, end, center, stretch, space-between, space-around, space-evenly
.container {
display: grid;
align-content: center; /* ์ ์ฒด ๊ทธ๋ฆฌ๋๋ฅผ ์์ง ๋ฐฉํฅ์ผ๋ก ์ค์์ ์ ๋ ฌํฉ๋๋ค. */
}
justify-self
- ๊ฐ๋ณ ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์ํ ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค. justify-items๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
- ๊ฐ: start, end, center, stretch
.item {
justify-self: end; /* ๊ฐ๋ณ ์์ดํ
์ ์ํ ๋ฐฉํฅ ๋์ ์ ๋ ฌํฉ๋๋ค. */
}
align-self
- ๊ฐ๋ณ ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์์ง ์ ๋ ฌ์ ์ง์ ํฉ๋๋ค. align-items๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
- ๊ฐ: start, end, center, stretch
.item {
align-self: end; /* ๊ฐ๋ณ ์์ดํ
์ ์์ง ๋ฐฉํฅ ๋์ ์ ๋ ฌํฉ๋๋ค. */
}
CSS Grid ๋ ์ด์์ ๋ฐฐ์น ์์ฑ๐งฉ
grid-column-start
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ์์ํ ์ด ๋ผ์ธ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: ๊ทธ๋ฆฌ๋ ๋ผ์ธ ๋ฒํธ, ๊ทธ๋ฆฌ๋ ๋ผ์ธ ์ด๋ฆ, span <number> (์ง์ ๋ ์์ ํธ๋์ ์ฐจ์ง), auto (๊ธฐ๋ณธ๊ฐ)
.item {
grid-column-start: 2; /* ๋ ๋ฒ์งธ ์ด ๋ผ์ธ์์ ์์ */
}
grid-column-end
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ๋๋๋ ์ด ๋ผ์ธ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: ๊ทธ๋ฆฌ๋ ๋ผ์ธ ๋ฒํธ, ๊ทธ๋ฆฌ๋ ๋ผ์ธ ์ด๋ฆ, span <number> (์ง์ ๋ ์์ ํธ๋์ ์ฐจ์ง), auto (๊ธฐ๋ณธ๊ฐ)
.item {
grid-column-end: 4; /* ๋ค ๋ฒ์งธ ์ด ๋ผ์ธ์์ ๋ */
}
grid-row-start
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ์์ํ ํ ๋ผ์ธ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: ๊ทธ๋ฆฌ๋ ๋ผ์ธ ๋ฒํธ, ๊ทธ๋ฆฌ๋ ๋ผ์ธ ์ด๋ฆ, span <number> (์ง์ ๋ ์์ ํธ๋์ ์ฐจ์ง), auto (๊ธฐ๋ณธ๊ฐ)
.item {
grid-row-start: 1; /* ์ฒซ ๋ฒ์งธ ํ ๋ผ์ธ์์ ์์ */
}
grid-row-end
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ๋๋๋ ํ ๋ผ์ธ์ ์ง์ ํฉ๋๋ค.
- ๊ฐ: ๊ทธ๋ฆฌ๋ ๋ผ์ธ ๋ฒํธ, ๊ทธ๋ฆฌ๋ ๋ผ์ธ ์ด๋ฆ, span <number> (์ง์ ๋ ์์ ํธ๋์ ์ฐจ์ง), auto (๊ธฐ๋ณธ๊ฐ)
.item {
grid-row-end: 3; /* ์ธ ๋ฒ์งธ ํ ๋ผ์ธ์์ ๋ */
}
CSS Grid์ ๊ณ ๊ธ ๊ธฐ๋ฅ๐
grid line, gridarea
- grid line: ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๋ฐฐ์นํ ๋ ์ฌ์ฉํ๋ ๊ฐ์์ ์ ์ ๋๋ค.
- grid area: ์ฌ๋ฌ ์ ์ ํ๋์ ์์ญ์ผ๋ก ๋ฌถ์ ์ ์์ต๋๋ค.
.container {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: 100px 100px;
gap: 10px;
}
.item1 {
grid-column: 1 / 3; /* 1๋ฒ์งธ ์ด๋ถํฐ 2๋ฒ์งธ ์ด๊น์ง */
grid-row: 1 / 2; /* 1๋ฒ์งธ ํ */
}
.item2 {
grid-area: 1 / 3 / 2 / 5; /* grid-row-start / grid-column-start / grid-row-end / grid-column-end */
}
grid-auto-flow
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ์๋์ผ๋ก ๋ฐฐ์น๋๋ ๋ฐฉํฅ์ ์ง์ ํฉ๋๋ค. ์ํ ๋ฐฉํฅ์ด๋ ์์ง ๋ฐฉํฅ์ด๋ , ๋๋ ์ํ-์์ง ๋ฐฉํฅ์ผ๋ก ๋ฐฐ์นํ ์ ์์ต๋๋ค. row, column, dense ์ค ํ๋์ ๊ฐ์ผ๋ก ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๋ฐฐ์น ๋ฐฉํฅ์ ์ง์ ํฉ๋๋ค.
- row: ๊ทธ๋ฆฌ๋ ์์ดํ ์ ํ ๋จ์๋ก ๋ฐฐ์นํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ํฌ๋ค๋ฉด, ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ๊ฐ๋ก๋ก ๋จผ์ ์ฑ์์ง๋๋ค. ๊ทธ ํ์ ๋ค์ ํ์ผ๋ก ๋์ด๊ฐ๋ฉด์ ์ฑ์์ง๋๋ค.
- column: ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์ด ๋จ์๋ก ๋ฐฐ์นํฉ๋๋ค. ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ํฌ๊ธฐ๊ฐ ์ถฉ๋ถํ ํฌ๋ค๋ฉด, ๊ทธ๋ฆฌ๋ ์์ดํ ์ด ์ธ๋ก๋ก ๋จผ์ ์ฑ์์ง๋๋ค. ๊ทธ ํ์ ๋ค์ ์ด๋ก ๋์ด๊ฐ๋ฉด์ ์ฑ์์ง๋๋ค.
- dense: ๊ฐ๋ฅํ ํ ๋ง์ ๊ณต๊ฐ์ ์ฑ์ฐ๋๋ก ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๋ฐ์ด ๋ฃ์ต๋๋ค.๋ง์ฝ ๊ทธ๋ฆฌ๋ ์์ดํ ์ฌ์ด์ ๊ณต๊ฐ์ด ๋น์ด ์๋ค๋ฉด, ๊ทธ๋ฆฌ๋ ๋ผ์ธ์ ๋ฐ๋ผ ๋ ์ฑ์์ง๋๋ก ๋ฐ์ด ๋ฃ์ต๋๋ค.
์ด ์ฝ๋๋ dense ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๋ฐฐ์นํ๋ ์์ ์ ๋๋ค. ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋๋ 4๊ฐ์ ์ด๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ทธ๋ฆฌ๋ ์์ดํ ์ grid-auto-flow: dense; ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ๊ณต๊ฐ์ ์ต๋ํ ํ์ฉํ์ฌ ๋ฐฐ์น๋ฉ๋๋ค.
<style>
.container {
background-color: wheat;
padding: 10px;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-auto-rows: minmax(100px, auto);
grid-auto-flow: dense; /* dense ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฆฌ๋ ์์ดํ
์ ๋ฐ์ด๋ฃ์ต๋๋ค. */
}
.item {
background-color: violet;
border: 3px solid #000;
}
.item:nth-child(1) {
grid-column: 1 / span 3; /* ์ฒซ ๋ฒ์งธ ์์ดํ
์ ๋์ ์์ญ์ผ๋ก ์ค์ ํฉ๋๋ค. */
}
.item:nth-child(2) {
grid-row: 2 / span 3; /* ๋ ๋ฒ์งธ ์์ดํ
์ ์ฌ๋ฌ ํ์ ๊ฑธ์ณ ๋ฐฐ์นํฉ๋๋ค. */
}
.item:nth-child(3) {
grid-column: 2 / span 3; /* ์ธ ๋ฒ์งธ ์์ดํ
์ ๋์ ์์ญ์ผ๋ก ์ค์ ํฉ๋๋ค. */
}
</style>
<body>
<div class="container">
<div class="item">grid-1</div>
<div class="item">grid-2</div>
<div class="item">grid-3</div>
<div class="item">grid-4</div>
<div class="item">grid-5</div>
<div class="item">grid-6</div>
<div class="item">grid-7</div>
<div class="item">grid-8</div>
<div class="item">grid-9</div>
<div class="item">grid-10</div>
<div class="item">grid-11</div>
<div class="item">grid-12</div>
</div>
</body>
auto-fill
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ์ ์๋ ํฌ๊ธฐ์ ์ฌ์ ๊ณต๊ฐ์ด ์์ ๊ฒฝ์ฐ, ๊ทธ ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ๊ทธ๋ฆฌ๋ ์์ดํ ์ ๊ฐ์๋ฅผ ๋๋ฆฝ๋๋ค.
- ๊ทธ๋ฆฌ๋ ํธ๋์ ๊ฐ์๋ฅผ ์ง์ ๋ ํฌ๊ธฐ๋ก ์ฑ์ฐ๊ธฐ ์ํด ์๋์ผ๋ก ์กฐ์ ํฉ๋๋ค.
.container {
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}
auto-fit
- ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ์ ์๋ ํฌ๊ธฐ์ ์ฌ์ ๊ณต๊ฐ์ด ์์ ๊ฒฝ์ฐ, ๊ทธ ๊ณต๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด ๊ทธ๋ฆฌ๋ ์์ดํ ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฝ๋๋ค. ์ด๋ ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฐ์ํ ๋ ์ด์์์ ๊ตฌ์ฑํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ๊ทธ๋ฆฌ๋ ํธ๋์ ๊ฐ์๋ฅผ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ํฌ๊ธฐ์ ๋ง์ถฐ ์๋์ผ๋ก ์กฐ์ ํฉ๋๋ค.
.container {
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
}
minmax(์ต์ ๊ฐ, ์ต๋ ๊ฐ)
- ๊ทธ๋ฆฌ๋ ์์ดํ ์ ์ต์ ํฌ๊ธฐ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ์ํฉ๋๋ค. ์ด๊ฒ์ ๊ทธ๋ฆฌ๋ ํธ๋์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ์์ฑ ๊ฐ์ผ๋ก auto๊ฐ์ ์ง์ ํ ์๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๊ทธ๋ฆฌ๋ ์ปจํ ์ด๋์ ๋ง์ถฐ ์๋์ผ๋ก ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ฉ๋๋ค.
.container {
grid-template-columns: minmax(100px, auto) 1fr;
}
repeat(๋ฐ๋ณต ํ์, ๋ฐ๋ณต ๊ฐ)
- ๊ทธ๋ฆฌ๋ ํ ํ๋ฆฟ์์ ๋ฐ๋ณต๋๋ ํจํด์ ์์ฑํฉ๋๋ค. ์ด๊ฒ์ ๋ฐ๋ณต๋๋ ํ ๋๋ ์ด์ ํฌ๊ธฐ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
.container {
grid-template-columns: repeat(3, 100px);
}
์ค์ฒฉ ๊ทธ๋ฆฌ๋
<div class="outer-container">
<div class="inner-container">
<div class="inner-item">A</div>
<div class="inner-item">B</div>
</div>
</div>
<style>
.outer-container {
display: grid;
grid-template-columns: 1fr;
}
.inner-container {
display: grid;
grid-template-columns: 1fr 1fr;
}
</style>
Grid์ Flexbox์ ํผํฉ ์ฌ์ฉ
.container {
display: grid;
grid-template-columns: 2fr 1fr;
}
.flex-item {
display: flex;
justify-content: center;
align-items: center;
}
๋ฐ์ํ ๋ ์ด์์ ๋ง๋ค๊ธฐ๐ฑ
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๊ทธ๋ฆฌ๋ ์กฐ์
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
gap: 10px;
}
@media (max-width: 600px) {
.container {
grid-template-columns: 1fr;
}
}
๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋์ํ๋ ๋ฐฉ๋ฒ:
- auto-fill: ๊ฐ๋ฅํ ๋ง์ ๊ทธ๋ฆฌ๋ ์ ์ ์ฑ์๋๋ค.
- minmax(100px, 1fr): ๊ฐ ์ ์ ์ต์ ํฌ๊ธฐ๋ 100px, ์ต๋ ํฌ๊ธฐ๋ 1fr์ ๋๋ค.
๋ค์ํ ์์ ๐ ๏ธ
๊ธฐ๋ณธ ๊ทธ๋ฆฌ๋ ์ค์
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<style>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 10px;
}
.item {
background-color: lightblue;
padding: 20px;
text-align: center;
}
</style>
์ ๋ ฌ๊ณผ ๋ฐฐ์น
.container {
justify-items: center;
align-items: center;
}
๊ฒฉ์ ๊ฐ๊ฒฉ ์กฐ์
.container {
grid-gap: 20px;
}
๋ธ๋ก๊ทธ ๋ ์ด์์
<div class="blog-layout">
<header class="header">Header</header>
<nav class="sidebar">Sidebar</nav>
<main class="main-content">Main Content</main>
<footer class="footer">Footer</footer>
</div>
<style>
.blog-layout {
display: grid;
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
grid-gap: 10px;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main-content { grid-area: main; }
.footer { grid-area: footer; }
</style>
๋๋ฒ๊น ๊ณผ ์ต์ ํ๐ก๏ธ
CSS Grid ๋๋ฒ๊น ๋๊ตฌ ์๊ฐ (๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ)
๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์๋ ๊ทธ๋ฆฌ๋ ๋ ์ด์์์ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ณ ๋๋ฒ๊น
ํ ์ ์์ต๋๋ค. Firefox์ Chrome์ ๊ฐ๋ฐ์ ๋๊ตฌ์์๋ ๊ทธ๋ฆฌ๋ ์ค๋ฒ๋ ์ด ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ ํ
- ํ์ ์๋ ์์ฑ์ ์ ๊ฑฐํ์ฌ ์ฝ๋ ์ต์ ํ
- ๋ฐ๋ณต๋๋ ํจํด์ repeat()๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฒฐํ๊ฒ
ํต์ฌ ๋ด์ฉ๐