[WEB] Reflow & Repaint

yayaya_hojinΒ·2024λ…„ 2μ›” 1일

WEB

λͺ©λ‘ 보기
13/16
post-thumbnail

🌏 κ°„λ‹¨ν•œ λΈŒλΌμš°μ € μž‘λ™ κ³Όμ •

Reflow와 Repaint의 κ°œλ…μ„ 닀루기 이전에 λ¨Όμ € λΈŒλΌμš°μ € μž‘λ™ 과정을 κ°„λž΅ν•˜κ²Œ μ‚΄νŽ΄λ³΄μž

1) HTML을 νŒŒμ‹±ν•˜μ—¬ DOM 트리 생성

2) CSSλ₯Ό νŒŒμ‹±ν•˜μ—¬ CSSOM 트리 생성

3) JavaScriptλ₯Ό νŒŒμ‹±ν•˜μ—¬ AST 생성

4) λ Œλ” 트리 생성

5) λ ˆμ΄μ•„μ›ƒ μ§„ν–‰

6) 페인트 μ§„ν–‰

μžμ„Έν•œ λΈŒλΌμš°μ € λ Œλ”λ§ κ³Όμ •

μœ„ κ³Όμ • 이후에 화면을 μˆ˜μ •λ˜λ©΄ 화면을 λ‹€μ‹œ 그리게 λ˜λŠ”λ° μ΄λ•Œ 이 과정을 Reflow와 Repaint라고 ν•œλ‹€.

πŸͺ„ Reflow

Reflow 말 κ·ΈλŒ€λ‘œ ν”Œλ‘œμš°λ₯Ό λ‹€μ‹œ μ •ν•œλ‹€λŠ” λœ»μ΄λ‹€.

μš”μ†Œμ˜ λ„ˆλΉ„, 높이, μœ„μΉ˜ 등이 λ³€κ²½λ˜μ—ˆμ„ λ•Œ λ Œλ” 트리λ₯Ό μž¬μ„±μ„±ν•˜κ³  μ΄λ•Œ Reflowκ°€ λ°œμƒν•œλ‹€κ³  ν•œλ‹€.

❗ Reflow λ°œμƒ

  • μš”μ†Œμ˜ μœ„μΉ˜, 크기 λ³€κ²½

  • 폰트 λ³€κ²½, ν…μŠ€νŠΈ λ‚΄μš© λ³€κ²½

  • JavaScirptλ₯Ό ν†΅ν•œ DOM 동적 λ³€ν™”

  • μœˆλ„μš° 리사이징 λ°œμƒ(Global Layout 영ν–₯)

πŸ–ŒοΈ Repaint

Repaint 말 κ·ΈλŒ€λ‘œ λ‹€μ‹œ κ·Έλ¦°λ‹€λŠ” λœ»μ΄λ‹€.

❗ Repaint λ°œμƒ

  1. μš”μ†Œ 색상이 λ³€κ²½ λ˜μ—ˆμ„ λ•Œ

  2. Reflowκ°€ λ°œμƒν–ˆμ„ λ•Œ

  3. Visibilityκ°€ hiddenμ—μ„œ visible둜 λ°”λ€Œμ—ˆμ„ λ•Œ

πŸ’₯ ν™”λ©΄μ˜ ꡬ쑰가 λ³€κ²½λ˜μ§€ μ•ŠλŠ” 경우 Repaint만 λ°œμƒν•œλ‹€!

🚫 Reflow & Repaint μ΅œμ†Œν™”

Reflowκ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μš”μ†Œμ˜ μ£Όλ³€ λΆ€λͺ¨, μžμ‹, ν˜•μ œ λ…Έλ“œκΉŒμ§€ 영ν–₯을 μ£Όμ–΄ λΉ„μš©μ΄ 큰 μž‘μ—…μ΄λ‹€.

Repaint μ—­μ‹œ DOM APIλ₯Ό μ‘°μ ˆν•˜λ©΄ μžμ‹ λ…Έλ“œκΉŒμ§€ λͺ¨λ‘ κ²€μƒ‰ν•˜κΈ° λ•Œλ¬Έμ— μ„±λŠ₯ μ €ν•˜λ₯Ό λ°œμƒμ‹œν‚¬ 수 μžˆλ‹€.

❗ 그렇기에 Reflow와 Repaintλ₯Ό μ΅œμ†Œν™” ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€!

πŸ–οΈ λͺ‡ κ°€μ§€ μ΅œμ†Œν™” 방법

