λΈλ‘κ·Έ CLS μ±λ₯ μ΅μ ν: κ°λ°μ λκ΅¬λ‘ μ€λ₯ νμΈλΆν° κ°λ¨ν μμ λ°©λ²κΉμ§
μΉμ¬μ΄νΈμ μ±λ₯, μλ, κ·Έλ¦¬κ³ μ¬μ©μ κ²½νμ SEO(κ²μ μμ§ μ΅μ ν)μ ν΅μ¬ μμμ
λλ€. κ·Έμ€μμλ CLS(Cumulative Layout Shift, λμ λ μ΄μμ μ΄λ)λ κ²μμμ§μ΄ μ€μνκ² νκ°νλ μΉ μ±λ₯ μ§ν μ€ νλμ
λλ€. ν°μ€ν 리 λΈλ‘κ·Έλ λ€λ₯Έ λΈλ‘κ·Έ νλ«νΌκ³Ό λ¬λ¦¬, μ΄μμκ° μμ μ μ·¨ν₯μ λ°λΌ λΈλ‘κ·Έ λμμΈμ μμ λ‘κ² μμ ν μ μμ΅λλ€. μ΄λ¬ν κΈ°λ₯μ ν°μ€ν 리λ§μ κ°μ₯ ν° μ₯μ μ€ νλμ
λλ€.
νμ§λ§ μκ³ κ³μ
¨λμ?
μ΄ μ₯μ μ΄ μλͺ» μ¬μ©λλ©΄ λ¨μ μ΄ λ μλ μλ€λ μ¬μ€μμ.
무ν±λκ³ λΈλ‘κ·Έ μ€ν¨μ μμ νλ€ λ³΄λ©΄, λΈλ‘κ·Έ μ±λ₯ μ§μμ μ μν₯μ λ―ΈμΉλ μ€μλ₯Ό νκ² λλ κ²½μ°κ° λ§μ΅λλ€. λμμΈκ³Ό μ κ·Όμ±λ λ¬Όλ‘ μ€μνμ§λ§, μΉ μ±λ₯ μ§μ(CLS λ±)μ λ¬Έμ λ₯Ό λ°μμν€μ§ μλ λ²μ λ΄μμ μμ νλ κ²μ κΆμ₯λ립λλ€.
λ§μ½ μ€ν¨ μμ μ κ³ννκ³ μλ€λ©΄, μλμ μκ°νλ λ°©λ²μ ν΅ν΄ λΈλ‘κ·Έμ μ±λ₯ λ¬Έμ κ° λ°μνμ§ μλμ§ λ°λμ μ κ²νμκΈ° λ°λλλ€.
ν¬λ‘¬ κ°λ°μ λκ΅¬λ‘ CLS μΈ‘μ νκ³ λΈλ‘κ·Έ μ€λ₯ μ§μ κ³ μΉλ λ°©λ²
κ·Έμ€μμλ κ°μ₯ μ€μν μ κ² νλͺ©μ΄ λ°λ‘ CLSμ λλ€.
λλΆλΆμ μ±λ₯ λ¬Έμ λ λΈλ‘κ·Έ μ체μ μλ² νκ²½κ³Ό κ΄λ ¨μ΄ μμ΄ μμ μ΄ μ΄λ ΅μ§λ§, CLSλ μ΄μμμ μ€ν¨ μμ μμ λΉλ‘―λλ κ²½μ°κ° λλΆλΆμ΄κΈ° λλ¬Έμ μ€μ€λ‘ κ°μ μ΄ κ°λ₯ν©λλ€.
CLSλ 무μμΈκ°μ?
CLSλ νμ΄μ§ λ‘λ© μ€ μκ°μ μΈ μμκ° μκ³ μμ΄ μ΄λνλ νμμ μμΉνν μ§νμ λλ€. μλ₯Ό λ€μ΄, κ΄κ³ λ μ΄λ―Έμ§κ° λ¦κ² λ‘λ©λλ©΄μ ν μ€νΈκ° λ°λ €λλ κ²½μ°κ° μ¬κΈ°μ ν΄λΉν©λλ€.
CLSκ° λμμλ‘ μ¬μ©μλ λΆνΈν¨μ λλΌκ³ , κ²μ μμμλ λΆμ μ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
CLSμ κ°λ κ³Ό μΈ‘μ κΈ°μ€μ λν μμΈν μ€λͺ μ μ΄ κΈμμ νμΈνμ€ μ μμ΅λλ€.
λΈλ‘κ·Έμμ CLS μ€λ₯ νμΈνλ λ°©λ²
λΈλ‘κ·Έ μ¬μ΄νΈμ μ±λ₯ κ²μ¬λ μ΅κ·Ό ν¬λ‘¬ λΈλΌμ°μ (Chrome)μμ κΈ°λ₯μ΄ λ§μ΄ κ°μ λμ΄, λꡬλ μ½κ² μΈ‘μ νκ³ λ¬Έμ μ μ νμ ν μ μμ΅λλ€. μ¬μ© λ°©λ²λ λ§€μ° κ°λ¨νκΈ° λλ¬Έμ, νΉλ³ν κΈ°μ μ§μμ΄ μμ΄λ μμ μ μΉμ¬μ΄νΈλ λΈλ‘κ·Έ μ±λ₯μ μ§μ μ κ²νκ³ μ€λ₯λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
μλ μκ°νλ λ°©λ²μ λ°λΌ λΈλΌμ°μ μ κ°λ°μ λꡬ(Chrome DevTools)λ₯Ό νμ©ν΄ 보μΈμ.
CLS(Cumulative Layout Shift)λ₯Ό ν¬ν¨ν λΈλ‘κ·Έμ ν΅μ¬ μ±λ₯ μ§νλ€μ μ§μ νμΈνκ³ κ°μ ν μ μλ μ’μ μΆλ°μ μ΄ λ κ²μ
λλ€. λ¨Όμ μΈ‘μ νκ³ μμ νλ €λ λΈλ‘κ·Έμ μ¬μ΄νΈλ₯Ό ν¬λ‘¬μΌλ‘ μ μν©λλ€.
1. ν¬λ‘¬ κ°λ°μ λꡬ μ΄κΈ°
- λΈλ‘κ·Έ νμ΄μ§μμ F12 ν€ λλ μ°ν΄λ¦,κ²μ¬ μ ν
- λλ Ctrl + Shift + I (Macμ Cmd + Option + I)
2. "μ±λ₯(Performance)" ν μ΄λ
- μλ¨μ Performance ν ν΄λ¦
- νμ΄μ§λ₯Ό μλ‘κ³ μΉ¨νκ³ λͺ μ΄κ° λ‘λ© κ³Όμ μ κΈ°λ‘
- μλ£ ν Experience μμμμ Layout Shift λ°μ μ¬λΆ νμΈ
3. Lighthouseλ‘ μλ λΆμ
- Lighthouse ν Generate Report
- Cumulative Layout Shiftνλͺ©μ μ μμ λ¬Έμ μμ νμΈ
CLS λ°μ μμΈ λΆμ
μ΄ κ³Όμ μ ν΅ν΄ CLS(Cumulative Layout Shift)λ₯Ό λΉλ‘―ν λ€μν μΉ μ±λ₯ μ§νλ₯Ό μ€μκ°μΌλ‘ νμΈνκ³ , λΈλ‘κ·Έμ ꡬ쑰μ λ¬Έμ λ λ‘λ© μ§μ° λ±μ μμΈμ 체κ³μ μΌλ‘ νμ ν μ μμ΅λλ€.
μ: μλλ CLS λ¬Έμ λ°μ μ§μ 0.001λ‘ νμΈλ μ¬λ‘μ
λλ€.
νλ¨μ Layout νμ νμΈνμ¬ λ¬Έμ κ° λλ μ½λλ₯Ό μ§μ νμΈν μ μμ΅λλ€.
μμμ²λΌ CLS μ§μκ° 0.001λ‘ νμλ κ²½μ°, ν¬λ‘¬ κ°λ°μ λꡬ νλ¨μ Layoutνμ μ΄μ΄ λ¬Έμ λ₯Ό μ λ°νλ HTML/CSS μμλ₯Ό μ§μ νμΈν μ μμ΅λλ€.
1. λμ μ½ν μΈ μ λμ΄ λΆνμ€μ±
- μ½ν μΈ κ° λμ€μ μΆκ°λλ κ΅¬μ‘°μΌ κ²½μ°, μ΄κΈ° λ λλ§ μ 곡κ°μ΄ 미리 ν보λμ§ μμ μ£Όλ³ μμλ₯Ό λ°μ΄λ λλ€.
- λν μ¬λ‘: λκΈ μμ, νκΈ° μμ ―, μΆμ² ν¬μ€νΈ λ± μ€ν¬λ¦½νΈλ‘ μ½μ λλ μμ
2. μ§μ° λ‘λ©λ μ΄λ―Έμ§, κ΄κ³ , iframe λ±
- Lazy loading λλ JS μ½μ κ΄κ³ λ μ²μμ 곡κ°μ μ°¨μ§νμ§ μλ€κ°, λμ€μ λ±μ₯νλ©° λ μ΄μμμ μ΄λμν΄
- λ°μν ꡬ쑰μμλ λ ν° λ μ΄μμ λΆκ΄΄ μν μ‘΄μ¬
- μμ: Google AdSense κ΄κ³ , YouTube iframe μ½μ λ±
3. !importantμ λΆμμ©
- κ°μ μ€νμΌ μ μ©μΌλ‘ μΈν΄ μλνμ§ μμ λμ΄ μΆ©λμ΄ λ°μ
- νΉν Flexλ Grid 컨ν μ΄λ μμμ μμ μμμ λΉμ¨·ν¬κΈ° μμΈ‘μ΄ μ΄λ €μμ§λ©° μ΄λ κ°λ₯μ± μ¦κ°
4. κ³ μ λμ§ μμ λΉμ¨/aspect-ratio μ€μ λλ½
- μ΄λ―Έμ§λ λΉλμ€, μΈλ€μΌ λ±μ΄ λΉμ¨ μμ΄ μ½μ λ κ²½μ°, λ‘λ© ν μ€μ ν¬κΈ°λ‘ νμ₯λλ©° μ£Όλ³ κ΅¬μ‘°λ₯Ό λ°μ΄λ
5. ν°νΈ, μΉ ν°νΈ μ§μ° λ‘λ©
- FOUT(Flash of Unstyled Text) νμ λ°μ μ, μ΄κΈ° λ λλ§ ν ν μ€νΈ ν¬κΈ° λ³νλ‘ μΈν μ΄λ λ°μ
6. λΈλΌμ°μ /λ λλ§ μ΅μ ν λ―Έν‘
- CSS contain, min-height, aspect-ratio μμ± λ±μ΄ λλ½λ κ²½μ° λΈλΌμ°μ κ° λ μ΄μμ μμ μ±μ ν보νμ§ λͺ»ν¨
λΈλ‘κ·Έ μ΅μ ν CLS λ¬Έμ ν΄κ²° λ°©λ²
μΉ νμ΄μ§μμ λ°μνλ CLS(Cumulative Layout Shift, λμ λ μ΄μμ μ΄λ) λ¬Έμ λ λλΆλΆ λμ μ½ν
μΈ μ λμ΄ λΆνμ€μ±μ΄λ μ§μ° λ‘λ©λ μ΄λ―Έμ§·κ΄κ³ ·μ»΄ν¬λνΈλ‘ μΈν΄ λ°μν©λλ€. μ΄λ¬ν λ¬Έμ λ νμ΄μ§ μ±λ₯ μ νλ‘ μ΄μ΄μ§κ³ , SEO μ μμλ μ
μν₯μ λ―ΈμΉκ² λ©λλ€.
λ€μμ μ€μ λΈλ‘κ·Έλ μΉμ¬μ΄νΈμμ μ μ©ν μ μλ 4κ°μ§ μ€μ ν΄κ²° λ°©λ²μ
λλ€.
1. μ΅μ λμ΄ ν보 (κ°λ¨ν ν΄κ²°μ± )
κ°μ₯ κΈ°λ³Έμ μΈ λ°©μμ min-height μμ±μ νμ©νμ¬ λμ μ½ν μΈ κ° λ‘λ©λκΈ° μ μ μμ 곡κ°μ 미리 ν보νλ κ²μ λλ€. μ΄λ κ² νλ©΄ μ½ν μΈ κ° λνλ λ μ£Όλ³ μμκ° λ°λ¦¬λ νμμ λ°©μ§ν μ μμ΅λλ€. height: autoμ ν¨κ» μ¬μ©νλ©΄ λ°μν ꡬ쑰μλ μ μ°νκ² λμν μ μμ΅λλ€.
.λμ -μμ {
height: auto !important;
min-height: 200px !important;
}
2. CSS Containment μ¬μ© (μ±λ₯ ν₯μ + μμ μ±)
CSSμ contain μμ±μ μ¬μ©νλ©΄ ν΄λΉ μμμ λΈλΌμ°μ μ λ 립μ μΈ λ λλ§ λ¨μλ‘ μΈμμμΌ, λ΄λΆ μ½ν μΈ λ³νκ° μ£Όλ³ λ μ΄μμμ λ―ΈμΉλ μν₯μ μ΅μνν μ μμ΅λλ€. νΉν λμ λ°μ΄ν°λ μ€ν¬λ¦½νΈκ° μμ£Ό λ³κ²½λλ μμμμ μ μ©ν©λλ€.
.λμ -μμ {
contain: layout paint style;
height: auto;
min-height: 0;
}
- ν¨κ³Ό: μ΄ μμμ λ 립μ μ΄λΌκ³ λΈλΌμ°μ μ μλ €μ€
- κ²°κ³Ό: λ΄λΆ λ³νκ° μ£Όλ³ λ μ΄μμμ μν₯μ λ λ―ΈμΉ¨
3. μ€μΌλ ν€ UI μ μ© (UX κ°μ )
λ‘λ© μκ°μ΄ 걸리λ μ½ν μΈ κ° μλ€λ©΄, μ€μΌλ ν€(Skeleton) UIλ₯Ό λ¨Όμ 보μ¬μ£Όλ λ°©μμΌλ‘ μ¬μ©μμ μκ°μ νΌλμ μ€μΌ μ μμ΅λλ€. μ΄κΈ° κ³΅κ° ν보μ ν¨κ» μμ λ μ΄μμμ 미리 보μ¬μ€μΌλ‘μ¨ μ²΄κ° CLSλ₯Ό μ€μ΄λ ν¨κ³Όλ λ°μ΄λ©λλ€.
<div class="λμ -μμ">
<!-- λ‘λ© μ€ -->
<div class="skeleton" style="height: 200px; background: #eee;"></div>
<!-- μ€μ μ½ν
μΈ -->
</div>
- μ₯μ : μ¬μ©μμκ² μμ 곡κ°μ λ¨Όμ 보μ¬μ£Όμ΄ μκ°μ μμ κ° μ 곡
- 체κ°λλ CLS νμμ ν¬κ² μ€μ¬μ€
4. JavaScriptλ‘ λμ΄ λ―Έλ¦¬ μ€μ (κ³ κΈ κΈ°λ²)
JSλ₯Ό μ¬μ©νλ©΄ μ½ν μΈ λ‘λ μ΄μ μ **μμ λμ΄(minHeight)**λ₯Ό μ€μ νμ¬ λ μ΄μμ μ΄λμ λ°©μ§νκ³ , μ½ν μΈ λ‘λ© νμλ μμ°μ€λ½κ² minHeightλ₯Ό ν΄μ ν μ μμ΅λλ€. λμ μ½ν μΈ κ° μΈμ λ‘λλλμ§ μ νν μ μ μμ λ μ μ©ν κΈ°λ²μ λλ€.
const dynamicElement = document.querySelector('.λμ -μμ');
dynamicElement.style.minHeight = '200px';
setTimeout(() => {
dynamicElement.style.minHeight = 'auto';
}, 10);
- μ½ν μΈ λ‘λ μ μμ κ³΅κ° ν보 μμ°μ€λ¬μ΄ μ ν
- μ€μ λ‘λ© μλ£ ν minHeightλ₯Ό μ κ±°ν΄ λ μ΄μμ μ 리
CLS μ€μκ° μΈ‘μ μ½λ
κ°λ°μλΌλ©΄ μ§μ μ½λλ₯Ό ν΅ν΄ CLS λ°μ μ¬λΆλ₯Ό μΆμ ν μ μμ΅λλ€:

