๐๏ธ 05. ํ์ดํฌ๊ทธ๋ํผ์ ๊ณผํ: '๊ฐ๋ ์ฑ๊ณผ ์น ํฐํธ ๋ง์คํฐํ๊ธฐ'
๐ ๊ฐ์
๋จ์ํ ๊ธ์ ํฌ๊ธฐ๋ฅผ ํค์ฐ๋ ๊ฒ์ ๋์ด, ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ๊ฐ์ฅ ์พ์ ํ๊ฒ ์ ๋ฌํ๋ ํ ์คํธ ๋ ๋๋ง๊ณผ ํฐํธ ์ต์ ํ ๊ธฐ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ์์๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 8๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 4๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๊ฐ๋
์ฑ์ ๋์ด๋ ํ
์คํธ ์์ฑ] โ [์น ํฐํธ ์ฑ๋ฅ ์ต์ ํ] โ [๋ฐ์ํ ํ์ดํฌ๊ทธ๋ํผ]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ํ๊ฐ, ์๊ฐ, ๊ธ์ ๊ตต๊ธฐ๋ฅผ ์กฐ์ ํด ๊ฐ๋ ์ฑ ๋์ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํฉ๋๋ค.
- ์น ํฐํธ ๋ก๋ฉ์ผ๋ก ์ธํ '๊น๋นก์(CLS)' ํ์์ ๋ฐฉ์งํ๋ ๋์ฑ ์ ์ธ์๋๋ค.
-
clamp()๋ฅผ ํ์ฉํด ๊ธฐ๊ธฐ ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ๋ณํ๋ ํ ์คํธ๋ฅผ ๊ตฌํํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋! ์ ๊ธฐํ ํฐํธ๋ฅผ ํ๋ ๋ฃ์๋๋ฐ, ํ์ด์ง๊ฐ ์ฒ์ ๋ฐ ๋ ๊ธ์จ๊ฐ ์์ ์ ๋ณด์ด๋ค๊ฐ 1์ด ๋ค์ ํ ๋ํ๋์. ๊ทธ๋ฆฌ๊ณ ๋ํ๋๋ฉด์ ๋ ์ด์์์ด ๋์ปน๊ฑฐ๋ฆฌ๊ณ ์. ์ ํฐํธ๊ฐ ๋๋ฌด ๋ฌด๊ฑฐ์ด ๊ฑธ๊น์? ๐๏ธโโ๏ธ"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, ๊ทธ ํ์์ ๋ฐ๋ก FOIT์ FOUT๋ผ๊ณ ํฉ๋๋ค. ํฐํธ๋ ๋์์ธ์ด๊ธฐ๋ ํ์ง๋ง, ๋คํธ์ํฌ๋ฅผ ํ๊ณ ํ๋ฅด๋ '๋ฐ์ดํฐ ๋ฆฌ์์ค'๋ผ๋ ๊ฑธ ์์ง ๋ง์ธ์. ํฐํธ๋ฅผ ์ด๋ป๊ฒ ๋ถ๋ฌ์ค๊ณ ์ด๋ป๊ฒ ๋ณด์ฌ์ค์ง ์ ๋ต์ด ์์ผ๋ฉด ์ฌ์ฉ์๋ ๊ธ์ ์ฝ๊ธฐ๋ ์ ์ ๋ ๋๋ฒ๋ฆด ๊ฒ๋๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
์น์ 90% ์ด์์ ํ ์คํธ์ ๋๋ค. ์๋ฌด๋ฆฌ ์์ ๋์์ธ๋ ๊ธ์๊ฐ ์ฝ๊ธฐ ํ๋ค๊ฑฐ๋ ๋ก๋ฉ์ด ๋ฆ์ด์ง๋ฉด ์คํจํ UX์ ๋๋ค. ํนํ ์ต๊ทผ ๊ตฌ๊ธ์ ์ฑ๋ฅ ์งํ์ธ Core Web Vitals์์ ํฐํธ ๋ก๋ฉ์ผ๋ก ์ธํ ๋ ์ด์์ ์ด๋(CLS)์ ๋งค์ฐ ์ค์ํ ๊ฐ์ ์์ธ์ ๋๋ค.
์ ์ ์ธ ์์ฒ ์ด๊ฐ ๊ฒช์ ํ์์ 5๋ ์ฐจ ์ด์์ ์๋์ด๋ผ๋ฉด ๋ฐ๋์ ํด๊ฒฐํด์ผ ํ ์์ ์ ๋๋ค. ํฐํธ์ ํฌ๊ธฐ๊ฐ ์๋๋ผ '๊ฒฝํ' ์์ฒด๋ฅผ ๋์์ธํ๋ ๋ฒ, ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด๋ฉด์ ์ฑ๋ฅ ์ต์ ํ(Web Font Optimization)๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ด ์ด๋ฒ ์ฅ์ ํต์ฌ์ ๋๋ค.
๐ 1. ๊ฐ๋ ์ฑ์ ๊ฒฐ์ ํ๋ 1%์ ๋ํ ์ผ
๋จ์ํ font-size๋ง ํค์ฐ๋ ๊ฑด ์ด๋ณด์
๋๋ค. ์๋์ด๋ ๋ค์ ์ธ ๊ฐ์ง๋ฅผ ์กฐ์ ํฉ๋๋ค.
line-height(ํ๊ฐ): ๊ธ์ ๋์ด์ 1.5~1.6๋ฐฐ๊ฐ ํ๊ตญ์ด ๊ฐ๋ ์ฑ์ ๊ฐ์ฅ ์ข๋ค๊ณ ์๋ ค์ ธ ์์ต๋๋ค. ๋จ์ ์์ด ์ซ์๋ง ์ฐ๋ ๊ฒ์ด ์์ ์ ์ ๋ฆฌํฉ๋๋ค.letter-spacing(์๊ฐ): ํฐํธ๊ฐ ํด ๋๋ ์ด์ง ์ข๊ฒ, ์์ ๋๋ ์ด์ง ๋๊ฒ ์กฐ์ ํด ๊ฐ๋ ์ฑ์ ํ๋ณดํฉ๋๋ค.font-smoothing: macOS ๋ฑ ํน์ ํ๊ฒฝ์์ ๊ธ์๋ฅผ ๋ ๋งค๋๋ฝ๊ฒ ๋ ๋๋งํ๊ฒ ํด์ค๋๋ค.
โก 2. ์น ํฐํธ ๋ก๋ฉ ์ ๋ต (FOIT vs FOUT)
ํฐํธ๊ฐ ๋ก๋ฉ๋ ๋ ๋ฐ์ํ๋ ๋ ๊ฐ์ง ์ง์ฆ ๋๋ ํ์์ ๋๋ค.
- FOIT (Flash of Invisible Text): ํฐํธ ์ฌ ๋๊น์ง ๊ธ์๋ฅผ ์ ๋ณด์ฌ์ค (์ฌ์ฉ์ ๋ต๋ตํจ ์ต๊ณ )
- FOUT (Flash of Unstyled Text): ๊ธฐ๋ณธ ํฐํธ๋ก ๋จผ์ ๋ณด์ฌ์ฃผ๋ค๊ฐ ๋์ค์ ์ฅ ๋ฐ๋ (๋ ์ด์์ ํ๋ค๋ฆผ ๋ฐ์)
๐ฆ ์ํธ์ ํด๊ฒฐ์ฑ :
font-display:
"์์ฒ ๋,@font-face์์font-display: swap;์ ๋ฃ์ด๋ณด์ธ์. ๊ธฐ๋ณธ ํฐํธ๋ก ๋จผ์ ๋ณด์ฌ์ฃผ๋ค๊ฐ ์น ํฐํธ๊ฐ ์ค๋น๋๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๊ต์ฒดํด์ค๋๋ค. ์ฌ์ฉ์์๊ฒ '์๋ฌด๊ฒ๋ ์ ๋ณด์ด๋ 1์ด'๋ฅผ ์ฃผ์ง ์๋ ๊ฒ์ด ํต์ฌ์ด์์."
๐ฑ 3. ๋ฐ์ํ ํ์ดํฌ๊ทธ๋ํผ์ clamp()
๋ชจ๋ฐ์ผ์์ ๊ธ์๊ฐ ๋๋ฌด ํฌ๊ฑฐ๋, ๋ฐ์คํฌํฑ์์ ๋๋ฌด ์์ ๋ณด์ธ๋ค๋ฉด? media query๋ฅผ ๋๋ฐฐํ๋ ๋์ ํ๋์ ์ธ ํจ์๋ฅผ ์จ๋ด
์๋ค.
/* ๐ฃ ์์ฒ ์ด์ ์ค๋งํธํ ์ ๋ชฉ */
h1 {
/* ์ต์ 1.5rem, ์ด์์ ์ผ๋ก ํ๋ฉดํญ์ 5%, ์ต๋ 3rem */
font-size: clamp(1.5rem, 5vw, 3rem);
}๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. line-height: 1.5;์ line-height: 1.5em;์ ์ฐจ์ด์ ์ ๋ฌด์์ผ๊น์? (ํํธ: ์์)
โ
์ ๋ต: 1.5(๋จ์ ์์)๋ ์์ ์์๊ฐ ์์ ์ font-size ๊ธฐ์ค์ผ๋ก ์ฌ๊ณ์ฐํ๊ณ , 1.5em์ ๋ถ๋ชจ์ ๊ณ์ฐ๋ ๊ณ ์ ๊ฐ์ด ๊ทธ๋๋ก ์์๋๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
line-height: 1.5(๋จ์ ์์)๋ ๋ฐฐ์๋ก ์์๋ฉ๋๋ค. ์์์ดfont-size: 16px์ด๋ฉด16 ร 1.5 = 24px๋ก ์๋ ๊ณ์ฐ๋์ฃ . ๋ฐ๋ฉด1.5em์ ๋ถ๋ชจ์font-size ร 1.5๋ก **๊ณ ์ ๊ฐ(์: 48px)**์ด ๊ณ์ฐ๋ ํ ๊ทธ ๊ฐ ์์ฒด๊ฐ ์์๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋ถ๋ชจ๊ฐ
font-size: 32px; line-height: 1.5em์ด๋ฉด48px์ด ์์์๊ฒ ๊ทธ๋๋ก ๊ฐ๋๋ค. ์์์ ๊ธ์๊ฐ 16px์ด๋ฉด ํ๊ฐ์ด ๋น์ ์์ ์ผ๋ก ๋์ด์ ธ์!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋จ์ ์๋ ์ซ์ = ๋น์จ ์์(์ ์ฐ), em = ๊ณ์ฐ๋ ๊ฐ ์์(๋ฑ๋ฑ)"
Q2. ์น ํฐํธ๊ฐ ๋ก๋ฉ๋๊ธฐ ์ ๊น์ง ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ ํฐํธ๋ฅผ ๋ณด์ฌ์ฃผ์ด ๊ฐ๋ ์ฑ์ ํ๋ณดํ๋ CSS ์์ฑ๊ฐ์ ๋ฌด์์ผ๊น์?
font-display: fallbackfont-display: swapfont-style: autofont-weight: pre-load
โ
์ ๋ต: 2. font-display: swap
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
font-display: swap์ ํฐํธ๊ฐ ๋ก๋๋๊ธฐ ์ ์์คํ ํฐํธ๋ฅผ ๋จผ์ ๋ณด์ฌ์ฃผ๊ณ , ๋ก๋ฉ์ด ์๋ฃ๋๋ฉด ์๋์ผ๋ก ๊ต์ฒดํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋น ํ๋ฉด(FOIT)์ ๋ณด์ง ์์ UX๊ฐ ์ข์์ง๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋,
fallback์ ์งง์ ์๊ฐ๋ง ๊ธฐ๋ค๋ฆฌ๋ค ํฌ๊ธฐํ๊ณ ,swap์ ๋๊น์ง ๊ต์ฒดํด์ค์. ๋๋ถ๋ถ์ ์๋น์ค์์๋swap์ด ์ ๋ต์ ๋๋ค!" - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "swap = ์ผ๋จ ๋ณด์ฌ์ฃผ๊ณ ๋์ค์ ๊ต์ฒด. ์ฌ์ฉ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ์ง ๋ง๋ผ!"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ํคํ
์ฒ ์ค๊ณ]
์์ ๋์์ด๋ ๋์ด ํ ํ์ด์ง์ 5๊ฐ์ง์ ๋ค๋ฅธ ์ ๋ฃ ์น ํฐํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ค๊ณ ํ์ญ๋๋ค. ์ํธ ๋ฆฌ๋ ๋์ด "์ฑ๋ฅ ๋๋ฌธ์ ์ ๋ ์ ๋๋ค"๋ฉฐ ๋ฐ๋ํ๊ณ ๊ณ์๋ค์. ์์ฒ ์ด๊ฐ ์ค๊ฐ์์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ธฐ์ ์ ์ธ ์ต์ ๋์์ ๋ฌด์์ผ๊น์?
โ
์ ๋ต: Variable Fonts (๊ฐ๋ณ ํฐํธ)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ๊ฐ๋ณ ํฐํธ๋ ํ๋์ ํฐํธ ํ์ผ ์์ ๊ตต๊ธฐ(Weight), ๋๋น(Width), ๊ธฐ์ธ๊ธฐ(Italic) ๋ฑ ๋ค์ํ ์คํ์ผ ์ ๋ณด๋ฅผ ๋ชจ๋ ๋ด๊ณ ์์ต๋๋ค. 5๊ฐ์ ํ์ผ์ ๋ฐ์ ํ์ ์์ด ๋จ ํ๋์ ํ์ผ๋ก ๋์์ด๋์ ์๊ตฌ๋ฅผ ๋ชจ๋ ๋ง์กฑ์ํฌ ์ ์์ฃ .
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ํ์ผ์ ์ฌ๋ฌ ๊ฐ ๋ฐ๋ ๊ฑด ๋คํธ์ํฌ ๋น์ฉ์ด ๋๋ฌด ์ปค์. ์ ๊ธฐ์ ์ธ Variable Font๋ก ์์ ๋๊ณผ ์ํธ ๋ ๋ชจ๋๋ฅผ ๋ง์กฑ์์ผ ๋ณด์ธ์!"
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "ํ์ผ ํ๋๋ก ์๋ง ๊ฐ์ง ๋ณํ๋ฅผ! Variable Font๊ฐ ๋ฏธ๋๋ค."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ ๊ธ์๊ฐ ๊ทธ๋ฅ ๊ธ์๊ฐ ์๋๋ผ๋ ๊ฑธ ์๊ฒ ๋๋ค.
๊ธ์์๋ ๋ฌด๊ฒ๊ฐ์ด ์๊ณ , ์๋๊ฐ ์๊ณ , ์์๊ฐ(?) ์๋ค๋ ๊ฑธ ๋ฐฐ์ ๋ค.
๊ทธ๋์ ๊ธ์๊ฐ ๊น๋นก๊ฑฐ๋ฆฌ๋ ๊ฑธ ๋ณด๋ฉด์๋ "์ธํฐ๋ท์ด ๋๋ฆฐ๊ฐ ๋ณด๋ค" ํ๊ณ ๋๊ฒผ๋๋ฐ, ๊ทธ๊ฒ ๋ค ๋ด ๋ฌด๊ด์ฌ์์ ๋น๋กฏ๋ UX ํ๊ดด์๋ค๋... ๋ฐ์ฑํ๊ฒ ๋๋ค.
๐ก "ํ์ดํฌ๊ทธ๋ํผ๋ ๋ชฉ์๋ฆฌ๋ค. ์ต์ ํ๋ ํฐํธ ๋ก๋ฉ์ ๊ทธ ๋ชฉ์๋ฆฌ๋ฅผ ๊ฐ์ฅ ์ ๋ช ํ๊ณ ๋น ๋ฅด๊ฒ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค."
์ง์ ๊ฐ๋ฉด์ ๋ด ๋ธ๋ก๊ทธ์ ๋ค์ด๊ฐ ๋ณด๋ ๊ธ์๊ฐ ๋ค 'swap' ์์ด ๋ก๋ฉ๋๊ณ ์์๋ค. ์ถฉ๊ฒฉ!
๋น์ฅ ์ง์ ๊ฐ์ ํ ์ค ์ฝ๋๋ก ๋ค ๊ณ ์ณ๋์ผ์ง. ์ค๋ ๋ฐค์ ํฐํธ ํ์ผ ๋ค์ด์ดํธ ์ข ์์ผ์ผ๊ฒ ๋ค.
์์ฒ ์ด์ ์ฑ์ฅ ์๋๋ clamp()์ฒ๋ผ ์ ์ฐํ๋ฉด์๋ ํํํด์ง๊ธธ ๋ฐ๋ผ๋ฉฐ, ์ค๋์ ๊ฟ์ ์์ฝ! ๐ด