CSS-Selektoren werden von Browser-Engines von rechts nach links abgeglichen. Also finden sie zuerst die Kinder und überprüfen dann ihre Eltern, um festzustellen, ob sie mit den übrigen Teilen der Regel übereinstimmen.
- Warum ist das?
- Ist es nur, weil die Spezifikation sagt?
- Beeinflusst es das eventuelle Layout, wenn es von links nach rechts ausgewertet wurde?
Für mich wäre der einfachste Weg, dies zu tun, die Selektoren mit der geringsten Anzahl von Elementen zu verwenden. Also zuerst IDs (da sie nur 1 Element zurückgeben sollten). Dann vielleicht Klassen oder ein Element mit der geringsten Anzahl von Knoten - z. B. gibt es möglicherweise nur einen Bereich auf der Seite. Gehen Sie also mit einer Regel, die auf einen Bereich verweist, direkt zu diesem Knoten.
Hier sind einige Links, die meine Behauptungen stützen
- http://code.google.com/speed/page-speed/docs/rendering.html
- https://developer.mozilla.org/en/Writing_Efficient_CSS
Es klingt so, als würde dies auf diese Weise geschehen, um zu vermeiden, dass alle Kinder der Eltern (die viele sein könnten) und nicht alle Eltern eines Kindes, das eins sein muss, betrachtet werden müssen. Selbst wenn das DOM tief ist, wird beim RTL-Abgleich nur ein Knoten pro Ebene und nicht mehrere Knoten betrachtet. Ist es einfacher / schneller, CSS-Selektoren LTR oder RTL zu bewerten?
#foo
Selektor müsste mit all diesen Knoten übereinstimmen. jQuery hat die Möglichkeit zu sagen, dass $ ("# foo") immer nur ein Element zurückgibt, da sie ihre eigene API mit eigenen Regeln definieren. Browser müssen jedoch CSS implementieren, und CSS sagt, dass alles im Dokument mit der angegebenen ID abgeglichen werden soll.
querySelectorAll
). In anderen Fällen wird Sizzle verwendet. Sizzle stimmt nicht mit mehreren IDs überein, QSA jedoch (AYK). Der eingeschlagene Pfad hängt von der Auswahl, dem Kontext, dem Browser und seiner Version ab. Die Abfrage-API von jQuery verwendet das, was ich als "Native First, Dual Approach" bezeichnet habe. Ich habe einen Artikel darüber geschrieben, aber er ist ausgefallen. Obwohl Sie hier finden können: vierzigbelow.ca/hosted/dhtmlkitchen/JavaScript-Query-Engines.html