[解決済み] なぜブラウザはCSSセレクタを右から左へマッチングさせるのですか?
質問
CSSセレクタは、ブラウザエンジンによって右から左へと照合されます。そのため、まず子を見つけ、次にその親をチェックして、ルールの残りの部分と一致するかどうかを確認します。
- これはなぜでしょうか?
- 仕様に書いてあるからということでしょうか?
- 左から右へ評価された場合、最終的なレイアウトに影響を与えますか?
一番シンプルな方法は、要素の数が少ないセレクタを使うことだと思います。つまり、まずID(1つの要素しか返さないはずなので)。たとえば、ページにはスパンが1つしかないので、スパンを参照するルールでは、そのノードに直接アクセスします。
以下は私の主張を裏付けるリンクです。
- http://code.google.com/speed/page-speed/docs/rendering.html
- https://developer.mozilla.org/en/Writing_Efficient_CSS
1つの子の親をすべて見るのではなく、親の子をすべて見る(多数になる可能性がある)ことを避けるために、このような方法をとっているように思えますが、いかがでしょうか。たとえDOMが深くても、RTLマッチングでは1階層につき複数のノードを見るのではなく、1つのノードを見るだけです。 CSSセレクタの評価はLTRとRTLのどちらが簡単/速いですか?
どのように解決するのですか?
ブラウザがセレクタ マッチングを行うときは、1 つの要素(スタイルを決定しようとしている要素)とすべてのルールとそのセレクタがあり、どのルールがその要素に一致するかを見つける必要があることに留意してください。 これは、たとえば、セレクタが 1 つしかなく、そのセレクタに一致するすべての要素を見つける必要がある、通常の jQuery の場合とは異なります。
セレクタが1つだけで、そのセレクタと比較する要素が1つだけなら、左から右への方が理にかなっている場合があります。 しかし、それは明らかに
ではない
ブラウザの状況です。 ブラウザはGmailなどをレンダリングしようとしていて、1つの
<span>
Gmail がスタイルシートに記述している 10,000 以上のルール(この数は作り話ではありません)に従ってスタイルを設定しようとしています。
特に、ブラウザが検討しているセレクタのほとんどを見ている状況において しない は当該要素にマッチします。 そのため、セレクタがマッチしないことをできるだけ速く判断することが問題になります。マッチするケースで少し余分な作業が必要になったとしても、マッチしないケースで節約したすべての作業により、勝てるのです。
セレクタの右端を要素にマッチングさせることから始めると、マッチングしない可能性が高いので、その時点で終了となります。 マッチした場合はさらに作業が増えますが、ツリーの深さに比例するだけなので、ほとんどの場合はそれほど大きくはありません。
一方、セレクタの左端からマッチングを始めるとしたら......何とマッチングさせるのでしょうか? DOMを歩き回り、マッチしそうなノードを探さなければなりません。 その左端にマッチするものがないことを発見するだけでも、しばらく時間がかかるかもしれません。
そのため、ブラウザは右からマッチングを行います。これにより、出発点が明確になり、セレクタの候補のほとんどをすばやく取り除くことができます。 次のサイトで、いくつかのデータを見ることができます。 http://groups.google.com/group/mozilla.dev.tech.layout/browse_thread/thread/b185e455a0b3562a/7db34de545c17665 (表記がわかりにくいですが)、特に2年前のGmailでは、(ルール、要素)のペアの70%は、ルールの右端のセレクタのタグ/クラス/ID部分を調べるだけで、ルールがマッチしないと判断できたということです。 Mozilla の pageload パフォーマンス テスト スイートの対応する数値は 72% でした。 ですから、すべてのルールのうち2/3をできるだけ早く削除し、残りの1/3のマッチングだけを気にするようにすることは、本当に価値があることです。
また、確実にマッチしないルールにマッチしようとするのを避けるために、ブラウザがすでに行っている最適化があることにも注意してください。 たとえば、一番右のセレクタが ID を持ち、その ID が要素の ID と一致しない場合、Gecko ではそのセレクタをその要素に対してマッチさせる試みはまったく行われません。 つまり、これは、その要素にマッチする可能性がかなり高いルールの70%になります。 今も は、右端のセレクタのタグ/クラス/IDだけを考慮してもマッチしません。
関連
-
[解決済み] ChromeでCSSカスタムスタイルのボタンから青枠を削除する
-
[解決済み] CSSのクラス名/セレクタに使用できる文字は?
-
[解決済み] CSSコンテンツによるHTMLエンティティの追加
-
[解決済み] preタグでテキストを折り返すにはどうしたらよいですか?
-
[解決済み] localStorage、sessionStorage、session、cookieの違いは何ですか?
-
[解決済み] CSSの爆発を管理する
-
[解決済み】CSSを使用して、すべてのブラウザでdiv要素を垂直方向に中央に配置するにはどうすればよいですか?
-
[解決済み】CSSで複数の属性セレクタを指定する。
-
[解決済み】CSSの子セレクタと子孫セレクタについて
-
[解決済み】CSSセレクタのクラス名は大文字・小文字を区別する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
iframeフレームワークの使用
-
[解決済み] <html xmlns="http://www.w3.org/1999/xhtml">」は何をするものですか?
-
[解決済み] HTMLのid属性に有効な値は何ですか?
-
[解決済み] div' コンテナに合わせて画像を自動リサイズするにはどうしたらいいですか?
-
[解決済み] HTMLページからのリダイレクト
-
[解決済み] <meta charset="utf-8"> vs <meta http-equiv="Content-Type">.
-
[解決済み] HTMLにPDFを埋め込むおすすめの方法とは?
-
[解決済み] 入力テキストボックスの値を取得する
-
[解決済み] mailto:を使ってメールの件名や内容を設定することはできますか?
-
[解決済み] テーブル内のテキストアラインクラス