頻繁なリフローおよび再描画操作を回避する方法
リフローと再描画は、ブラウザーがページをレンダリングするときの 2 つの重要な操作です。リフローとはブラウザが DOM ツリーの変更に基づいて要素の位置とサイズを再計算することを指し、再描画は計算結果に基づいてページを再描画します。これら 2 つの操作は大量のコンピューティング リソースを消費し、ページのパフォーマンスの低下を引き起こします。したがって、Web ページのパフォーマンスを最適化するには、頻繁なリフローおよび再描画操作を回避することが重要です。
この記事では、頻繁なリフローおよび再描画操作を回避する効果的な方法をいくつか紹介し、具体的なコード例を示します。
サンプル コード:
// 不推荐的方式 element.style.left = '100px'; element.style.top = '200px'; element.style.width = '300px'; element.style.height = '400px'; // 推荐的方式 element.style.transform = 'translate(100px, 200px) scale(1.5)';
サンプルコード:
// 不推荐的方式 for (let i = 0; i < elements.length; i++) { const element = elements[i]; console.log(element.offsetWidth); } // 推荐的方式 const length = elements.length; for (let i = 0; i < length; i++) { const element = elements[i]; console.log(element.offsetWidth); }
サンプル コード:
// 创建虚拟DOM const virtualDOM = document.createElement('div'); virtualDOM.style.width = '200px'; virtualDOM.style.height = '300px'; // 批量批处理 for (let i = 0; i < 1000; i++) { const element = document.createElement('span'); element.innerText = 'Hello Virtual DOM'; virtualDOM.appendChild(element); } // 一次性更新真实DOM document.body.appendChild(virtualDOM);
サンプル コード:
// 节流方式 function throttle(fn, delay) { let timer = null; return function() { if (!timer) { timer = setTimeout(() => { timer = null; fn.apply(this, arguments); }, delay); } }; } // 防抖方式 function debounce(fn, delay) { let timer = null; return function() { clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, arguments); }, delay); }; } // 使用节流方式绑定事件 element.addEventListener('scroll', throttle(function() { // 处理滚动事件 }, 200)); // 使用防抖方式绑定事件 element.addEventListener('resize', debounce(function() { // 处理调整窗口大小事件 }, 200));
上記の方法により、頻繁なリフローおよび再描画操作を効果的に回避し、ページのパフォーマンスとユーザー エクスペリエンスを向上させることができます。開発プロセス中は、CSS 変換属性の合理的な使用、レイアウト属性へのアクセスの削減、バッチ処理での仮想 DOM の使用、スロットルおよび手ぶれ補正テクノロジの使用などに注意を払う必要があります。ページのレンダリング操作を慎重に最適化すると、ユーザーはより高速でスムーズなブラウジング エクスペリエンスを実現できます。
以上がリフローおよび再描画操作を減らすためのヒントと方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。