Reflow μ Repaint
Interested in ReactJS, RxJS and ReasonML.
reflow
μ repaint
λ μμ λ λ λ νΈλ¦¬λ₯Ό λ€μ λ λλ§νλ κ³Όμ μμ λ°μνλ κ²μΌλ‘ μΉ μ ν리μΌμ΄μ
μ μ±λ₯μ λ¨μ΄λ¨λ¦¬λ μ£Όλ μμΈμ΄λ€. κ·Ήλ¨μ μΈ κ²½μ°, CSS ν¨κ³Όλ‘ μΈν΄ Java Script μ μ€ν μλκ° λλ €μ§ μλ μλ€.
Repaint
리νμΈνΈ
λ λ μ΄μμ
μλ μν₯μ μ£Όμ§ μμ§λ§, κ°μμ±μλ μν₯μ μ£Όλ μ리먼νΈκ° λ³κ²½λλ©΄ λ°μνλ€.
μλ₯Ό λ€λ©΄, opacity
, background-color
, visibility
, outline
μ€νλΌμ λ°λ₯΄λ©΄, βλΈλΌμ°μ κ° DOM νΈλ¦¬μ μλ λ€λ₯Έ λͺ¨λ λ Έλμ κ°μμ±μ νμΈν΄μΌ νλ―λ‘ λ¦¬νμΈνΈλ λΉμ©μ΄ λ§μ΄ λ λ€.βκ³ νλ€.
Reflow
β리νλ‘μ°βλ λͺ¨λ μ리먼νΈμ μμΉμ κΈΈμ΄ λ±μ λ€μ κ³μ°νλ κ²μΌλ‘ λ¬Έμμ μΌλΆ νΉμ μ 체λ₯Ό λ€μ λ λλ§νλ€.
λ¨μΌ μλ¦¬λ¨ΌνΈ νλλ₯Ό λ³κ²½ν΄λ, νμ μ리먼νΈλ μμ μλ¦¬λ¨ΌνΈ λ±μ μν₯μ λ―ΈμΉ μ μλ€.
리νλ‘μ°κ° νΈλ¦¬κ±°λλ κ²½μ°
- DOM μλ¦¬λ¨ΌνΈ μΆκ°, μ κ±° λλ λ³κ²½
-
CSS μ€νμΌ μΆκ°, μ κ±° λλ λ³κ²½
- CSS μ€νμΌμ μ§μ λ³κ²½νκ±°λ, ν΄λμ€λ₯Ό μΆκ°ν¨μΌλ‘μ¨ λ μ΄μμμ΄ λ³κ²½λ μ μλ€. μ리먼νΈμ κΈΈμ΄λ₯Ό λ³κ²½νλ©΄, DOM νΈλ¦¬μ μλ λ€λ₯Έ λ Έλμ μν₯μ μ€ μ μλ€.
-
CSS3 μ λλ©μ΄μ κ³Ό νΈλμ§μ
- μ λλ©μ΄μ μ λͺ¨λ νλ μμμ 리νλ‘μ°κ° λ°μνλ€.
-
offsetWidth μ offsetHeight μ μ¬μ©
- offsetWidth μ offsetHeight μμ±μ μ½μΌλ©΄, μ΄κΈ° 리νλ‘μ°κ° νΈλ¦¬κ±°λμ΄ μμΉκ° κ³μ°λλ€.
-
μ μ νλ
- μ μ μΈν°λμ
μΌλ‘ λ°μνλ
hover
ν¨κ³Ό, ννΈμ ν μ€νΈ μ λ ₯, μ°½ ν¬κΈ° μ‘°μ , κΈκΌ΄ ν¬κΈ° λ³κ²½, μ€νμΌμνΈ λλ κΈκΌ΄ μ νλ±μ νμ±ννμ¬ λ¦¬νλ‘μ°λ₯Ό νΈλ¦¬κ±°ν μ μλ€.
- μ μ μΈν°λμ
μΌλ‘ λ°μνλ
μ±λ₯ μ ν μ΅μννκΈ°
-
ν΄λμ€ λ³κ²½μ ν΅ν΄ μ€νμΌμ λ³κ²½ν κ²½μ°, μ΅λν λ§λ¨μ λ Έλμ ν΄λμ€λ₯Ό λ³κ²½νλ€.
- μ΅λν λ§λ¨μ μλ λ Έλλ₯Ό λ³κ²½ν¨μΌλ‘μ¨, 리νλ‘μ°μ μν₯μ μ΅μννλ€.
-
μΈλΌμΈ μ€νμΌμ μ¬μ©νμ§ μλλ€.
- μ€νμΌ μμ±μ ν΅ν΄ μ€νμΌμ μ€μ νλ©΄, 리νλ‘μ°κ° λ°μνλ€.
- μ리먼νΈμ ν΄λμ€κ° λ³κ²½λ λ μ리먼νΈλ νλμ 리νλ‘μ°λ§ λ°μμν¨λ€.
- μΈλΌμΈ μ€νμΌμ HTML μ΄ λ€μ΄λ‘λλ λ, λ μ΄μμμ μν₯μ λ―ΈμΉλ©΄μ μΆκ° 리νλ‘μ°λ₯Ό λ°μμν¨λ€.
-
μ λλ©μ΄μ μ΄ λ€μ΄κ° μ리먼νΈλ
position: fixed
λλposition: absolute
λ‘ μ§μ νλ€.absolute
λλfixed
μμΉμΈ μ리먼νΈλ λ€λ₯Έ μ리먼νΈμ λ μ΄μμμ μν₯μ λ―ΈμΉμ§ μλλ€. (리νλ‘μ°κ° μλ 리νμΈνΈκ° λ°μνλλ°, μ΄κ²μ ν¨μ¬ μ μ λΉμ©μ΄ λ λ€.)
-
λΆλλ¬μ΄ μ λλ©μ΄μ μ΄ μ±λ₯μ μ νμν¨λ€.
- ν λ²μ 1px μ© μ리먼νΈλ₯Ό μ΄λνλ©΄ λΆλλ¬μ 보μ΄μ§λ§, μ±λ₯μ΄ λ¨μ΄μ§λ λλ°μ΄μ€λ λ§μ½μΌ μ μλ€.
- μ리먼νΈλ₯Ό ν νλ μλΉ 4px μ© μ΄λνλ©΄ λ λΆλλ½κ² 보μ΄κ² μ§λ§, 리νλ‘μ° μ²λ¦¬μ
1/4
λ§ νμνλ€.
-
λ μ΄μμμ μν
<table>
μ νΌνλ€.<table>
μ μ μ§μ μΌλ‘ λ λλ§λμ§ μκ³ , λͺ¨λ λΆλ €μ§κ³ κ³μ°λ λ€μμμμΌ λ λλ§μ΄ λλ€. λν, μμ λ³κ²½λ§μΌλ‘λ ν μ΄λΈμ λ€λ₯Έ λͺ¨λ λ Έλμ λν 리νλ‘μ°κ° λ°μνλ€.- λ μ΄μμ μ©λκ° μλ λ°μ΄ν° νμ μ©λμ
<table>
μ μ¬μ©νλλΌκ³ ,table-layout: fixed
μμ±μ μ£Όλ κ²μ΄ μ’λ€.table-layout: fixed
λ₯Ό μ¬μ©νλ©΄, μ΄ λλΉκ° λ¨Έλ¦¬κΈ ν λ΄μ©μ κΈ°λ°μΌλ‘ κ³μ°λκΈ° λλ¬Έμ΄λ€.
-
CSS
μμ Java Script ννμμ μ¬μ©νμ§ μλλ€.- IE μ FF λ λͺ¨λ CSS μμ Java Script λ₯Ό μ€νν μ μλ€. IE μμλ νν κΈ°λ²κ³Ό HTC λμ λ°©λ²μ΄ μκ³ , FF μμλ XBL μ μ¬μ©νλ λ°©λ²μ΄ μλ€. (μ΄ λ°©λ²μ CSS μμ Java Script λ₯Ό μ§μ μ€ννμ§λ μμ§λ§, κ·Έ ν¨κ³Όλ λμΌνλ€.)
- λ¬Έμκ° λ¦¬νλ‘μ°λ λλ§λ€ Java Script ννμμ΄ λ€μ κ³μ°λλ€.
-
CSS νμ μ λ ν°λ₯Ό μ΅μννλ€.
- μ¬μ©νλ κ·μΉμ΄ μ μμλ‘ λ¦¬νλ‘μ°κ° λΉ λ₯΄λ€.
gulp-uncss
,grunt-uncss
μ κ°μ λκ΅¬λ‘ μ€νμΌ μ μ λ° νμΌ ν¬κΈ°λ₯Ό μ€μΈλ€.
-
μ¨κ²¨μ§ μ리먼νΈλ₯Ό λ³κ²½νλ€.
display: none;
μΌλ‘ μ¨κ²¨μ§ μ리먼νΈλ λ³κ²½λ λ, 리νμΈνΈλ 리νλ‘μ°λ₯Ό μΌμΌν€μ§ μλλ€. κ·Έλ κΈ° λλ¬Έμ μ리먼νΈλ₯Ό νμνκΈ° μ μ μ리먼νΈλ₯Ό λ³κ²½νλ€.
-
Java Script λ₯Ό ν΅ν΄ μ€νμΌμ λ³κ²½ν κ²½μ°,
.cssText
λ₯Ό μ¬μ©νκ±°λ, ν΄λμ€λ₯Ό λ³κ²½νλ€.
var el = document.getElementById('reflow-test');
el.style.padding = '8px';
el.style.width = '320px';
el.style.height = '240px';
// 3 λ²μ 리νλ‘μ° λ°μ
/////////
var el = document.getElementById('reflow-test');
el.style.cssText = 'padding: 8px; width: 320px; height: 240px;';
/* or */
el.className = 'changed';
// 1 λ²μ 리νλ‘μ° λ°μ
/**
* Style of `changed` class
* .changed {
* padding: 8px;
* width: 320px;
* height: 240px;
* }
*/
-
Java Script λ₯Ό ν΅ν΄ 리μ€νΈλ₯Ό μΆκ°νλ κ²½μ°, DOM Fragment λ₯Ό ν΅ν΄ μΆκ°νλ€.
- 3 κ°μ 리μ€νΈλ₯Ό μΆκ°νλ κ²½μ°, ν λ²μ νλμ© μΆκ°νλ©΄ μ΅λ 7 κ°μ 리νλ‘μ°κ° λ°μνλ€.
<ul>
μ΄ μΆκ°λ λ
<li>
μ λν΄ 3λ²
ν μ€νΈ λ Έλμ λν΄ 3λ²
- 3 κ°μ 리μ€νΈλ₯Ό μΆκ°νλ κ²½μ°, ν λ²μ νλμ© μΆκ°νλ©΄ μ΅λ 7 κ°μ 리νλ‘μ°κ° λ°μνλ€.
const frag = document.createDocumentFragment();
const ul = frag.appendChild(document.createElement('ul'));
for (let i = 1; i <= 3; i++) {
li = ul.appendChild(document.createElement('li'));
li.textContent = `item ${ i }`;
}
document.body.appendChild(frag);
-
μΊμ¬λ₯Ό νμ©ν Reflow μ΅μν.
- λΈλΌμ°μ λ λ μ΄μμ λ³κ²½μ νμ μ μ₯νλ€κ° ν λ²μ μ€νν¨μΌλ‘μ¨ λ¦¬νλ‘μ°λ₯Ό μ΅μννλλ°, offset, scrollTop κ³Ό κ°μ κ³μ°λ μ€νμΌ μ 보λ₯Ό μμ²ν λλ§λ€ μ νν μ 보λ₯Ό μ 곡νκΈ° μν΄ νλ₯Ό λΉμ°κ³ , λͺ¨λ λ³κ²½μ λ€μ μ μ©νλ€.
- μ΄λ₯Ό μ΅μννκΈ° μν΄ μμΉμ λν μ€νμΌ μ 보λ₯Ό λ³μμ μ μ₯νμ¬ μ 보 μμ² νμλ₯Ό μ€μμΌλ‘μ¨ λ¦¬νλ‘μ°λ₯Ό μ΅μννλ€.
// Bad practice
for (let i = 0; i < len; i++) {
el.style.top = `${ el.offsetTop + 10 }px`;
el.style.left = `${ el.offsetLeft + 10 }px`;
}
// Good practice
let top = el.offsetTop, left = el.offsetLeft, elStyle = el.style;
for (let i = 0; i < len; i++) {
top += 10;
left += 10;
elStyle.top = `${ top }px`;
elStyle.left = `${ left }px`;
}
-
λΈλΌμ°μ λκ΅¬λ‘ λ¦¬νμΈνΈ μ΄μ λΆμνκΈ°
- λͺ¨λ μ£Όλ₯ λΈλΌμ°μ λ 리νλ‘μ°κ° μ±λ₯μ λ―ΈμΉλ μν₯μ 보μ¬μ£Όλ [νμλΌμΈ] λꡬλ₯Ό μ 곡νλ€.
IE
μ κ²½μ°μλdynaTrace AJAX Edition
,Webkit Browser
μ κ²½μ°μλGoogle Chrome SpeedTracer
κ° μλ€.