目次
リフローと再描画が発生するとどうなりますか?
DOM のマージ操作
DOM 操作の最適化
ノードの作成
ノードの検索
ノードの表示
ノードの移動
フラグメントを使用します
UI 操作の最適化

DOM_html/css_WEB-ITnose を最適化する

Jun 21, 2016 am 08:56 AM

DOM 最適化の本質は、実際には DOM ツリーのリフローと再描画を減らすことです。リフローと再描画の理解については、「フロントエンド知識の普及のための HTML」を参照してください。

DOM の構造の最適化は、参照の保存、アニメーションの最適化、ノードの保存、ノードの更新などの基本的な操作にすぎません。 。

インターネットで HTML を閲覧していたとき、多くの人 (子供) が異口同音に、DOM ノードを取得したら必ず保存する必要があると言っていたことを思い出します。そうしないと、結果は醜いものになります。

なぜ~なぜ~なぜ~

いわゆるjsが実際にはDOM、BOM、ECMAの組み合わせの産物であることは誰もが知っています。 元々、私の JS は非常に高速でしたが、会話するには DOM にアクセスする必要がありました。 どうすればいいでしょうか? ドアをノックして DOM が応答するのを待つしかありません~しかし、待ち時間は非常に長いです。

デモを見てみましょう。

var times=10000;var time1 = function(){   var time = times;  while(time--){  //DOM的两个操作放在循环内      var dom = document.querySelector("#Div1");      dom.innerHTML+="a";  }};var time2=function(){    var time = times,    dom = document.querySelector("#Div1");  while(time--){ //DOM的一个操作放在循环内     dom.innerHTML+="a";  }};var time3=function(){    var time = times,    dom = document.querySelector("#Div1"),    str = "";  while(time--){ //循环内不放置DOM的操作    str +="a";  }  dom.innerHTML=str;}console.time(1);  //设置时间起点time1();console.timeEnd(1);console.time(2);  //设置时间起点time2();console.timeEnd(2);console.time(3);  //设置时间起点time3();console.timeEnd(3);//测试结果为:1: 101.868ms2: 101.560ms3: 13.615ms
ログイン後にコピー

もちろん、これは単なる誇張された例です。DOM を頻繁に操作する場合は、次のことを覚えておいてください。保存するために。 さらに、保存する場合は、DOM 関連の操作をすべて保存する必要があります。

たとえば、style、innerHTML、その他の属性。

これを行う原則は、リフローと再描画の数を減らすことです。

リフローと再描画が発生するとどうなりますか?

リフローと再描画は通常どのような状況で発生しますか?リフローが発生します:

  1. 表示可能な DOM 要素の追加または削除

  2. 要素の位置の変更

  3. 要素のサイズ変更

  4. 要素の内容が変更されます (例: テキストが異なるサイズの別の画像に置き換えられます)

  5. ページ レンダリングの初期化 (これは不可避です) )

  6. ブラウザウィンドウのサイズ変更

一般に、ページのレイアウトやサイズが変更された場合でもリフローが発生します。再塗装はいつ行われますか? リフローが発生すると必ず再描画が発生しますが、再描画の範囲はリフローよりも若干大きくなります。たとえば、フォントの色、ページの背景色、その他の比較的「表面的な」操作のみを変更する場合、リフローは妨げられません。

DOM のマージ操作

次のように操作すると、

div.style.color="red";div.style.border="1px solid red";
ログイン後にコピー

ブラウザは 2 つの再配置を 1 つにスマートにマージし、リソースを節約します。 実際、関数スロットルの考え方はこれと似ています。

var throttle = (function(){    var time;    return function(fn,context){          clearTimeout(time);  //进行函数的节流        time = setTimeout(fn.bind(context),200);    }})()
ログイン後にコピー

この手法は通常、ブラウザのサイズを変更するときに使用されます。ただし、途中の場合は、offsetTop、clientTop などのプロパティにアクセスすると、すぐに実行されます。そうすれば、結果はあなたにとって何もありません。

div.style.color="red";  //积累一次重排记录var height = div.clientHeight;  //触发重排div.style.border="1px solid red";  //再次积累一次重排
ログイン後にコピー

現時点では、ブラウザはあなたに騙されています。 したがって、ちょっとした提案は、DOM 構造を変更したい場合は、すべてを一度に完了するのが最善であるということです。または、すべてを完了したい場合は、上記の CSS 変更は次のように行うこともできます

div.style.cssText="color:red;border:1px solid red"; //覆盖原来的cssdiv.classList.add("change"); //利用class来整体改动
ログイン後にコピー

DOM 操作の最適化

DOM 操作は単なる CRUD です。基本 API の簡単な紹介です

ノードの作成

var div = document.createELement("div");
ログイン後にコピー

ノードの検索

var divs = document.querySelectorAll('div'); //很多个,放在数组内var onlydiv = document.querySelector('div'); //只有一个//以及document.getElement系列
ログイン後にコピー

ノードの表示

var html = div.innerHTML; var outer = div.outerHTML;  //这两个是非常常用的var classNames = div.classList;var className = div.className;var tagName = div.tagName;var id = div.id;var style = div.getAttribute("style");//....
ログイン後にコピー

ノードの移動

ele.replaceChild(replace,replaced); //replace代替replaced//添加子节点ele.appendChild(child);//删除子节点ele.removeChild(child);//插入子节点ele.insertBefore(newEle,referenceEle);
ログイン後にコピー

わかりました~ 実際、上記の API は、DOM 操作を伴う限り再配置されます。したがって、ここで最適化できます。

フラグメントを使用します

バッチで子ノードを追加する必要がある場合は、フラグメントの仮想フラグメントをコンテナとして使用する必要があります。 100 個の p タグを追加する必要があります

var times = 100;var addP = function(){    var time = times,    tag1 = document.querySelector('#tag1');    while (time--) {        var p = document.createElement('p');        tag1.appendChild(p);    }}var useFrag = function(){    var time = times,    tag1 = document.querySelector('#tag1'),    frag = document.createDocumentFragment();    while (time--) {        var p = document.createElement('p');        frag.appendChild(p);    }    tag1.appendChild(frag);}console.time(1);addP();console.timeEnd(1);console.time(2);useFrag();console.timeEnd(2);//基本事件差为:1: 1.352ms2: 0.685ms
ログイン後にコピー

フラグメント フラグメントを使用することに加えて、innerHTML と externalHTML を使用して、関連する最適化操作を実行することもできます。ここでは詳細には触れません

UI 操作の最適化

ここで言いたいことはあまりありません。絶対レイアウトの使用方法を学ぶだけです。 関連する UI 操作を実行するときに、誤って全画面表示が発生する可能性があることは間違いありません。たとえば、キャンパスの中古街のレイアウトでは、下にスクロールするとヘッダーバーが拡大され、レイアウトが悪いとページ全体が再配置されます。 (バカ、バカ、バカ、バカ)

彼はここで違います。彼はレイアウトに直接絶対値を使用し、ドキュメントの流れから離れ、過剰なページの再配置を防ぎます。

最後に:

最適化への道は長いので、気をつけてください~

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

< Progress>の目的は何ですか 要素? < Progress>の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML< Progress>について説明します。要素、その目的、スタイリング、および< meter>との違い要素。主な焦点は、< Progress>を使用することです。タスクの完了と< Meter> statiの場合

< datalist>の目的は何ですか 要素? < datalist>の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML< Datalist>について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

< meter>の目的は何ですか 要素? < meter>の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html< meter>について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化< Meter> < Progress>およびex

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

HTML5< time>を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? HTML5< time>を使用するにはどうすればよいですか 日付と時刻を意味的に表す要素? Mar 12, 2025 pm 04:05 PM

この記事では、html5< time>について説明します。セマンティックデート/時刻表現の要素。 人間の読み取り可能なテキストとともに、マシンの読みやすさ(ISO 8601形式)のDateTime属性の重要性を強調し、Accessibilitを増やします

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

< iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? < iframe>の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、< iframe>外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

See all articles