ホームページ > ウェブフロントエンド > htmlチュートリアル > フロントエンドのパフォーマンスについて知っておくべきこと: Reflow と Repaint_html/css_WEB-ITnose

フロントエンドのパフォーマンスについて知っておくべきこと: Reflow と Repaint_html/css_WEB-ITnose

WBOY
リリース: 2016-06-24 11:15:43
オリジナル
1355 人が閲覧しました

モバイル Web フロントエンド開発は現在非常に人気があり、これ以上人気が高まることはありません。 H5 エンジニアとハイブリッド アプリ開発エンジニアはどこでも採用されており、彼らの主な責任は実際にはモバイル Web フロントエンド開発作業です。フロントエンドの経験がある人なら誰でも、携帯電話のオーバーヘッドが PC よりもはるかに大きいことを知っています。PC シミュレータではスムーズにデバッグできますが、携帯電話を使用するとフリーズしてしまいます。実際、これはパフォーマンスの問題です。コンピューティング リソースを占有する他のオーバーヘッドがあります。では、どのオーバーヘッドが占有しているのでしょうか。バックエンド インターフェイスの遅さ、ネットワークの状態の悪さなどはさておき、今日はブラウザ自体、リフローと再ペイントの詳細について話しましょう。特にCSS3アニメーションを追加したり、複数のDOM要素を一括操作したりする場合、リフローやリペイントの影響はさらに大きくなります。

リフローとリペイントとは

リペイント

リペイントは「再描画」であり、DOM要素の視覚効果を変更するときに実行され、レイアウトを変更するときにトリガーされません。たとえば、不透明度、背景色、可視性、アウトラインはすべてトリガーされますが、DOM 要素の視覚効果が変更された後、ブラウザは DOM 要素内のすべてのノードをチェックするため、「再描画」のコストは依然として比較的高くなります。

リフロー

リフローは「再流動」であり、その影響はさらに大きいです。これは、特定の DOM 要素の位置が変更された後にトリガーされ、すべての要素の位置と、ページ上でそれらが占める領域を再計算します。これにより、ページの特定の部分またはページ全体が再計算されます。 -レンダリングされました。要素を変更すると、そのすべての子、祖先、兄弟に影響します。

リフローとリペイントは両方ともブラウザを遅くする原因です

リフローとリペイントが実行されると、ユーザーも Web ページも操作を実行したり応答したりできなくなり、極端な場合には CSS によって JS の実行速度が遅くなります。これは、操作後にブラウザが応答しなくなる場合がある理由の 1 つです。

リフローはいつトリガーされますか?

リフローはコストが高いため、いつリフローがトリガーされますか?

  • DOM 要素の追加、削除、または表示/変更を行うとき: JS を使用して DOM 要素を変更すると、リフローがトリガーされます。

  • CSS スタイルの追加、削除、変更: CSS スタイルまたは要素のクラスを直接変更するとレイアウトに影響する可能性があり、要素の幅を変更すると、その要素が配置されている DOM ノード内のすべての要素に影響する可能性があります。その周りの要素。

  • CSS3 アニメーションとトランジション: アニメーションの各フレームでリフローがトリガーされます。

  • offsetWidth と offsetHeight を使用する: これは非常に特殊で、DOM の offsetWidth プロパティと offsetHeight プロパティを読み取ると、リフローもトリガーされます。これは、これら 2 つのプロパティを計算するためにいくつかの要素に依存する必要があるためです。

  • ユーザー インタラクション: ユーザーは、リンクにカーソルを置く、入力にテキストを入力する、ブラウザのサイズをドラッグする、フォント サイズを変更する、スタイル シートやフォントを変更するなどを行うと、リフローがトリガーされます。

パフォーマンスを向上させるために一般的に使用されるいくつかの原則

レイアウト

インライン スタイルやテーブル レイアウトは使用しないでください。フレックスボックス レイアウトもパフォーマンスにいくつかの小さな問題を引き起こします。インライン スタイルでは、HTML のダウンロード後に追加のリフローが実行されます。テーブル レイアウトのオーバーヘッドは、他の DOM 要素よりもはるかに大きくなります。 HTML がダウンロードされた後、Flexbox アイテムのサイズが変更されます。

省略された CSS

CSS を省略してみてください。複雑な CSS セレクターの使用を避け、未使用の CSS (https://unused-css.com/)、uCSS (https://github.com/oyvindeh/ucss)、gulp を使用してください。 uncss (https://github.com/ben-eb/gulp-uncss) は、スタイル定義とファイル サイズを効果的に削減できます。

DOM を最適化する

DOM のレベルを下げ、DOM の数を減らします。古いブラウザに適応する必要がない場合は、不要なラッパー DOM 要素を削除します。

クラスの変更は慎重に行ってください

DOM ツリーでは、DOM 内に特に多数の子要素を持たないクラスを変更するようにしてください。子要素が少ないクラスは変更できますが、多くは推奨されません。

複雑なアニメーションを避ける

複雑なアニメーションを使用する要素は、可能な限りposition:absoluteまたはposition:fixedにする必要があります。これにより、それらがドキュメントフローから外され、他の要素に影響を与えなくなります。

display:none を上手に活用してください

display:none を持つ要素は、リフローや再ペイントをトリガーしません。これらの要素を表示する前に、色やサイズなどの変更を加えることができます。

要素をバッチで更新します

たとえば、次の例ではリフローを 3 回トリガーします:

上記のコードは次の方法で最適化できます:

さらに、新しい DOM を生成するときに DOM フラグメントを使用することもできます。そして最初にメモリ内に DOM を構築します:

デモ

別の例を以下に示します。1 つ目は、1000 div をページにバッチで挿入するものです。2 つ目は、1000 div を 1 つずつページに挿入します。 。実際、この 2 つの間のパフォーマンスの差は、Chrome の最新バージョンでは 1 秒ほどです。これはまだ最新バージョンの Chrome なので、JS を作成するときはもう心配する必要はありません。これは複雑なネストを持たない単なる div であり、これが正式なシナリオで使用されると、この種のパフォーマンスの問題が数倍に拡大し、製品にとって致命的になるとは言いません。もう、バーを体験してみましょう。図からわかるように、リフローとペイントはそれぞれ 1 回ずつ実行され、1118 ミリ秒かかります。図からわかるように、Parse HTML と呼ばれるものが蓄積され、この Parse HTML は、実際には Paint と Reflow を組み合わせたもので、Chrome のアルゴリズムの名前です。

多数の DOM が相互作用するのを避けてください

たとえば、タブのようなシナリオでは、タブをクリックすると、そのタブが制御するブロックが表示され、そのブロックが他のブロックに影響を与えます。高さが異なるため、リフローが発生する可能性があります。このシナリオは高さを設定することで最適化できます。

パフォーマンスはかっこよさよりも常に重要です

ウェブページのアニメーションがどれほど素晴らしくても、フレームごとに 1 ピクセル移動することでページがフリーズする場合は、パフォーマンスを優先するという原則を覚えておいてください。毎回フレームを 10 ピクセルずつ移動すると、ページのパフォーマンスが低下することなく、アニメーション フレームが遅くなります。

上の画像を長押しすると、抱き合うサルをフォローできます

この記事の著者: Chang Ming

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート