π¨ FrontendDevGuide0003 — CSS μμ μ 볡 A-Z
π‘ μ΄ κΈμ μ½κ³ λλ©΄...
CSS κΈ°λ³Έ λ¬Έλ²λΆν° μ νμ, λ°μ€ λͺ¨λΈ, Flexbox, Grid, λ°μν λμμΈ, μ λλ©μ΄μ , CSS λ³μκΉμ§ —
νμ μμ CSSλ₯Ό μμ μκ² μμ±ν μ μλ μμ€μ΄ λ©λλ€!
π μμ νμ΅ κΈ°κ°: 2~3μ£Ό | λμ΄λ: βββββ | μ μ μ§μ: HTML κΈ°μ΄ (Guide0002)
π¨ 1. CSSλ? — μΉμ νμ₯μ¬
CSS(Cascading Style Sheets)λ HTMLλ‘ λ§λ λΌλμ μ, ν¬κΈ°, λ°°μΉ, μ λλ©μ΄μ
μ μ
νλ μΈμ΄μ
λλ€.
"Cascading"μ΄λΌλ μ΄λ¦μ²λΌ, μ€νμΌμ΄ μμμ μλλ‘ νλ¬λ΄λ € μ μ©λ©λλ€.
π μ§μΌλ‘ λΉμ νλ©΄:
HTML = 건물 골쑰 (λΌλ) | CSS = μΈν λ¦¬μ΄ (λ²½μ§, νμΈνΈ, κ°κ΅¬ λ°°μΉ) | JS = μ κΈ°·κΈ°λ₯
π CSSλ₯Ό HTMLμ μ°κ²°νλ 3κ°μ§ λ°©λ²:
β μΈλΆ νμΌ (κΆμ₯) — <link rel="stylesheet" href="style.css">
β‘ λ΄λΆ μ€νμΌ — <style> νκ·Έ μμ μμ± (html νμΌ λ΄)
β’ μΈλΌμΈ μ€νμΌ — <h1 style="color:red"> (μ μ§λ³΄μ νλ€μ΄ λΉκΆμ₯)
→ μ€λ¬΄μμλ νμ μΈλΆ νμΌ(β )λ‘ λΆλ¦¬ν΄μ κ΄λ¦¬ν©λλ€!
π 2. CSS κΈ°λ³Έ λ¬Έλ² — 3κ°μ§λ§ κΈ°μ΅νλ©΄ λλ€
π CSS λ¨μ(Unit) μμ μ 리:
px — κ³ μ ν½μ (1px = νλ©΄ 1ν½μ )
% — λΆλͺ¨ μμ λλΉ λΉμ¨ (width: 50% → λΆλͺ¨μ μ λ°)
em — λΆλͺ¨ ν°νΈ ν¬κΈ° κΈ°μ€ (1em = λΆλͺ¨ font-size)
rem — 루νΈ(html) ν°νΈ ν¬κΈ° κΈ°μ€ → λ°μνμμ κ°μ₯ μμ
vw/vh — λ·°ν¬νΈ(νλ©΄) λλΉ/λμ΄ κΈ°μ€ (100vw = νλ©΄ μ 체 λλΉ)
fr — Gridμμλ§ μ¬μ©νλ λΉμ¨ λ¨μ (1fr 1fr = 1:1 λΉμ¨)
→ μ€λ¬΄ μΆμ²: px(κ³ μ ) + rem(ν μ€νΈ) + %(λ μ΄μμ) + vw/vh(μ 체 νλ©΄)
π― 3. CSS μ νμ — μ νν μ€νμΌμ μ μ©νλ κΈ°μ
μ νμλ "μ΄λ€ μμμ μ€νμΌμ μ μ©ν μ§" μ§μ νλ ν¨ν΄μ
λλ€.
μ νμλ₯Ό μ μλ©΄ λΆνμν class μΆκ° μμ΄λ μνλ μμλ§ μ νν μ€νμΌλ§ν μ μμ΅λλ€.
π₯ μμ£Ό μ°λ κ°μ ν΄λμ€(Pseudo-class) μ νμ:
:hover — λ§μ°μ€λ₯Ό μ¬λ Έμ λ
:focus — ν¬μ»€μ€κ° μ‘νμ λ (input ν΄λ¦ μ)
:active — ν΄λ¦νκ³ μλ μκ°
:nth-child(n) — nλ²μ§Έ μμ μμ (2n = μ§μ, 2n+1 = νμ)
:first-child / :last-child — 첫 λ²μ§Έ / λ§μ§λ§ μμ
:not(.active) — .activeκ° μλ μμ
β οΈ CSS μ°μ μμ(Specificity) λ²μΉ:
μΈλΌμΈ style > #id > .class > νκ·Έ μ νμ
κ°μ μ°μ μμλ©΄ λμ€μ μμ±λ κ²μ΄ μ μ©λ©λλ€ (Cascade!)
!importantλ λͺ¨λ μ°μ μμλ₯Ό λ¬΄μ — λ¨μ©νλ©΄ μ μ§λ³΄μ μ§μ₯!
π¦ 4. λ°μ€ λͺ¨λΈ — CSS λ μ΄μμμ ν΅μ¬
HTMLμ λͺ¨λ μμλ λ°μ€(Box) ννλ‘ κ΅¬μ±λ©λλ€.
λ°μ€ λͺ¨λΈμ μ΄ν΄νλ©΄ μ¬λ°± μ‘°μ , ν¬κΈ° κ³μ°μ΄ ν¨μ¬ μ¬μμ§λλ€.
π‘ box-sizing: border-box — μ€λ¬΄ νμ μ€μ !
κΈ°λ³Έκ°(content-box)μ widthμ paddingκ³Ό borderκ° ν¬ν¨λμ§ μμμ ν¬κΈ° κ³μ°μ΄ 볡μ‘ν©λλ€.
μλ μ½λλ₯Ό CSS νμΌ μ΅μλ¨μ νμ μΆκ°νμΈμ:
*, *::before, *::after { box-sizing: border-box; }
→ μ΄μ width: 200px → padding/border ν¬ν¨ 200px (μ§κ΄μ !)
π margin λ¨μΆ νκΈ°λ²:
margin: 10px; → 4λ°©ν₯ λͺ¨λ 10px
margin: 10px 20px; → μν 10px, μ’μ° 20px
margin: 10px 20px 30px 40px; → μ μ° ν μ’ (μκ³λ°©ν₯)
margin: 0 auto; → μ’μ° auto = κ°μ΄λ° μ λ ¬ (κ°μ₯ λ§μ΄ μ°λ ν¨ν΄!)
π¨ 5. μμκ³Ό λ°°κ²½ — λμμΈμ κΈ°λ³Έ
π¨ CSS μμ νν λ°©λ²:
μ΄λ¦ — color: red; color: blue; (μ½ 140κ° μμλͺ )
HEX — color: #ff6b6b; (16μ§μ, κ°μ₯ λ§μ΄ μ¬μ©)
RGB — color: rgb(255, 107, 107);
RGBA — color: rgba(255, 107, 107, 0.5); (ν¬λͺ λ 0~1)
HSL — color: hsl(0, 100%, 71%); (μμκ°λ, μ±λ, λ°κΈ°)
→ μ€λ¬΄μμλ HEX(#)μ RGBAλ₯Ό κ°μ₯ λ§μ΄ μλλ€
π Gradient(κ·ΈλΌλμΈνΈ) — μΈλ ¨λ λ°°κ²½ λ§λ€κΈ°:
μ ν: background: linear-gradient(135deg, #667eea, #764ba2);
λ°©μ¬ν: background: radial-gradient(circle, #f093fb, #f5576c);
→ gradients.app, uigradients.comμμ μμ κ·ΈλΌλμΈνΈ μ½λλ₯Ό 무λ£λ‘ κ°μ Έμ¬ μ μμ΄μ!
π§± 6. Flexbox — 1μ°¨μ λ μ΄μμμ μ
Flexboxλ μμλ€μ κ°λ‘ λλ μΈλ‘ ν λ°©ν₯μΌλ‘ μ μ°νκ² λ°°μΉνλ νλμ CSS λ μ΄μμ μμ€ν
μ
λλ€.
λ€λΉκ²μ΄μ
λ°, μΉ΄λ λ°°μΉ, λ²νΌ κ·Έλ£Ή λ± λλΆλΆμ 1μ°¨μ λ μ΄μμμ μ¬μ©ν©λλ€.
π Flexbox ν΅μ¬ μμ± μ΄μ 리:
[컨ν μ΄λμ μ μ©]
display: flex — Flexbox νμ±ν
flex-direction: row(κΈ°λ³Έ) / column — λ°©ν₯ μ€μ
flex-wrap: nowrap / wrap — μ€ λ°κΏ μ¬λΆ
justify-content — μ£ΌμΆ(κΈ°λ³Έ:κ°λ‘) μ λ ¬
align-items — κ΅μ°¨μΆ(κΈ°λ³Έ:μΈλ‘) μ λ ¬
gap: 16px — μμ΄ν μ¬μ΄ κ°κ²© (margin λμ μ¬μ© κΆμ₯)
[μμ΄ν μ μ μ©]
flex: 1 — λ¨μ 곡κ°μ κ· λ±νκ² μ°¨μ§
flex: 0 0 200px — κ³ μ ν¬κΈ° 200px
align-self: center — κ°λ³ μμ΄ν λ§ μΈλ‘ μ λ ¬ λ³κ²½
order: 1 — μμ λ³κ²½ (μμ μ«μκ° λ¨Όμ )
β μλ²½ν μμ§/μν κ°μ΄λ° μ λ ¬ (κ°μ₯ λ§μ΄ κ²μνλ CSS!):
.container { display: flex; justify-content: center; align-items: center; }
π² 7. CSS Grid — 2μ°¨μ λ μ΄μμ λ§μ€ν°
CSS Gridλ ν(row)κ³Ό μ΄(column)μ λμμ μ μ΄νλ 2μ°¨μ λ μ΄μμ μμ€ν
μ
λλ€.
볡μ‘ν νμ΄μ§ μ 체 λ μ΄μμ(header/sidebar/main/footer)μ νΉν κ°λ ₯ν©λλ€.
π Grid ν΅μ¬ μμ±:
display: grid — Grid νμ±ν
grid-template-columns: 1fr 1fr 1fr — 3μ΄ κ· λ± λΆν
grid-template-columns: 200px 1fr — 첫 μ΄ κ³ μ + λλ¨Έμ§ μλ
grid-template-columns: repeat(3, 1fr) — repeat()λ‘ κ°κ²°νκ²
gap: 20px — ν/μ΄ κ°κ²©
grid-column: 1 / span 2 — 1λ² μ΄λΆν° 2μΉΈ μ°¨μ§
grid-template-areas — μ΄λ¦μΌλ‘ λ°°μΉ (μ§κ΄μ !)
π 8. Position — μμ μμΉ μμ μ 볡
position μμ±μ μμλ₯Ό μΌλ° νλ¦μμ λ²μ΄λ μνλ μμΉμ λ°°μΉν λ μ¬μ©ν©λλ€.
λͺ¨λ¬, λλ‘λ€μ΄, ν΄ν, κ³ μ ν€λ λ±μ λ§λ€ λ νμμ
λλ€.
position 5κ°μ§ κ° μμ μ 리:
static (κΈ°λ³Έκ°) — μΌλ° νλ¦λλ‘ λ°°μΉ, top/left 무μ
relative — μκΈ° μμ μ μλ μμΉ κΈ°μ€μΌλ‘ μ΄λ (곡κ°μ μ μ§)
absolute — κ°μ₯ κ°κΉμ΄ relative λΆλͺ¨ κΈ°μ€ μ λ μμΉ (κ³΅κ° μ°¨μ§ μ ν¨)
fixed — λΈλΌμ°μ νλ©΄(λ·°ν¬νΈ) κΈ°μ€ κ³ μ (μ€ν¬λ‘€ν΄λ μ μμ§μ)
sticky — μ€ν¬λ‘€ μ μ relative, μκ³μ μ§λλ©΄ fixedμ²λΌ λμ (ν€λμ λ§μ΄ μ¬μ©)
π‘ absolute μ¬μ© ν¨ν΄ (κ°μ₯ λ§μ΄ μ°λ νν):
λΆλͺ¨μ position: relative μ€μ → μμμ position: absolute μ¬μ©
→ λΆλͺ¨ μμμ μνλ μμΉλ‘ μμ λ‘κ² λ°°μΉ κ°λ₯!
π± 9. λ°μν λμμΈ — λͺ¨λ νλ©΄μμ μλ²½νκ²
λ°μν λμμΈ(Responsive Design)μ νλ©΄ ν¬κΈ°μ λ°λΌ λ μ΄μμμ΄ μλμΌλ‘ μ‘°μ λλ κ²μ
λλ€.
νμ¬ λͺ¨λ°μΌ νΈλν½μ΄ 50% μ΄μμΈ λ§νΌ, λ°μνμ μ νμ΄ μλ νμμ
λλ€!
π± Media Query μ¬μ©λ²:
/* 767px μ΄ν: λͺ¨λ°μΌ */
@media (max-width: 767px) { .container { flex-direction: column; } }
/* 768px ~ 1023px: νλΈλ¦Ώ */
@media (min-width: 768px) and (max-width: 1023px) { .grid { grid-template-columns: 1fr 1fr; } }
/* 1024px μ΄μ: λ°μ€ν¬ν± */
@media (min-width: 1024px) { .grid { grid-template-columns: repeat(3, 1fr); } }
π± Mobile First vs Desktop First:
Mobile First — λͺ¨λ°μΌ κΈ°λ³Έ, min-widthλ‘ νμ₯ (Google κΆμ₯ λ°©μ)
Desktop First — λ°μ€ν¬ν± κΈ°λ³Έ, max-widthλ‘ μΆμ (κΈ°μ‘΄ λ°©μ)
→ νμ μμλ Mobile Firstκ° νμ€μ λλ€!
β¨ 10. CSS νΈλμ§μ & μ λλ©μ΄μ
CSSλ§μΌλ‘λ λΆλλ¬μ΄ μ λλ©μ΄μ ν¨κ³Όλ₯Ό μ€ μ μμ΅λλ€. JS μμ΄!
π transition — μν λ³νλ₯Ό λΆλλ½κ²:
.btn { background: blue; transition: all 0.3s ease; }
.btn:hover { background: darkblue; transform: scale(1.05); }
→ λ§μ°μ€ μ¬λ¦¬λ©΄ 0.3μ΄μ κ±Έμ³ λΆλλ½κ² μμ + ν¬κΈ° λ³ν!
transition λ¨μΆ νκΈ°: transition: [μμ±] [μκ°] [νμ΄λ°ν¨μ]
νμ΄λ° ν¨μ: ease(κΈ°λ³Έ) / linear / ease-in / ease-out / ease-in-out
π¬ animation + keyframes — λ°λ³΅/λ³΅μ‘ μ λλ©μ΄μ :
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
.box { animation: fadeIn 1s ease-in-out; }
animation μμ±: μ΄λ¦ / μκ° / νμ΄λ° / λλ μ΄ / λ°λ³΅νμ(infinite) / λ°©ν₯
π transform — λ³ν ν¨κ³Ό:
transform: scale(1.1) — 110%λ‘ νλ
transform: rotate(45deg) — 45λ νμ
transform: translateX(20px) — μ€λ₯Έμͺ½μΌλ‘ 20px μ΄λ
transform: translateY(-50%) — μΈλ‘ 50% μλ‘ μ΄λ (κ°μ΄λ° μ λ ¬μ νμ©!)
π¨ 11. μ€λ¬΄μμ μμ£Ό μ°λ CSS μμ± μ΄μ 리
π§ 12. CSS λ³μ(Custom Properties) — νμ νμ
CSS λ³μλ₯Ό μ°λ©΄ μμ, ν°νΈ ν¬κΈ° λ±μ ν κ³³μμ κ΄λ¦¬ν μ μμ΅λλ€. μ€λ¬΄μμ λμμΈ μμ€ν μ κΈ°λ°μ λλ€.
CSS λ³μ μ¬μ©λ²:
/* λ³μ μ μ (μ μ) */
:root { --primary: #667eea; --secondary: #764ba2; --font-size-base: 16px; --radius: 8px; }
/* λ³μ μ¬μ© */
.btn { background: var(--primary); border-radius: var(--radius); }
.title { font-size: var(--font-size-base); color: var(--secondary); }
→ λμ€μ λΈλλ μμμ΄ λ°λλ©΄ :root ν κ³³λ§ μμ νλ©΄ λ!
ποΈ 13. νμ CSS μν€ν μ² — BEM λ°©λ²λ‘
ν νμ μμ CSS ν΄λμ€ μ΄λ¦μ΄ μΆ©λνκ±°λ μλ―Έλ₯Ό μ μ μμΌλ©΄ μ μ§λ³΄μκ° νλ€μ΄μ§λλ€. BEMμ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ€μ΄λ° κ·μΉμ λλ€.
π§© BEM(Block-Element-Modifier) λ€μ΄λ°:
Block — λ 립μ μΈ μ»΄ν¬λνΈ: .card, .button, .header
Element — λΈλ‘μ κ΅¬μ± μμ: .card__title, .card__image
Modifier — λ³ν/μν: .button--primary, .card--featured
μμ: <div class="card card--featured"><h2 class="card__title">...</h2></div>
→ ν΄λμ€ μ΄λ¦λ§ λ³΄κ³ λ ꡬ쑰μ μν μ νμ ν μ μμ΅λλ€!
π οΈ CSS λ°©λ²λ‘ λΉκ΅:
BEM — κ°μ₯ λ§μ΄ μ°μ΄λ λ€μ΄λ° κ·μΉ (λν νλ‘μ νΈμ μ ν©)
SCSS/SASS — CSSλ₯Ό λ³μ, μ€μ²©, λ―Ήμ€μΈμΌλ‘ νμ₯ν μ μ²λ¦¬κΈ°
CSS Module — νμΌ λ¨μ μ€μ½ν (Reactμμ λ§μ΄ μ¬μ©)
Tailwind CSS — μ νΈλ¦¬ν° ν΄λμ€ λ°©μ (μ΅κ·Ό κ°μ₯ νΈλ λ)
β ν΅μ¬ μμ½ & νμ΅ μ²΄ν¬λ¦¬μ€νΈ
"CSSλ μΈμμ νλ κ² μλλλ€. μ리λ₯Ό μ΄ν΄νκ³ , λ§μ΄ λ§λ€μ΄λ³΄λ©΄μ μμ μ΅νλ κ²μ λλ€.
볡μ‘ν λ μ΄μμλ κ²°κ΅ λ°μ€ + Flexbox + Grid μ‘°ν©μ λλ€."
π νμ΅ μλ£ μ²΄ν¬λ¦¬μ€νΈ:
β CSS κΈ°λ³Έ λ¬Έλ²(μ νμ, μμ±, κ°)μ μ΄ν΄νλ€
β px, %, rem, vw λ¨μμ μ°¨μ΄λ₯Ό μλ€
β μ νμ μ°μ μμ(specificity)λ₯Ό μ€λͺ ν μ μλ€
β λ°μ€ λͺ¨λΈ(margin/border/padding/content)μ 그릴 μ μλ€
β box-sizing: border-boxμ μλ―Έλ₯Ό μλ€
β Flexboxλ‘ μμ§/μν κ°μ΄λ° μ λ ¬μ ν μ μλ€
β Gridλ‘ 3μ΄ λ μ΄μμμ λ§λ€ μ μλ€
β position(relative/absolute/fixed)μ μ°¨μ΄λ₯Ό μλ€
β Media Queryλ‘ λͺ¨λ°μΌ/λ°μ€ν¬ν± λΆκΈ°λ₯Ό ν μ μλ€
β transitionμΌλ‘ hover μ λλ©μ΄μ μ λ§λ€μλ€
β CSS λ³μ(:root, var())λ₯Ό μ¬μ©ν΄λ΄€λ€
β BEM λ€μ΄λ° κ·μΉμ μ μ©ν΄λ΄€λ€
π λ€μ λ¨κ³: FrontendDevGuide0004 — JavaScript κΈ°μ΄ λ‘ λμ΄κ°μΈμ!
HTML/CSSλ‘ λ©μ§ νλ©΄μ λ§λ€μμΌλ, μ΄μ λμμ μΆκ°ν μ°¨λ‘μ λλ€ β‘