- μ½μμμ μ΄λ€ μμκ° μ΄λνλμ§ μ€μκ° νμΈ κ°λ₯
- λλ²κΉ λ° μ±λ₯ κ°μ μ λ§€μ° μ μ©
μ΅μ’ μ 리 λ° κΆμ₯ μ λ΅
μ λ΅ | μ€λͺ |
min-height μ€μ | μμΈ‘ κ°λ₯ν κ³΅κ° ν보 |
contain μμ± μ¬μ© | λ μ΄μμ κ°μ μ°¨λ¨ |
aspect-ratio νμ© | μ΄λ―Έμ§/κ΄κ³ μ λΉμ¨ κ³ μ |
μ€μΌλ ν€ UI λμ | μ¬μ©μ μ²΄κ° μμ κ° μ¦κ° |
JS μ¬μ λμ΄ κ³μ° | μ κ΅ν λ μ΄μμ 컨νΈλ‘€ κ°λ₯ |
CLSλ "μμΈ‘ κ°λ₯ν κ³΅κ° ν보"κ° ν΅μ¬μ λλ€
- μ무리 νλ €ν λΈλ‘κ·Έ λμμΈμ΄λΌλ, μ½ν μΈ κ° λ°λ¦¬λ νμμ΄ μλ€λ©΄ μ¬μ©μ κ²½νμ λ§κ°μ§λλ€.
- κ°μ₯ κ°λ¨ν μμμ .λμ -μμμ min-heightλ₯Ό λΆμ¬νλ κ²λΆν°μ λλ€.
- !importantλ λ§μ§λ§ μλ¨μΌλ‘λ§ μ¬μ©νκ³ , κ°λ₯ν ν CSS ꡬ쑰 μ체λ₯Ό μ¬μ€κ³νλ κ²μ΄ μ’μ΅λλ€.
CLS(λμ λ μ΄μμ μ΄λ) ν΅μ¬ Q&A 3κ°μ§
Q1. CLSλ 무μμ΄λ©° μ μ€μνκ°μ?
A1. CLSλ νμ΄μ§ λ΄ μκ°μ μμκ° μκΈ°μΉ μκ² μμ§μ΄λ νμμ μΈ‘μ νλ μΉ μ±λ₯ μ§νλ‘, μ¬μ©μ κ²½νκ³Ό SEOμ ν° μν₯μ λ―ΈμΉ©λλ€.
Q2. ν°μ€ν 리 λΈλ‘κ·Έμμ CLS λ¬Έμ κ° μμ£Ό λ°μνλ μ΄μ λ?
A2. μμ λ‘μ΄ μ€ν¨ μμ κΈ°λ₯ λλ¬Έμ λμ μ½ν
μΈ λμ΄ λΆνμ€μ±, μ§μ° λ‘λ© μμ, CSS μΆ©λ λ±μ΄ λ°μν΄ CLSκ° λμμ§λ κ²½μ°κ° λ§μ΅λλ€.
Q3. CLS λ¬Έμ λ₯Ό ν¨κ³Όμ μΌλ‘ ν΄κ²°νλ €λ©΄ μ΄λ»κ² ν΄μΌ νλμ?
A3. μ΅μ λμ΄ μ§μ , CSS contain μμ± νμ©, μ€μΌλ ν€ UI μ μ©, JavaScriptλ‘ λμ΄ μ¬μ μ€μ λ±μΌλ‘ 곡κ°μ 미리 νλ³΄ν΄ λ μ΄μμ μ΄λμ μ€μ΄λ κ²μ΄ μ€μν©λλ€.