CSS 그리λ λͺ λͺ λ μμ μμκ³Ό λΆλͺ¨ 그리λ μμ μ νλ₯Ό νꡬν©λλ€. μ€μ©μ μΈ μμ μ λͺ¨λ² μ¬λ‘λ‘ λ°μν λ° μ μ§λ³΄μ κ°λ₯ν λ μ΄μμ λ§λλ λ²μ λ°°μ°μΈμ.
CSS 그리λ λͺ λͺ λ μμ μμ: λΆλͺ¨ 그리λ μμ μ ν λ§μ€ν°νκΈ°
CSS Grid Layoutμ 볡μ‘νκ³ λ°μνμΈ μΉ λ μ΄μμμ λ§λλ κ°λ ₯ν λꡬμ λλ€. κ°μ₯ μ μ©ν κΈ°λ₯ μ€ νλλ λͺ λͺ λ μμ(named areas)μ μ μνλ κΈ°λ₯μΌλ‘, μ΄λ₯Ό ν΅ν΄ 그리λ λ΄μ μμλ₯Ό μ½κ² λ°°μΉν μ μμ΅λλ€. λͺ λͺ λ μμμ κΈ°λ³Έμ κ°λ¨νμ§λ§, μ΄κ²μ΄ μ€μ²©λ 그리λμ μ΄λ»κ² μνΈ μμ©νλμ§, νΉν μμμ ν΅ν΄ μ΄λ»κ² μλνλμ§ μ΄ν΄νλ©΄ CSS μ½λμ μ μ°μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ ν¨μ¬ λ λμΌ μ μμ΅λλ€. μ΄ κΈμμλ CSS 그리λ λͺ λͺ λ μμ μμκ³Ό λΆλͺ¨ 그리λ μμ μ νμ λν΄ κΉμ΄ νκ³ λ€μ΄, μ΄ κ³ κΈ κΈ°μ μ λ§μ€ν°νλ λ° λμμ΄ λλ μ€μ©μ μΈ μμ μ λͺ¨λ² μ¬λ‘λ₯Ό μ 곡ν©λλ€.
CSS 그리λ λͺ λͺ λ μμμ΄λ 무μμΈκ°?
μμμ λν΄ μμ보기 μ μ CSS 그리λ λͺ
λͺ
λ μμμ΄ λ¬΄μμΈμ§ κ°λ¨ν 볡μ΅ν΄ λ³΄κ² μ΅λλ€. λͺ
λͺ
λ μμμ grid-template-areas μμ±μ μ¬μ©νμ¬ μ μνλ 그리λ λ΄μ μμμ
λλ€. μ΄ μμμ μ΄λ¦μ ν λΉν λ€μ, μμ μμμ grid-area μμ±μ μ¬μ©νμ¬ ν΄λΉ λͺ
λͺ
λ μμ μμ λ°°μΉν©λλ€.
λ€μμ κ°λ¨ν μμ μ λλ€:
.container {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-rows: auto auto auto;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
gap: 10px;
}
.header {
grid-area: header;
background-color: lightblue;
padding: 10px;
}
.nav {
grid-area: nav;
background-color: lightgreen;
padding: 10px;
}
.main {
grid-area: main;
background-color: lightcoral;
padding: 10px;
}
.aside {
grid-area: aside;
background-color: lightyellow;
padding: 10px;
}
.footer {
grid-area: footer;
background-color: lightgray;
padding: 10px;
}
μ΄ μμ μμ container μμλ 3κ°μ μ΄κ³Ό 3κ°μ νμ κ°μ§ 그리λλ‘ μ μλ©λλ€. grid-template-areas μμ±μ header, nav, main, aside, footerλΌλ λ€μ― κ°μ λͺ
λͺ
λ μμμ μ μν©λλ€. κ·Έλ° λ€μ κ° μμ μμλ grid-area μμ±μ μ¬μ©νμ¬ ν΄λΉ μμμ λ°°μΉλ©λλ€.
그리λ μμ μμ μ΄ν΄νκΈ°
μ΄μ μ€μ²©λ 그리λκ° μμ λ μ΄λ€ μΌμ΄ λ°μνλμ§ μκ°ν΄ λ³΄κ² μ΅λλ€. CSS 그리λμ ν΅μ¬ μΈ‘λ©΄ μ€ νλλ grid-template-areas μ μΈμ΄ κΈ°λ³Έμ μΌλ‘ μμλμ§ μλλ€λ κ²μ
λλ€. μ¦, λΆλͺ¨ 그리λμ λͺ
λͺ
λ μμμ μ μΈνλλΌλ ν΄λΉ μ΄λ¦μ΄ μμ 그리λμ μλμΌλ‘ μ μ©λμ§λ μμ΅λλ€.
νμ§λ§ μ°λ¦¬λ μμλ₯Ό (λΆλͺ¨ 그리λ λ΄μ) 그리λ μμ΄ν
μ΄μ (μμ μ μμλ€μ μν) 그리λ 컨ν
μ΄λλ‘ μ μνλ κ°λ
μ νμ©νμ¬ κ°λ ₯ν μ€μ²© λ μ΄μμμ λ§λ€ μ μμ΅λλ€. μμ 그리λ μμ΄ν
μ΄ κ·Έ μμ²΄λ‘ κ·Έλ¦¬λ 컨ν
μ΄λμΌ λ, μμ λ§μ grid-template-areasλ₯Ό μ μν μ μμ΅λλ€. λΆλͺ¨ 그리λμ μμ μ΄λ¦κ³Ό μμ 그리λμ μμ μ΄λ¦μ μμ ν λ
립μ μ
λλ€. λͺ
λͺ
λ μμ μ μλ₯Ό DOM νΈλ¦¬λ₯Ό λ°λΌ μλλ‘ μ λ¬νλ μ§μ μ μΈ μμ λ©μ»€λμ¦μ μμ΅λλ€.
μ°λ¦¬κ° μ€μ λ‘ λ
Όμνλ "μμ"μ μκ°μ μΌκ΄μ±κ³Ό λ μ΄μμ ꡬ쑰λ₯Ό μ μ§νκΈ° μν΄ λΆλͺ¨ 그리λμ λͺ
λͺ
λ μμ ꡬ쑰λ₯Ό μμ 그리λ λ΄μμ μ ννκ±°λ λ―Έλ¬λ§ν μ μλ€λ μμ΄λμ΄μ
λλ€. μ΄λ λΆλͺ¨μ μμ λ°°μ΄κ³Ό μΌμΉνλλ‘ μμμ grid-template-areasλ₯Ό μ¬μ μν¨μΌλ‘μ¨ λ¬μ±λ©λλ€.
λΆλͺ¨ 그리λ μμ μ ν: λ μ΄μμ ꡬ쑰 볡μ νκΈ°
μ°λ¦¬κ° νμν μ£Όμ κΈ°μ μ λΆλͺ¨ 그리λ μμ μ νμ
λλ€. μ΄λ μμ 그리λμ grid-template-areasλ₯Ό λΆλͺ¨ 그리λμ ꡬ쑰μ μΌμΉνλλ‘ λͺ
μμ μΌλ‘ μ¬μ μνλ κ²μ ν¬ν¨ν©λλ€. μ΄λ CSS 그리λμ μ μ°μ±μ νμ©νλ©΄μ μΉμ¬μ΄νΈμ μ¬λ¬ μΉμ
μ κ±Έμ³ μΌκ΄λ λͺ¨μκ³Ό λλμ λ§λλ λ°©λ²μ μ 곡ν©λλ€.
μμ : 그리λ λ΄μ μΉ΄λ μ»΄ν¬λνΈ
CSS 그리λλ‘ μ μλ νμ΄μ§ λ μ΄μμμ΄ μκ³ , 그리λ μμ μ€ νλ μμ μ¬λ¬ μΉ΄λ μ»΄ν¬λνΈλ₯Ό νμνκ³ μΆλ€κ³ κ°μ ν΄ λ΄ μλ€. κ° μΉ΄λλ μ 체 νμ΄μ§ λ μ΄μμκ³Ό μ μ¬ν λ°©μμΌλ‘ λ°°μ΄λ ν€λ, μ½ν μΈ , νΈν°λ₯Ό κ°μ ΈμΌ ν©λλ€.
.page-container {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
gap: 20px;
}
.page-header {
grid-area: header;
background-color: #eee;
padding: 15px;
text-align: center;
}
.page-nav {
grid-area: nav;
background-color: #ddd;
padding: 15px;
}
.page-main {
grid-area: main;
display: grid; /* main μμμ 그리λ 컨ν
μ΄λλ‘ λ§λλλ€ */
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); /* λ°μν μΉ΄λ λ μ΄μμ */
gap: 20px;
padding: 15px;
}
.page-aside {
grid-area: aside;
background-color: #ddd;
padding: 15px;
}
.page-footer {
grid-area: footer;
background-color: #eee;
padding: 15px;
text-align: center;
}
/* μΉ΄λ μ»΄ν¬λνΈ μ€νμΌ */
.card {
display: grid; /* μΉ΄λλ₯Ό 그리λ 컨ν
μ΄λλ‘ λ§λλλ€ */
grid-template-columns: 1fr; /* μΉ΄λ λ΄ λ¨μΌ μ΄ λ μ΄μμ */
grid-template-rows: auto 1fr auto;
grid-template-areas:
"card-header"
"card-content"
"card-footer";
border: 1px solid #ccc;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
padding: 10px;
}
.card-header {
grid-area: card-header;
font-size: 1.2em;
font-weight: bold;
margin-bottom: 10px;
border-bottom: 1px solid #ccc;
padding-bottom: 5px;
}
.card-content {
grid-area: card-content;
margin-bottom: 10px;
}
.card-footer {
grid-area: card-footer;
text-align: right;
border-top: 1px solid #ccc;
padding-top: 5px;
}
ν€λ
μΉ΄λ ν€λ 1
μΉ΄λ μ½ν
μΈ κ° μ¬κΈ°μ λ€μ΄κ°λλ€.
μΉ΄λ ν€λ 2
λ€λ₯Έ μΉ΄λμ μ½κ°μ μ½ν
μΈ .
μ΄ μμ μμ .page-mainμ μΉ΄λ μ»΄ν¬λνΈλ₯Ό νμνλ 그리λ 컨ν
μ΄λμ
λλ€. κ° .card μμλ 그리λ 컨ν
μ΄λμ
λλ€. .cardκ° λΆλͺ¨ .page-containerμ λ€λ₯Έ μμ μ΄λ¦(card-header, card-content, card-footer)μ μ¬μ©νμ¬ λ΄λΆ λ μ΄μμμ μ μνκΈ° μν΄ grid-template-areasλ₯Ό μ¬μ©νλ κ²μ μ£Όλͺ©νμΈμ. μ΄ μμλ€μ μμ ν λ
립μ μ
λλ€.
ꡬ쑰 λ―Έλ¬λ§: μ¬μ΄λλ° μμ
μ΄μ main μμ λ΄μμ, μλ§λ νΉμ κΈ°μ¬ λ΄μ μ¬μ΄λλ°λ₯Ό λ§λ€κΈ° μν΄ λΆλͺ¨ 그리λ ꡬ쑰λ₯Ό λ―Έλ¬λ§νλ μΉμ
μ μνλ€κ³ μμν΄ λ΄
μλ€. λΆλͺ¨μ 그리λ ꡬ쑰λ₯Ό μ ννμ¬ μ΄λ₯Ό λ¬μ±ν μ μμ΅λλ€:
.article-container {
display: grid;
grid-template-columns: 1fr 3fr;
grid-template-rows: auto 1fr auto;
grid-template-areas:
"article-header article-header"
"article-nav article-main"
"article-footer article-footer";
gap: 10px;
}
.article-header {
grid-area: article-header;
background-color: #f0f0f0;
padding: 10px;
}
.article-nav {
grid-area: article-nav;
background-color: #e0e0e0;
padding: 10px;
}
.article-main {
grid-area: article-main;
padding: 10px;
}
.article-footer {
grid-area: article-footer;
background-color: #f0f0f0;
padding: 10px;
}
HTMLμμλ λ€μκ³Ό κ°μ΄ μμ±ν μ μμ΅λλ€:
κΈ°μ¬ ν€λ
κΈ°μ¬ μ½ν
μΈ
μ¬κΈ°μ .article-containerλ μΌλ°μ μΈ νμ΄μ§ λ μ΄μμ ꡬ쑰(ν€λ, λ€λΉκ²μ΄μ
, λ©μΈ, νΈν°)λ₯Ό λͺ¨λ°©νκΈ° μν΄ grid-template-areasλ₯Ό μ¬μ μν©λλ€. μ΄λ¦μ λ€λ₯΄μ§λ§(λ¨μν header λμ article-header), λ°°μ΄μ λΆλͺ¨ λ μ΄μμκ³Ό μ μ¬ν©λλ€.
λΆλͺ¨ 그리λ μμ μ νλ₯Ό μν λͺ¨λ² μ¬λ‘
- μλ―Έ μλ μ΄λ¦ κ·μΉ μ¬μ©: 'card-'λ 'article-'κ³Ό κ°μ μ λμ¬λ₯Ό μ¬μ©ν νμλ μμ§λ§, κ°λ ₯ν κΆμ₯λ©λλ€. λͺ λͺ λ μμμ 컨ν μ€νΈλ₯Ό λͺ ννκ² λνλ΄λ μ΄λ¦μ μ ννμΈμ. μ΄λ νΌλμ λ°©μ§νκ³ CSSμ κ°λ μ±μ λμ λλ€.
- μΌκ΄μ± μ μ§: 그리λ μμμ μ νν λ μ 체 ꡬ쑰μ μΌκ΄μ±μ μν΄ λ Έλ ₯νμΈμ. λΆλͺ¨ 그리λμ ν€λ, λ©μΈ μ½ν μΈ , νΈν°κ° μλ€λ©΄, νΉμ μ½ν μΈ κ° λ€λ₯΄λλΌλ μμ 그리λμμ κ·Έ ꡬ쑰λ₯Ό λ―Έλ¬λ§νλλ‘ λ Έλ ₯νμΈμ.
- κΉμ μ€μ²© νΌνκΈ°: CSS 그리λλ κΉμ μ€μ²©μ νμ©νμ§λ§, κ³Όλν μ€μ²©μ μ½λλ₯Ό μ΄ν΄νκ³ μ μ§ κ΄λ¦¬νκΈ° μ΄λ ΅κ² λ§λ€ μ μμ΅λλ€. 볡μ‘ν μλ리μ€μμλ λ κ°λ¨ν λ μ΄μμ κΈ°μ μ΄ λ μ μ ν μ μλμ§ κ³ λ €ν΄ λ³΄μΈμ.
- μ½λ λ¬Έμν: CSS 그리λ λ μ΄μμ, νΉν λͺ λͺ λ μμκ³Ό μ ν κΈ°μ μ μ¬μ©ν λλ λͺ ννκ² λ¬ΈμννμΈμ. κ° μμμ λͺ©μ κ³Ό μ 체 λ μ΄μμκ³Όμ κ΄κ³λ₯Ό μ€λͺ νμΈμ. μ΄λ λκ·λͺ¨ νλ‘μ νΈλ νμΌλ‘ μμ ν λ νΉν μ μ©ν©λλ€.
- CSS λ³μ(μ¬μ©μ μ§μ μμ±) μ¬μ©: λ 볡μ‘ν λ μ΄μμμ κ²½μ°, CSS λ³μλ₯Ό μ¬μ©νμ¬ κ·Έλ¦¬λ μμ μ΄λ¦μ μ μ₯νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ. μ΄λ₯Ό ν΅ν΄ ν κ³³μμ μ΄λ¦μ μ½κ² μ λ°μ΄νΈνκ³ μ½λ μ 체μ λ°μν μ μμ΅λλ€.
CSS λ³μ μ¬μ© μμ :
:root {
--header-area: header;
--nav-area: nav;
--main-area: main;
--aside-area: aside;
--footer-area: footer;
}
.container {
display: grid;
grid-template-columns: 1fr 3fr 1fr;
grid-template-rows: auto auto auto;
grid-template-areas:
"var(--header-area) var(--header-area) var(--header-area)"
"var(--nav-area) var(--main-area) var(--aside-area)"
"var(--footer-area) var(--footer-area) var(--footer-area)";
gap: 10px;
}
.header {
grid-area: var(--header-area);
}
/* λ€λ₯Έ μμλ€λ λ§μ°¬κ°μ§μ
λλ€ */
μ΄κ²μ΄ μ§μ μ μΌλ‘ κ°μ μ ννμ§λ μμ§λ§, μ€νμΌ μνΈ μ 체μ λ°μλ μ μλ λ¨μΌ μμΉμμ 그리λ μμ μ΄λ¦μ μ½κ² μμ ν μ μκ² ν΄μ€λλ€. ν€λ μμμ μ΄λ¦μ "header"μμ "top"μΌλ‘ λ³κ²½ν΄μΌ νλ κ²½μ°, ν κ³³μμλ§ λ³κ²½νλ©΄ λ©λλ€. μ΄λ μ½λμ κ°λ μ±κ³Ό μ μ§ κ΄λ¦¬μ±μ μν΄ μΌλμ λμ΄μΌ ν μ’μ μ΅κ΄μ λλ€.
μ κ·Όμ± κ³ λ €μ¬ν
CSS 그리λλ₯Ό μ¬μ©ν λλ νμ μ κ·Όμ±μ μΌλμ λμ΄μΌ ν©λλ€. μκ°μ ννμ κ΄κ³μμ΄ μ₯μ κ° μλ μ¬μ©μλ λ μ΄μμμ μ¬μ©νκ³ μ΄ν΄ν μ μλλ‘ ν΄μΌ ν©λλ€. λ€μμ μ£Όμ μ κ·Όμ± κ³ λ €μ¬νμ λλ€:
- μλ§¨ν± HTML:
<header>,<nav>,<main>,<aside>,<footer>μ κ°μ μλ§¨ν± HTML μμλ₯Ό μ¬μ©νμ¬ μ½ν μΈ μ ꡬ쑰μ μλ―Έλ₯Ό λΆμ¬νμΈμ. μ΄λ μ€ν¬λ¦° 리λ λ° κΈ°ν 보쑰 κΈ°μ μ΄ λ μ΄μμμ μ΄ν΄νλ λ° λμμ΄ λ©λλ€. - λ Όλ¦¬μ μΈ μμ€ μμ: HTML μμ€μ μμ μμλ μΌλ°μ μΌλ‘ μ½ν μΈ μ λ Όλ¦¬μ μΈ μ½κΈ° μμλ₯Ό λ°μν΄μΌ ν©λλ€. CSS 그리λλ μκ°μ μΌλ‘ μμλ₯Ό μ¬λ°°μ΄ν μ μμ§λ§, μμ€ μμλ 보쑰 κΈ°μ μ μμ‘΄νλ μ¬μ©μμκ² μ¬μ ν μλ―Έκ° μμ΄μΌ ν©λλ€.
- ν€λ³΄λ λ€λΉκ²μ΄μ
: λͺ¨λ μνΈμμ© μμ(μ: λ§ν¬, λ²νΌ, νΌ νλ)κ° ν€λ³΄λ λ€λΉκ²μ΄μ
μ ν΅ν΄ μ κ·Ό κ°λ₯νμ§ νμΈνμΈμ.
tabindexμμ±μ μ¬μ©νμ¬ μμκ° ν¬μ»€μ€λ₯Ό λ°λ μμλ₯Ό μ μ΄νμΈμ. - μμ λλΉ: μ μλ ₯ μ¬μ©μκ° μ½ν μΈ λ₯Ό μ½μ μ μλλ‘ ν μ€νΈμ λ°°κ²½ μ¬μ΄μ μΆ©λΆν μμ λλΉλ₯Ό μ 곡νμΈμ. μμ λλΉ κ²μ¬κΈ°λ₯Ό μ¬μ©νμ¬ μμ μ‘°ν©μ΄ μ κ·Όμ± νμ€(WCAG)μ μΆ©μ‘±νλμ§ νμΈνμΈμ.
- λ°μν λμμΈ: λ€μν νλ©΄ ν¬κΈ°μ μ₯μΉμ μ μνλ λ°μν λ μ΄μμμ λ§λμΈμ. λ―Έλμ΄ μΏΌλ¦¬λ₯Ό μ¬μ©νμ¬ κ·Έλ¦¬λ λ μ΄μμμ μ‘°μ νκ³ μμ νλ©΄μμλ μ½ν μΈ λ₯Ό κ³μ μ¬μ©ν μ μλλ‘ νμΈμ.
κ²°λ‘
CSS 그리λ λͺ λͺ λ μμ μμκ³Ό λΆλͺ¨ 그리λ μμ μ νλ μ μ°νκ³ μ μ§λ³΄μ κ°λ₯ν μΉ λ μ΄μμμ λ§λλ κ°λ ₯ν κΈ°μ μ λλ€. λͺ λͺ λ μμμ΄ μ€μ²©λ 그리λμ μ΄λ»κ² μνΈ μμ©νλμ§ μ΄ν΄ν¨μΌλ‘μ¨ μΌκ΄λ λͺ¨μκ³Ό λλμ κ°μ§ 볡μ‘ν λ μ΄μμμ λ§λ€ μ μμ΅λλ€. μλ―Έ μλ μ΄λ¦ κ·μΉμ μ¬μ©νκ³ , μΌκ΄μ±μ μ μ§νλ©°, κΉμ μ€μ²©μ νΌνκ³ , μ½λλ₯Ό λ¬Έμννλ κ²μ μμ§ λ§μΈμ. μ΄λ¬ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ CSS 그리λμ κ°λ ₯ν κΈ°λ₯μ νμ©νμ¬ μ μΈκ³ μ¬μ©μμκ² λ©μ§κ³ μ κ·Όμ± λμ μΉ κ²½νμ μ 곡ν μ μμ΅λλ€.