Reflow(๋ฆฌํ๋ก์ฐ)
์ ์: ๋ธ๋ผ์ฐ์ ๊ฐ DOM ์์์ ์์น์ ํฌ๊ธฐ๋ฅผ ๋ค์ ๊ณ์ฐํ๋ ๊ณผ์ . ๋ฐ์ ์๊ธฐ: DOM ์์์ ์คํ์ผ ๋ณ๊ฒฝ, ์์ ์ถ๊ฐ/์ ๊ฑฐ, ์๋์ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ฑ. ๋น์ฉ: Reflow๋ ๋ ์ด์์ ์ ์ฒด๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ฏ๋ก ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค.
Repaint(๋ฆฌํ์ธํธ)
์ ์: ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ ์คํ์ผ(์์, ๋ฐฐ๊ฒฝ, ๊ทธ๋ฆผ์ ๋ฑ)์ ๋ณ๊ฒฝํ๊ณ ๋ค์ ๊ทธ๋ฆด ๋ ๋ฐ์ํ๋ ๊ณผ์ . ๋ฐ์ ์๊ธฐ: CSS๋ก ์คํ์ผ ์์ฑ ๋ณ๊ฒฝ, ํ ์คํธ ๋ด์ฉ ๋ณ๊ฒฝ, ํด๋์ค ๋ณ๊ฒฝ ๋ฑ. ๋น์ฉ: Repaint๋ ๊ทธ๋ฆฌ๊ธฐ ์์ ์ด๋ฏ๋ก, Reflow๋ณด๋ค ๋น์ฉ์ด ์ ์ต๋๋ค. Reflow์ Repaint์ ์ฑ๋ฅ ์ฐจ์ด Reflow๋ ๋ ์ด์์ ์ ์ฒด๋ฅผ ๋ค์ ๊ณ์ฐํ๋ฏ๋ก ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ์๋ฅผ ๋ค์ด, ์คํฌ๋กค์ด๋ ์๋์ฐ ํฌ๊ธฐ ๋ณ๊ฒฝ ๋ฑ ๋ ์ด์์์ ์ํฅ์ ์ฃผ๋ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค. Repaint๋ ์คํ์ผ ๋ณ๊ฒฝ ์ ๋ฐ์ํ๋ฉฐ, Reflow๋ณด๋ค ๋น์ฉ์ด ์ ์ต๋๋ค. ๋น๊ต์ ๋ ๋น๋ฒํ๊ฒ ๋ฐ์ํฉ๋๋ค.
| ๋ธ๋ผ์ฐ์ |
| (Browser) |
+------------------+
|
v
+------------------+
| DOM ํธ๋ฆฌ |
| (DOM Tree) |
+------------------+
|
v
+------------------+
| ๋ ์ด์์ ๊ณ์ฐ | <--- Reflow (๋ฆฌํ๋ก์ฐ)
| (Layout) |
+------------------+
|
v
+------------------+
| ํ์ธํ
| <--- Repaint (๋ฆฌํ์ธํธ)
| (Painting) |
+------------------+
|
v
+------------------+
| ํ๋ฉด ์ถ๋ ฅ |
| (Rendering) |
+------------------+
๋ฆฌํ๋ก์ฐ๋ฅผ ์ต์ํํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
- ์ผ๊ด ์ฒ๋ฆฌ (Batch Processing):
์ฌ๋ฌ DOM ์์์ ๋ํ ์คํ์ผ ๋ณ๊ฒฝ์ ํ ๋ฒ์ ์ฒ๋ฆฌ. ์์: ์คํ์ผ ์์ฑ์ ํด๋์ค์ ์ผ๊ด ์ ์ฉํ์ฌ ํ ๋ฒ์ ๋ณ๊ฒฝ.
์ฝ๋ ๋ณต์ฌ
// ์์: ์ฌ๋ฌ ์์์ ์คํ์ผ์ ๊ฐ๋ณ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋์ ํด๋์ค ๋ณ๊ฒฝ์ ํตํด ํ ๋ฒ์ ์ฒ๋ฆฌ
document.body.classList.add('new-style');
- ๊ฐ์ ์์ ์ฌ์ฉ:
:hover์ ๊ฐ์ ๊ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๋ฐ์. CSS ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ต์ํํ์ฌ Reflow๋ฅผ ์ค์.
/* ์์: ๊ฐ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ธํฐ๋์
์ฒ๋ฆฌ */
.button:hover {
background-color: blue;
}
- ํฌ๊ธฐ ๊ณ ์ :
์์์ ํฌ๊ธฐ๋ฅผ ๊ณ ์ ํ์ฌ ๋ ์ด์์ ๋ณ๊ฒฝ์ ์ต์ํ. ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋๋ ์์์๋ ์ฃผ์๊ฐ ํ์.
/* ์์: ์์์ ํฌ๊ธฐ๋ฅผ ๊ณ ์ */
.fixed-size {
width:auto; height:auto;
}