1) in-line μŠ€νƒ€μΌ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • in-line μŠ€νƒ€μΌμ˜ 경우 HTML이 νŒŒμ‹±λ  λ•Œ, λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£Όμ–΄ μΆ”κ°€ Reflowκ°€ λ°œμƒν•œλ‹€.

2) μŠ€νƒ€μΌ 변경이 μžˆμ„ λ•Œ CSS ν•˜μœ„ 클래슀λ₯Ό λ³€κ²½ν•œλ‹€.

  • Reflowκ°€ λ°œμƒν•˜λ©΄ DOM μš”μ†Œμ˜ μƒμœ„ λ…Έλ“œμ™€ ν•˜μœ„ λ…Έλ“œ λͺ¨λ‘ 영ν–₯을 쀄 수 있기 λ•Œλ¬Έμ— κ°€μž₯ ν•˜μœ„ λ…Έλ“œλ₯Ό λ³€κ²½ν•¨μœΌλ‘œμ¨ 영ν–₯을 μ΅œμ†Œν™”ν•œλ‹€.

3) DOM μ‚¬μš©μ„ μ΅œμ†Œν™”ν•œλ‹€.

  • DOM μ‚¬μš©μ„ μ€„μž„μœΌλ‘œμ¨ DOM 접근을 μ΅œμ†Œν™” ν•΄ Reflow λΉ„μš©μ„ 쀄인닀.

4) μ• λ‹ˆλ§€μ΄μ…˜μ΄ μžˆλŠ” λ…Έλ“œμ˜ position을 absolute λ˜λŠ” fixed둜 μ„€μ •ν•œλ‹€.

  • λ…Έλ“œμ˜ position을 absolute/fixed둜 μ„€μ •ν•˜μ—¬ ν•΄λ‹Ή λ…Έλ“œλ₯Ό 전체 λ…Έλ“œμ—μ„œ λΆ„λ¦¬μ‹œμΌœ ν•΄λ‹Ή λ…Έλ“œμ—μ„œλ§Œ Reflowλ₯Ό λ°œμƒμ‹œν‚€κ³ , μ£Όλ³€ λ ˆμ΄μ•„μ›ƒμ˜ 영ν–₯을 μ΅œμ†Œν™”ν•œλ‹€.

5) CSS ν‘œν˜„μ‹μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • CSS ν‘œν˜„μ‹μ€ Reflowκ°€ λ°œμƒν•  λ•Œλ§ˆλ‹€ μžλ°”μŠ€ν¬λ¦½νŠΈ ν‘œν˜„μ‹μ΄ λ‹€μ‹œ κ³„μ‚°λ˜κΈ° λ•Œλ¬Έμ— Reflow λΉ„μš©μ΄ λ†’λ‹€.

πŸ“ { display: none } & { visibility: hidden }

{ display: none } : 화면에 보이지도 μ•Šκ³  λ ˆμ΄μ•„μ›ƒμ„ μ°¨μ§€ν•˜μ§€ μ•ŠμŒ, ν˜„ μƒνƒœμ—μ„œλŠ” Reflowκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€. 단 hidden β†’ block λ˜λŠ” inline λ“±μœΌλ‘œ λ°”λ€Œκ²Œ 되면 Reflow, Repaint λ°œμƒ

{ visibility: hidden } : 화면에 λ³΄μ΄μ§€λ§Œ μ•Šμ„ 뿐 λ ˆμ΄μ•„μ›ƒμ„ 차지함, 단 hidden β†’ visible이 되면 Repaint만 λ°œμƒ

πŸ’‘ ν™”λ©΄μ—μ„œ μ œκ±°ν•˜λŠ” 방법을 μ„ νƒν•˜λŠ” 것은 { display: none }이 λ ˆμ΄μ•„μ›ƒμ„ μ°¨μ§€ν•˜μ§€ μ•Šμ•„ μ„±λŠ₯μ μœΌλ‘œλŠ” { visibility: hidden }보닀 λ›°μ–΄λ‚  수 μžˆλ‹€.
ν•˜μ§€λ§Œ λ‹€μ‹œ λ³΄μ΄λŠ” κ³Όμ •μ—μ„œλŠ” display에 경우 Reflow와 Repaintλ₯Ό λ°œμƒμ‹œν‚¨λ‹€.
λ°˜λ©΄μ— visibility에 경우 Repaint만 λ°œμƒν•˜κΈ° λ•Œλ¬Έμ— 각각의 νŠΉμ§•κ³Ό λ™μž‘ 방식을 κ³ λ €ν•΄μ„œ μ‚¬μš©ν•΄μ•Ό λœλ‹€.

0개의 λŒ“κΈ€