リフロー (レイアウト または 再レイアウト とも呼ばれます) は、ブラウザーがページ上の要素の位置、サイズ、レイアウトを再計算するときに発生します。このプロセスは、要素の追加、削除、サイズ変更、表示設定の変更など、ページのレイアウトが変更されるたびに実行されます。より複雑で時間のかかる操作です
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> const box = document.getElementById('box'); // Triggering a reflow by changing width and height box.style.width = '200px'; box.style.height = '200px'; // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
ページのレイアウトに影響する何かを変更する場合、ブラウザは次のことを行う必要があります:
1 つの変更によって多くの要素が影響を受ける場合、リフローにコストがかかり、サイトのパフォーマンスが低下する可能性があります。
再描画 (または 再描画) は、要素の視覚的なプロパティは変更されるが、レイアウトは変更されない場合に発生します。要素の位置やレイアウトを再計算せずに要素の外観を更新するだけで済むため、リフローよりもコストが低くなります。再描画は、レイアウトが再計算された後 (両方が必要な場合)、または色や可視性など、レイアウトに影響しないプロパティが変更されたときに行われます。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
再描画にはレイアウトの再計算が含まれないため、リフローよりも高速ですが、それでもページの一部を再描画する必要があるため、時間がかかります。
DOM 操作を最小限に抑える : DOM 更新のバッチ処理 (前述) や DocumentFragment などのテクニックを使用して、複数の変更を一度に行うのではなく、一つ一つ。
レイアウト スラッシングを避ける : レイアウト プロパティ (offsetHeight など) を読み取り、同じサイクルですぐに書き込む (レイアウトを変更する) と、レイアウト スラッシングとして知られるリフローが強制されます。これを回避するには、DOM プロパティの読み取りと書き込みを別の手順で分離します。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> const box = document.getElementById('box'); // Triggering a reflow by changing width and height box.style.width = '200px'; box.style.height = '200px'; // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
CSS クラスを使用する : 個々のスタイルを変更する代わりに、CSS クラスを使用して変更を加えます。ブラウザはクラス切り替えをより効率的に処理します。
<div id="box" style="width: 100px; height: 100px; background-color: blue;"></div> <script> // Triggering a repaint by changing the background color box.style.backgroundColor = 'red'; </script>
CSS の複雑さを軽減します: リフローを引き起こす可能性のある、深くネストされた要素や過度に複雑な CSS ルールを避けます。
レイアウトに影響を与えずに要素を非表示にするだけの場合は、display: none の代わりに Visibility: hidden を使用します。 display: none はリフローをトリガーしますが、visibility: hidden は再ペイントのみをトリガーします。
以上がJavaScript でのリフローと再ペイントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。