2013-08-30 2 views
6

ich viele CSS Performance Artikel, wie zum Beispiel gelesen haben;Warum sind Selektoren wie ein [title = „home“] langsamer als Klasse verwenden?

ich warum Selektoren wie diese sind schlecht

#social a { 
} 

Als Browser ein zuerst liest, dann gezwungen ist, Schleife durch alle <ein>-Tags in der Seite.

Aber warum ist ein Selektor wie a [title = "home"] langsamer als eine Klasse verwenden?

Ich gehe davon aus, dass der Browser eine Art Index erstellt, um herauszufinden, welche Elemente eine bestimmte Klasse haben (Richtig?).

Aber sollten Browser nicht auch indiziert haben, welche Elemente ein bestimmtes Attribut haben? (Wie Titel)?

Meine Frage ist; Warum ist das CSS/Element bei Verwendung von Selektoren wie a [title = "home"] im Vergleich zur Verwendung einer Klasse viel langsamer? Was oder wie geht der Browser vor, damit das Ergebnis so viel langsamer ist?

+0

"Aber sollten Browser nicht auch indiziert haben, welche Elemente ein bestimmtes Attribut haben?" - Denkst du, das macht Sinn? Eine Klasse sagt etwas wie "Hey, ich bin von diesem Typ, jeder kann etwas mit mir machen!" während ein Platzhalterattribut nur sagt "Yo, browser, render mir diesen Weg und dann vergiss mich".Und da die Indexierung einige Zeit in Anspruch nimmt, sollten Browser nur die erste Art von Attributen indexieren. – contradictioned

+1

FYI, bezieht sich der Ausdruck "Universalselektor" speziell auf den '*' Selektor. 'a [title =" home "]' ist kein universeller Selektor; '[title =" home "]' ohne das 'a' andererseits könnte man sagen, dass man einen * impliziten * universellen Selektor benutzt, weil es äquivalent zu' * [title = "home"] 'ist. – BoltClock

Antwort

3

Browser Implementierer optimieren die häufigsten Fälle. Da Klassen sehr häufig zum Anpassen von Stilen verwendet werden, müssen sie dies so effizient wie möglich implementieren. Wenn sie in CSS geladen werden, indexieren sie die Klassen, um dies zu ermöglichen.

Da zufällige Selektoren wie title="home" nicht sehr häufig verwendet werden, können sie sie mit einfacheren Suchen implementieren. Es wird nicht so viel Einfluss auf die Leistung haben, da es selten verwendet wird.

Klassen erfordern auch eine spezielle Behandlung im Browser, da ein Element mehrere Klassen aufweisen kann, z. class="foo bar baz". Wenn das Dokument Parsen, muss der Browser diese aufzuspalten, so dass es einer von ihnen gegen die CSS-Selektoren mithalten können.

+0

Ihre Antwort ist im Grunde, moderne Browser erstellen Indizes für Klassen, aber nicht für alle andere Attribute. Daher wird dort ein anderes Attribut als das Klassenattribut langsamer sein? – corgrath

+0

Ja. Klassen und IDs sind für die Verwendung in Selektoren vorgesehen, sodass sie für diese Verwendung optimiert wurden. – Barmar

+1

Beachten Sie, dass aus diesem Grund die Verwendung eines Attributselektors für die Übereinstimmung mit dem Attribut "class" nicht optimiert ist. (Wenn Sie Attribut-Selektoren verwenden, um Klassennamen zuzuordnen, versuchen Sie wahrscheinlich, die Übereinstimmung mit speziellen Kriterien herzustellen, die mit einem Klassenselektor ohnehin nicht erreicht werden können.) – BoltClock

0

Benchmark

Schlussfolgerungen

In den meisten Attributselektor‘Fälle mit unbekanntem Attribute, z.B. [a = "b"] 'und' Attributselektor mit bekanntem Attribut, z. [title = "a"] tauchte in der Kategorie "3 Worst" auf. Es ist sicher zu sagen, dass Sie diese Selektoren vermeiden sollten.

+0

Warum haben Sie solche alten Browser-Versionen getestet? – Barmar

+0

@Barmar: Er war nicht derjenige, der diese Tests schrieb. Steve Souders hat es getan. Der Artikel, aus dem die Grafik stammt, wurde vor 4 Jahren geschrieben. – BoltClock

+0

Keine der Testseiten verwendet Selektoren wie 'a [title =" home "]'. – Barmar

Verwandte Themen