Web ページのレンダリングについて、フロントエンド担当者が知っておくべきこと_html/css_WEB-ITnose
ブラウザはどのように Web ページをレンダリングしますか?
ブラウザがページをレンダリングする動作から始めましょう:
-
サーバーから取得した HTML ドキュメントから DOM ツリー (ドキュメント オブジェクト モデル) を構築します。 >
- スタイルが読み込まれて分析され、CSSOM (CSS Object Model) が構築されます。
- DOM と CSSOM に基づいてドキュメント ツリーが構築されます。一連のオブジェクトがレンダリングされます (Webkit ではそれぞれを「レンダラー」または「レンダー オブジェクト」と呼び、Gecko では「フレーム」と呼びます)。レンダー ツリーには、非表示の要素 (、display:none) を除くすべての要素が反映されます。外部 DOM 構造内のすべての表示要素と文字列は、レンダリング ツリー内の独立したレンダリング オブジェクトとして扱われます。各レンダリング オブジェクトは、対応する DOM 構造と計算されたスタイルの混合物です。つまり、レンダリング ツリーは DOM の視覚的表現です。 Tree;
- 各レンダリング ツリー要素の座標が計算によって取得されます。これをレイアウト (レイアウト) と呼び、ブラウザーはドキュメント ウェイ (つまり、レイアウト) を介して流れます。すべての要素は一度に完了できます) (テーブルには複数のレイアウトが必要です);
- 最終的なレンダリング ツリーがブラウザ ウィンドウに表示されます。このプロセスはペイントと呼ばれます。
再描画
要素スタイルの変更が Web ページ上の要素の位置 (背景色、境界線の色、可視性) に影響しない場合、ブラウザは新しいスタイルを適用するだけです。要素に。
リフロー
リフロー (再レイアウト) は、変更が
ドキュメントのコンテンツや構造、要素の位置 に影響を与える場合に発生します。これは通常、以下によって引き起こされます:
- DOM 操作 (要素の追加、削除、変更、または順序の変更);
- コンテンツの変更 (テーブル領域内のテキストの変更を含む) ) (占有位置サイズが変更されました);
- CSS プロパティを計算または変更します (位置変更);
- スタイル シートを追加または削除します。 >
-
-
-
ブラウザーは次のように制限されます。変更された要素が配置されている領域の再配置と再描画が可能です。たとえば、display:fixed/absolute 要素が変更されると、それ自体とその子要素にのみ影響しますが、display:static 要素が変更されると、後続のすべての要素に影響します。要素は再描画されます (できるだけ少ない要素に影響します)
パフォーマンスを最大化するためのもう 1 つのメカニズムは、一連の JavaScript スニペットを実行するときに、ブラウザーがそれらをキャッシュしてからすべてを一度に実行することです。次の例を見るとよく理解できます:
ただし、すでに上で述べたように、
var $body = $('body');$body.css('padding', '1px'); // reflow, repaint$body.css('color', 'red'); // repaint$body.css('margin', '2px'); // reflow, repaint// only 1 reflow and repaint will actually happen(由于缓存,只会重绘一次)
したがって、2 つのリフローが発生するため、パフォーマンスを最大化するために要素の属性を読み取るために結合する必要があります。
var $body = $('body');$body.css('padding', '1px');$body.css('padding'); // reading a property, a forced reflow(强制发生)$body.css('color', 'red');$body.css('margin', '2px');//另外一次reflow
場合によっては、例: マージン左を同じオブジェクトに 2 回適用する必要があります。最初はアニメーションなしで 100 ピクセルに設定され、次にアニメーションによって 50 ピクセルに遷移します。
$(function() { var $body = $('body'); $body .on('click', '.block-1', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-2', function(e) { // 2 reflows $body.css('padding', '1px'); $body.css('padding'); $body.css('color', 'red'); $body.css('margin', '2px'); }) .on('click', '.block-3', function(e) { // 3 repaints $body.css('color', 'red'); $body.css('color'); $body.css('color', 'yellow'); $body.css('background'); $body.css('color', 'blue'); $body.css('outline'); }) .on('click', '.block-4', function(e) { // 1 repaint $body.css('color', 'red'); $body.css('color', 'yellow'); $body.css('color', 'blue'); $body.css('color'); $body.css('background'); $body.css('outline'); }) .on('click', '.block-5', function(e) { // 3 reflows $body.css('padding', '1px'); $body[0].offsetHeight; $body.css('padding', '2px'); $body[0].offsetTop; $body.css('padding', '3px'); $body[0].offsetWidth; }) .on('click', '.block-6', function(e) { // 1 reflow $body.css('padding', '1px'); $body.css('padding', '2px'); $body.css('padding', '3px'); $body[0].offsetHeight; $body[0].offsetTop; $body[0].offsetWidth; });});
トランジション アニメーション:
プロセス コード:
.has-transition { -webkit-transition: margin-left 1s ease-out; -moz-transition: margin-left 1s ease-out; -o-transition: margin-left 1s ease-out; transition: margin-left 1s ease-out;}
変更がキャッシュされて最後に実行されるため、上記のコードは期待どおりに動作しません。一度、今度は強制実行が必要です。 :
// our element that has a "has-transition" class by defaultvar $targetElem = $('#targetElemId');// remove the transition class$targetElem.removeClass('has-transition');// change the property expecting the transition to be off, as the class is not there// anymore$targetElem.css('margin-left', 100);// put the transition class back$targetElem.addClass('has-transition');// change the property$targetElem.css('margin-left', 50);
これで期待した効果が得られました。
// remove the transition class$(this).removeClass('has-transition');// change the property$(this).css('margin-left', 100);// trigger a forced reflow, so that changes in a class/property get applied immediately$(this)[0].offsetHeight; // an example, other properties would work, too// put the transition class back$(this).addClass('has-transition');// change the property$(this).css('margin-left', 50);
いくつかの役立つ情報を要約したこの記事には、次の提案があります
有効な HTML と CSS を構築することを忘れないでください。ドキュメントのコーディング メソッドを宣言します。スタイル シートは タグに含める必要があり、スクリプト ファイルは
-
- ブラウザはセレクターを右から左に読み取るので、一番右のセレクターはより効率的な #id,.class を選択する必要があることに注意してください
#id.classdiva+iul>li*input[type='text']a:hover
ログイン後にコピー
div * {...} // bad.list li {...} // bad.list-item {...} // good#list .list-item {...} // good
-
在脚本中,应该尽可能的减少DOM操作,如果对象和属性会被重用,就缓存它们。在最好离线元素(未被插入文档树)(offline)上进行操作,然后把它插入DOM结构中;
-
如果使用jQuery,遵循[jQuery选择器基本原则( http://learn.jquery.com/performance/optimize-selectors/);
-
修改元素的样式时,修改class属性是做好的方法,其位置越深,越好(also because this helps decouple logic from presentation);
-
只使 display:fixed/absolute的元素具有动画;
-
不适用复杂的 :hover动画也是一个好的实践(给
添加 no-hover属性), 延展阅读;
延展阅读已获得更多信息:
-
How browsers works;
-
Rendering: repaint, reflow/relayout, restyle;
希望这边译文对您有用
原文链接

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

Y軸位置Webアノテーション機能の適応アルゴリズムこの記事では、単語文書と同様の注釈関数、特に注釈間の間隔を扱う方法を実装する方法を探ります...

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

画像をクリックした後、散乱と周囲の画像を拡大する効果を実現するには、多くのWebデザインがインタラクティブな効果を実現する必要があります。特定の画像をクリックして周囲を作成してください...

HTML、CSS、およびJavaScriptは、Web開発の3つの柱です。 1。HTMLは、Webページ構造を定義し、などなどのタグを使用します。2。CSSは、色、フォントサイズなどのセレクターと属性を使用してWebページスタイルを制御します。
