パフォーマンスの最適化


パフォーマンスの最適化

消費量の多いスタイルを慎重に選択してください

消費量の多い属性では、描画前にブラウザで多くの計算を実行する必要があります:

  • box-shadows

  • border-radius

  • 透明性

  • 変換

  • CSSフィルター(パフォーマンスキラー)

過剰なリフローを避ける

リフローが発生すると、ブラウザはレイアウトの位置とサイズ、詳細を再計算する必要があります。

一般的なリフロー要素:

  • 高さ

  • パディング

  • マージン

  • 表示

  • ボーダー幅

  • ポジション

  • トップ

  • font-size

  • float

  • text-align

  • overflow-y

  • フォントの太さ

  • オーバーフロー

  • フォントファミリー

  • 行の高さ

  • vertical-align

  • clear

  • white-space

  • min-height

ディスプレイを正しく使用する 属性

Display 属性はページのレンダリングに影響します。合理的に使用してください。

  • display: 幅、高さ、マージン、パディング、float は inline-block の後に使用しないでください。

  • display: ブロックの後には使用しないでください。

  • display: table-* は margin や float の後に使用しないでください。

  • Float を乱用しないでください

  • Float はレンダリング中に大量の計算を行うため、できるだけ使用しないでください。

アニメーションパフォーマンスの最適化

アニメーションの実装原理は、人間の目の「視覚の持続」現象を利用して、短時間に複数の静止画を連続的に再生することで、肉眼に錯覚を引き起こすことです。残像を視覚化し、画像を「動き」として誤って見てしまいます。

アニメーションの基本概念:

フレーム: アニメーションプロセス中、各静止画は「フレーム」です。

  • フレームレート: つまり、1秒あたりに再生される静止画の数、単位はfpsです。 (フレーム/秒);

  • フレーム継続時間: 各静止画の滞留時間、単位は通常 ms (ミリ秒) です。

  • フレーム スキップ (フレーム ドロップ/ドロップ フレーム): フレーム レートアニメーションでは、特定のフレームの継続時間が平均フレーム継続時間よりも大幅に長くなるため、後続のフレームが圧迫されて失われます。

  • 一般的なブラウザのレンダリングリフレッシュレートは60fpsな​​ので、Webページではフレームレート50〜60fpsのアニメーションがかなり滑らかで快適になります。

JavaScript ベースのアニメーションを使用する場合は、setTimeout、setInterval の使用を避けて、requestAnimationFrame を使用するようにしてください。

  • CSS を使用してアニメーションを宣言することは避けてください。サーバーの最適化のために。

  • 絶対位置決めの代わりに移動を使用すると、fps が向上し、アニメーションがよりスムーズになります。

3D 変形を通じて GPU アクセラレーションをオンにするなど、より多くのハードウェア機能を使用します

一般的に Chrome では、3D または透視変換 (パースペクティブ変換) CSS プロパティと不透明度の CSS アニメーションが新しいレイヤーを作成し、ハードウェア アクセラレーションによるレンダリングが行われます。チャネルの最適化では、GPU が 3D 変形などの操作を完了した後、ブラウザーの大規模な再描画や再配置のトリガーを避けるために複合操作 (Compesite Layers) を実行します。

注: 3D 変形はより多くのメモリと電力を消費します。

translate3d を使用して右に 500 ピクセル移動するアニメーションの滑らかさは、左を直接使用するよりも大幅に優れています:

.ball-1 {
  transition: -webkit-transform .5s ease;
  -webkit-transform: translate3d(0, 0, 0);
}
.ball-1.slidein{
  -webkit-transform: translate3d(500px, 0, 0);
}
.ball-2 {
  transition: left .5s ease; left:0;
}
.ball-2.slidein {
  left:500px;
}

CSS セレクターのパフォーマンスの向上

CSS セレクターのパフォーマンスへの影響は、セレクターとドキュメント要素には時間がかかるため、セレクターを最適化する原則は、より多くのマッチング時間を消費するセレクターの使用を避けることです。その前に、サブセレクター ルールなどの CSS セレクター マッチング メカニズムを理解する必要があります。

#header > a {font-weight:blod;}

私たちのほとんどは左から右に読み、マッチング ルールが右から実行されるように習慣的にブラウザを設定します。このルールのコストは高くないと推測されます。

ブラウザが次のように動作すると仮定します。ID ヘッダーを持つ要素を検索し、直接の子要素内の a 要素にスタイル ルールを適用します。ドキュメント内に id ヘッダーを持つ要素は 1 つだけあり、a 要素の子はいくつかしかないことがわかっているため、この CSS セレクターは非常に効率的であるはずです。

実際はその逆で、CSS セレクターはルールを右から左に照合します。このメカニズムを理解すると、この例の一見効率的なセレクターは、実際には非常に高いマッチング コストを伴うことがわかります。ブラウザーはページ内のすべての a 要素を走査し、その親要素の ID がヘッダーであるかどうかを判断する必要があります。

例の子セレクターを子孫セレクターに変更すると、ページ内のすべての要素を走査した後、その上位要素をルート ノードまで走査する必要があり、コストが高くなります。

#header  a {font-weight:blod;}

CSS セレクターが右から左に一致するメカニズムを理解した後、現在のセレクターの左側に他のセレクターがある限り、スタイル システムは、一致するセレクターが見つかるまで左に移動し続けることがわかりました。ルールに一致するか、一致しない場合は終了します。一番右のセレクターをキーセレクターと呼びます。 ——詳細

1. ユニバーサル セレクターの使用を避ける

/* Not recommended */
.content * {color: red;}

ドキュメント内のすべての要素を照合した後、ブラウザーはドキュメントのルート ノードまでのクラス コンテンツと要素を照合します。したがって、マッチングのオーバーヘッドが非常に大きくなるため、ワイルドカード セレクターであるキー セレクターの使用は避けてください。

2. ID セレクターを制限するためにタグやクラス セレクターを使用しないでください

/* Not recommended */
button#backButton {…}
/* Recommended */
#newMenuIcon {…}

3. クラス セレクターを制限するためにタグを使用しないでください

/* Not recommended */
treecell.indented {…}
/* Recommended */
.treecell-indented {…}
/* Much to recommended */
.hierarchy-deep {…}

4. 多層タグ セレクターを使用しないでください。 CSS 検索を減らすためにクラス セレクターの置換を使用します

/* Not recommended */
treeitem[mailfolder="true"] > treerow > treecell {…}
/* Recommended */
.treecell-mailfolder {…}

5. サブセレクターの使用を避ける

/* Not recommended */
treehead treerow treecell {…}
/* Recommended */
treehead > treerow > treecell {…}
/* Much to recommended */
.treecell-header {…}

6. 継承を使用します

/* Not recommended */
#bookmarkMenuItem > .menu-left { list-style-image: url(blah) }
/* Recommended */
#bookmarkMenuItem { list-style-image: url(blah) }