Webページのリフローと再描画
2043 ワード
リフロー(reflow):
HTML構造が変化すると、ブラウザは最新のDOM構造を再計算し、現在のページを再レンダリングする必要があります.
再描画(repaint):
要素の背景色、テキスト色、枠線色などを変更して、その周囲や内部レイアウトのプロパティに影響を与えない場合は、ブラウザは現在の要素を再レンダリングするだけです.
還流は避けられないものであり、還流による影響を以下の方法で低減することができます.
1.cssでは不要な複雑なセレクタ、特に子孫セレクタの使用は避けます.これは、セレクタに一致するためにより多くのパフォーマンスを消費するためです.
2.複雑な操作が頻繁に使用される場合、position:absolute/fixed位置決めを使用してみます.あるいはdisplay:noneは,ドキュメントストリームから離れて操作し,操作が完了してからドキュメントストリームに入る.
3.jsを使用して要素スタイルを変更する場合は、属性を変更するのではなくclassをできるだけ直接変更します.
4.より優れたデータバインド方式を採用
次のデータバインド方法を比較します.
①動的バインドが必要なコンテンツを1つずつページに追加
利点:元の要素には何の影響もありません
欠点:liを作成するたびに、ページに追加し、DOMの還流を開始し、最後に還流を開始する回数が多すぎて、パフォーマンスに影響します.
②文字列をつづり、最後にページに追加
利点:1回のリフローのみを開始
欠点:新しいつなぎ文字列をulに追加すると、元のliバインドのイベントが消えてしまいます.
③DocumentFragmentでは、DocumentFragmentノードはドキュメントツリーに属しません.DocumentFragmentノードをドキュメントツリーに挿入するように要求すると、DocumentFragment自体ではなく、そのすべての子孫ノードが挿入されます.この機能により、DocumentFragmentはプレースホルダとなり、ドキュメントを一度に挿入したノードを一時的に格納します.追加するコンテンツをfrgに保存し、ページに追加できます.
利点:1回のリフローのみで、元の方法には影響がなく、前の2つの方法よりもよく、データをバインドすることでページレンダリングを最適化できます.
HTML構造が変化すると、ブラウザは最新のDOM構造を再計算し、現在のページを再レンダリングする必要があります.
再描画(repaint):
要素の背景色、テキスト色、枠線色などを変更して、その周囲や内部レイアウトのプロパティに影響を与えない場合は、ブラウザは現在の要素を再レンダリングするだけです.
還流は避けられないものであり、還流による影響を以下の方法で低減することができます.
1.cssでは不要な複雑なセレクタ、特に子孫セレクタの使用は避けます.これは、セレクタに一致するためにより多くのパフォーマンスを消費するためです.
2.複雑な操作が頻繁に使用される場合、position:absolute/fixed位置決めを使用してみます.あるいはdisplay:noneは,ドキュメントストリームから離れて操作し,操作が完了してからドキュメントストリームに入る.
3.jsを使用して要素スタイルを変更する場合は、属性を変更するのではなくclassをできるだけ直接変更します.
4.より優れたデータバインド方式を採用
次のデータバインド方法を比較します.
①動的バインドが必要なコンテンツを1つずつページに追加
const ul = document.getElementById('ul')
for (let i = 0; i < arr.length; i++) {
let cur = arr[i];
let li = document.createElement('li');
li.innerHTML = ""+(i+1)+""+cur.title;
ul.appendChild(li);
}
利点:元の要素には何の影響もありません
欠点:liを作成するたびに、ページに追加し、DOMの還流を開始し、最後に還流を開始する回数が多すぎて、パフォーマンスに影響します.
②文字列をつづり、最後にページに追加
const ul = document.getElementById('ul')
let str = "";
for (let i = 0; i < arr.length; i++) {
let cur = arr[i];
str += "";
str += ""+(i+1)+"";
str += cur.title;
str += " "
}
ul.innerHTML += str;
利点:1回のリフローのみを開始
欠点:新しいつなぎ文字列をulに追加すると、元のliバインドのイベントが消えてしまいます.
③DocumentFragmentでは、DocumentFragmentノードはドキュメントツリーに属しません.DocumentFragmentノードをドキュメントツリーに挿入するように要求すると、DocumentFragment自体ではなく、そのすべての子孫ノードが挿入されます.この機能により、DocumentFragmentはプレースホルダとなり、ドキュメントを一度に挿入したノードを一時的に格納します.追加するコンテンツをfrgに保存し、ページに追加できます.
const ul = document.getElementById('ul')
let frg = document.createDocumentFragment();
for (let i = 0; i < arr.length; i++) {
let cur = arr[i];
let li = document.createElement('li');
li.innerHTML = ""+(i+1)+""+cur.title
frg.appendChild(li);
}
ul.appendChild(frg);
frg = null; //
利点:1回のリフローのみで、元の方法には影響がなく、前の2つの方法よりもよく、データをバインドすることでページレンダリングを最適化できます.