Es gab eine Empfehlung von Google PageSpeed, die Webentwickler bat, Verwenden Sie effiziente CSS-Selektoren :
Vermeidung ineffizienter Schlüsselauswahlelemente, die einer großen Anzahl von Schlüsseln entsprechen Elemente können das Seitenrendering beschleunigen.
Details
Wenn der Browser HTML analysiert, erstellt er eine interne Dokumentstruktur repräsentiert alle anzuzeigenden Elemente. Es stimmt dann überein Elemente zu Stilen, die in verschiedenen Stylesheets angegeben sind Standard-CSS-Kaskaden-, Vererbungs- und Ordnungsregeln. In Mozillas Implementierung (und wahrscheinlich auch andere), für jedes Element, die Die CSS-Engine durchsucht Stilregeln, um eine Übereinstimmung zu finden. Der Motor wertet jede Regel von rechts nach links beginnend von ganz rechts aus Selektor (genannt "Schlüssel") und bewegt sich durch jeden Selektor bis es findet eine Übereinstimmung oder verwirft die Regel. (Der "Selektor" ist das Dokument Element, auf das die Regel angewendet werden soll.)
Gemäß diesem System müssen die Regeln, die die Engine zu bewerten hat, weniger sein desto besser. [...]. Danach für Seiten, die große Mengen enthalten Elemente und / oder große Anzahl von CSS-Regeln, Optimierung der Definitionen Die Regeln selbst können die Leistung ebenfalls verbessern. Der Schlüssel zu Optimierungsregeln liegen darin, Regeln zu definieren, die so spezifisch sind wie möglich und das vermeiden unnötige Redundanz, um den Stil zu ermöglichen Engine, um schnell Übereinstimmungen zu finden, ohne Zeit mit der Auswertung von Regeln zu verbringen das gilt nicht.
Diese Empfehlung wurde aus den aktuellen Regeln für die Geschwindigkeit der Seitengeschwindigkeit entfernt. Jetzt frage ich mich, warum diese Regel entfernt wurde. Haben Browser in der Zwischenzeit die CSS-Regeln effizient angepasst? Und ist diese Empfehlung mehr gültig?
Im Februar 2011 wurde der Webkit-Kernentwickler Antti Koivisto verschiedene Verbesserungen für CSS Selector Performance in Webkit gemacht.
Antti Koivisto lehrte den CSS Style Selector, um Geschwisterselektoren und schnelleres Sortieren zu überspringen, was einige kleinere Verbesserungen mit sich brachte, woraufhin er zwei weitere tolle Patches erhielt: eines, das die Filterung von Vorfahrenidentifizierern für Baumbildung ermöglicht und die verbleibende Zeit stilistisch halbiert Anpassung an eine typische Seitenauslastung und ein schneller Pfad für einfache Selektoren, die das Abstimmen um weitere 50% auf einigen Websites beschleunigen.
CSS Selector Performance hat sich geändert! (Zum Besseren) von Nicole Sullivan geht diese Verbesserungen genauer durch. Zusammenfassend -
Laut Antti können direkte und indirekte Nachbarkombinatoren immer noch langsam sein, aber Vorfahrenfilter und Regel-Hashes können den Einfluss verringern, da diese Selektoren nur selten zusammenpassen. Er sagt auch, dass Webkit immer noch viel Platz für die Optimierung von Pseudoklassen und -elementen hat, aber sie sind viel schneller, als wenn sie versuchen, dasselbe mit JavaScript und DOM-Manipulationen zu machen. In der Tat, obwohl es noch Raum für Verbesserungen gibt, sagt er:
"In der Moderation wird so ziemlich alles verwendet, was aus der Perspektive des Stilvergleichs gut funktioniert."
Obwohl Browser die CSS-Selektoren viel schneller anpassen, sollte dennoch darauf hingewiesen werden, dass CSS-Selektoren immer noch optimiert werden sollten (z. B. so flach wie möglich), um Dateigrößen zu reduzieren und Spezifitätsprobleme zu vermeiden.
Hier ist ein gründlicher Artikel (der Anfang 2014 datiert ist)
>Ich zitiere Benjamin Poulain , ein WebKit-Engineer, der viel über die Leistung der CSS-Selektoren zu sagen hatte Test:
~ 10% der Zeit werden im Rasterizer verbracht. ~ 21% der Zeit sind verbraucht auf dem ersten Layout. ~ 48% der Zeit werden im Parser und DOM verbracht Baumbildung ~ 8% werden für die Stilauflösung ausgegeben ~ 5% werden ausgegeben den Stil sammeln - das sollten wir testen und was? sollte die meiste Zeit dauern. (Die verbleibende Zeit ist über viele verteilt viele kleine Funktionen)
Und er fährt fort:
"Ich stimme völlig zu, dass es sinnlos ist, Selektoren im Voraus zu optimieren, aber aus ganz anderen Gründen:
Es ist praktisch unmöglich, den endgültigen Leistungseinfluss vorherzusagen eines gegebenen Selektors durch bloßes Untersuchen der Selektoren. Im Motor, Selektoren werden neu geordnet, aufgeteilt, gesammelt und kompiliert. Um das zu wissen endgültige Leistung eines bestimmten Selektoren, müssten Sie wissen in In welchem Bucket der Selektor gesammelt wurde, wie er kompiliert wird und Wie sieht der DOM-Baum schließlich aus?
All das ist zwischen den verschiedenen Motoren sehr unterschiedlich und macht das ganze Prozess noch weniger vorhersehbar.
Das zweite Argument, das ich gegen Web-Entwickler habe, die Selektoren optimieren ist, dass sie die Dinge wahrscheinlich verschlimmern werden. Die Menge an Fehlinformationen über Selektoren sind größer als der korrekte Cross-Browser Information. Die Chance, dass jemand das Richtige tut, ist schön niedrig.
In der Praxis entdecken die Leute Leistungsprobleme mit CSS und starten Regeln nacheinander entfernen, bis das Problem verschwindet. ich denke, das ist Der richtige Weg, um dies zu tun, ist einfach und wird zur Korrektur führen Ergebnis. "
Es gibt Ansätze, wie zum Beispiel BEM , die das CSS so flach wie möglich modellieren, um die DOM-Hierarchie-Abhängigkeit zu minimieren und Webkomponenten zu entkoppeln, so dass sie über das DOM "verschoben" werden und unabhängig arbeiten können.
Vielleicht, weil CSS für CMSes oder Frameworks jetzt häufiger verwendet wird und es dann schwierig ist, allgemeine CSS-Selektoren zu vermeiden. Dies begrenzt die Komplexität des Stylesheets.
Auch moderne Browser sind sehr schnell beim Rendern von CSS. Selbst mit riesigen Stylesheets auf IE9 fühlte es sich nicht so an, als wäre das Rendering langsam. (Ich muss zugeben, dass ich an einem guten Computer getestet habe. Vielleicht gibt es dort Benchmarks).
Wie auch immer, ich denke, Sie müssen sehr ineffizientes CSS schreiben, um Chrome oder Firefox zu verlangsamen ...
Es gibt einen 2 Jahre alten Beitrag über die Leistung @ Welche CSS-Selektoren oder -Regeln können die Front-End-Layout- / Rendering-Leistung in der realen Welt erheblich beeinträchtigen?
Ich mag seine One-Liner-Schlussfolgerung: Alles in den Grenzen von "Ja, dieses CSS macht Sinn" ist in Ordnung.
Tags und Links html css performance css-selectors pagespeed