Ist! Wichtig schlecht für die Leistung?

192

Ich hasse sie, es trotzt der Kaskadierung von CSS, und wenn Sie sie nicht mit Sorgfalt verwenden, geraten Sie in eine Schleife, in der Sie mehr hinzufügen !important.

Aber ich möchte wissen, ob sie schlecht für die Leistung sind.

BEARBEITEN
Aus den (schnellen) Antworten kann ich schließen, dass dies keinen (signifikanten) Einfluss auf die Leistung hat. Aber es ist schön zu wissen, auch wenn es nur ein zusätzliches Argument ist, um andere zu entmutigen;).

EDIT 2
BoltClock wies darauf hin, dass bei 2 !importantDeklarationen laut Spezifikation die spezifischste ausgewählt wird.

janw
quelle
7
Wie bewerten Sie aus Neugier die Leistung von CSS-Stylesheets? besseres CSS schneller rendern oder so?
Xiaoyi
4
@ Yoshi muss noch nach anderen !importantRegeln suchen .
John Dvorak
1
@janw: Ich habe gerade klargestellt, dass es das spezifischste auswählt ... Ich habe den irreführenden Kommentar entfernt.
BoltClock
15
zufälliger Gedanke: Der Titel wäre viel lustiger, wenn er lauten würde: "Ist! wichtig wichtig?"
Nik Bougalis
59
Ich lese immer! wichtig als 'nicht wichtig'
o

Antworten:

269

Es sollte eigentlich keinen Einfluss auf die Leistung haben. Wenn ich den CSS-Parser von Firefox bei/source/layout/style/nsCSSDataBlock.cpp#572 sehe, denke ich, dass dies die relevante Routine ist, die das Überschreiben von CSS-Regeln behandelt.

es scheint nur eine einfache Überprüfung auf "wichtig" zu sein.

  if (aIsImportant) {
    if (!HasImportantBit(aPropID))
      changed = PR_TRUE;
    SetImportantBit(aPropID);
  } else {
    // ...

Auch Kommentare bei source/layout/style/nsCSSDataBlock.h#219

    /**
     * Transfer the state for |aPropID| (which may be a shorthand)
     * from |aFromBlock| to this block.  The property being transferred
     * is !important if |aIsImportant| is true, and should replace an
     * existing !important property regardless of its own importance
     * if |aOverrideImportant| is true.
     * 
     * ...
     */

  1. Firefox verwendet einen manuell geschriebenen Top-Down-Parser. In beiden Fällen wird jede CSS-Datei in ein StyleSheet-Objekt analysiert. Jedes Objekt enthält CSS-Regeln.

  2. Firefox erstellt dann Stilkontextbäume, die die Endwerte enthalten (nachdem alle Regeln in der richtigen Reihenfolge angewendet wurden).

CSS Parser Firefox

Von: http://taligarsiel.com/Projects/howbrowserswork1.htm#CSS_parsing

Jetzt können Sie leicht erkennen, dass der Parser beispielsweise mit dem oben beschriebenen Objektmodell die von der betroffenen Regel markieren kann !important leicht und ohne große Folgekosten . Leistungsabfall ist kein gutes Argument dagegen !important.

Die Wartbarkeit ist jedoch ein Hit (wie in anderen Antworten erwähnt), was möglicherweise Ihr einziges Argument gegen sie ist.

Anirudh Ramanathan
quelle
87
Ich mag es, dass Sie der einzige sind, der sich die Mühe gemacht hat, zu prüfen, anstatt anzunehmen. Großartige Arbeit, Sir!
Moox
Dieses Objektmodell ist übrigens nicht das DOM ... es ist das CSSOM. Nur für den Fall, dass sich jemand wundert.
BoltClock
5
Dies sollte die Antwort sein. Ich schäme mich, dass meine Antwort doppelt so viele Punkte hat wie Ihre. Oh je, oh je. Jemand gibt diesem Mann Kredit, wo es fällig ist!
Michael Giovanni Pumo
3
In diesem Beitrag dreht sich alles um das Parsen, und ich würde erwarten, dass die Auswirkungen auf die Leistung dort gleich Null sind. Parser sind schnell. Die Frage ist, wie sieht es beim Rendern aus, wenn der Browser nach CSS-Deklarationen sucht, die einem bestimmten Element entsprechen? Ist der übliche Fall, dass es keine !importantspeziell optimierten Regeln gibt ? Ich denke nicht, aber es ist schwer sicher zu sein; Das Layout- / Stilverzeichnis in Firefox umfasst 80.000 Codezeilen.
Jason Orendorff
1
Ihre Bemühungen, die genaue Quelle zu überprüfen und diesen hohen Wissensstand zu teilen, sind einfach außergewöhnlich und erstaunlich. Menschen wie Sie machen StackOverflow so beliebt und vertrauenswürdig. Vielen Dank für die Beantwortung und Weitergabe.
Anmol Saraf
113

Ich denke nicht, dass dies von !importantNatur aus schlecht ist , wenn es darum geht, wie schnell der Browser mit Regeln übereinstimmt (er ist nicht Teil des Selektors, sondern nur Teil der Deklaration).

Wie bereits erwähnt, verringert dies jedoch die Wartbarkeit Ihres Codes und führt daher wahrscheinlich dazu, dass er aufgrund zukünftiger Änderungen unnötig an Größe zunimmt. Die Verwendung von !importantwürde wahrscheinlich auch die Entwicklerleistung verringern.

Wenn Sie wirklich wählerisch waren, können Sie auch sagen, dass !importantIhre CSS-Datei um 11 zusätzliche Bytes erweitert wird. Das ist nicht wirklich viel, aber ich denke, wenn Sie ein paar !importants in Ihrem Stylesheet haben, könnte sich das summieren.

Nur meine Gedanken, leider konnte ich keine Benchmarks finden, wie sich !importantdies auf die Leistung auswirken könnte.

Sean
quelle
56
"11 zusätzliche Bytes" geben oder nehmen Sie ein paar Bytes für optionales Leerzeichen oh Gott das Leerzeichen
BoltClock
11
Ich weiß ... Ich mache mich nur lustig darüber, wie extrem wählerisch die Leute werden, wenn es um Leistung geht, indem ich diese Seligkeit auf die nächste Stufe bringe.
BoltClock
11
Wenn Sie wirklich wählerisch sind, überschreitet die zusätzliche Spezifität, die erforderlich ist, um es richtig zu machen, häufig 11 Bytes bei weitem.
BlakeGru
1
@BG_Insight: Sehen Sie diesen Link, wie man Spezifität in
Brendon Roberto
10
@DisgruntledGoat: Eine besonnene Person würde erkennen, dass nicht Bytes verschwendet werden, sondern Sekunden, Minuten, Stunden, Tage und Neuronen. (Warum bin ich noch hier?)
BoltClock
59

!importanthat seinen Platz. Vertrau mir in diesem Fall. Es hat mich viele Male gerettet und ist oft als kurzfristige Lösung nützlicher, bevor eine längere und elegantere Methode für Ihr Problem gefunden werden kann.

Wie die meisten Dinge wurde es jedoch missbraucht, aber es besteht kein Grund zur Sorge um die Leistung. Ich wette, ein kleines 1x1-GIF hat auf einer Webseite mehr Leistungseinbußen als! Wichtig.

Wenn Sie Ihre Seiten optimieren möchten, gibt es noch viele weitere wichtige Wege;);)

Michael Giovanni Pumo
quelle
8
Es war nur ein lustiges Ende, lasst uns alle lächeln und einfach ... entspannen!
Michael Giovanni Pumo
12
Welcher Esel? Ich muss wissen!
Oscar Broman
1
@ Oscar Broman Ich denke, er meint das :) :) sieht aus wie ein bestimmter Teil der menschlichen Anatomie, der einen gemeinsamen Namen mit dem anderen Namen für einen Esel in englischer Sprache teilt. "Der Esel oder Esel" - das ist der Anfang des Wikipedia-Artikels über Esel, Verzeihung, Esel. Ich gehe davon aus, dass Herr Jan Dvorak und zwei Aufsteiger zu den Menschen gehören, die buchstäblich von jedem Wort (oder Smiley) beleidigt werden, das sogar aus der Ferne (oder in diesem Fall imaginär) beleidigend ist. Esel zu sagen, wenn du Arsch meinst, ist jedoch ziemlich dumm und unhöflich, da es nur wenige nicht englischsprachige Menschen verstehen würden.
Dimitar Slavchev
7
@ DimitarSlavchev Jan sprach nicht über den Smiley. Siehe die erste Version von Michaels Beitrag (Revision 2).
Andytuba
5
@andytuba tbh, es macht Dimitars Argument ungültig, aber nicht sein Punkt :) :)
Grimasse der Verzweiflung
31

Was hier hinter den Kulissen passiert, ist, dass der Browser während der Verarbeitung Ihres CSS es liest, auf ein !importantAttribut stößt und der Browser zurückkehrt, um die durch definierten Stile anzuwenden !important. Dieser zusätzliche Prozess scheint ein kleiner zusätzlicher Schritt zu sein. Wenn Sie jedoch viele Anfragen bearbeiten, wird die Leistung beeinträchtigt. (Quelle)

Die Verwendung von! Important in Ihrem CSS bedeutet normalerweise, dass Entwickler narzisstisch und egoistisch oder faul sind. Respektiere die kommenden Entwickler ...

Das Denken eines Entwicklers bei der Verwendung von !important:

  1. Mein rockiges CSS funktioniert nicht ... grrrr.
  2. Was sollte ich jetzt tun??
  3. Und dann !importantja ... jetzt funktioniert es gut.

Es ist jedoch kein guter Ansatz, !importantnur weil wir das CSS nicht gut verwaltet haben. Es entstehen viele Designprobleme - die schlimmer sind als Leistungsprobleme -, aber es zwingt uns auch dazu, viele zusätzliche Codezeilen zu verwenden, da wir andere Eigenschaften überschreiben !importantund unser CSS mit nutzlosem Code überfüllt ist. Stattdessen sollten wir zuerst das CSS sehr gut verwalten und nicht zulassen, dass sich die Eigenschaften gegenseitig überschreiben.

Wir können verwenden !important. Aber verwenden Sie es sparsam und nur, wenn es keinen anderen Ausweg gibt.

Geben Sie hier die Bildbeschreibung ein

NullPoiиteя
quelle
Welche Methode ist besser? Spezifität in CSS, um sicherzustellen, dass das Element angewendet wird, die richtigen Stile (was eine große CSS-Anweisung bedeuten könnte; z. B. #news .article .article-title h3 a {}) oder nur das wichtige Tag hinzufügen?
Dennis Martinez
1
@ TennisMartinez es wäre besser, eine Klasse für Titellink zu machen und diese einfach hinzuzufügen ..
NullPoiиteя
Nein, nur faul. Holen Sie sich Stock. Schlagen.
Erik Reppen
1
Ich glaube nicht, dass casperOne die Bilder entfernt hat, nur weil sie langsam geladen wurden ...
BoltClock
13

Ich stimme Ihnen zu, dass Sie es nicht verwenden, da es unabhängig von der Leistung eine schlechte Praxis ist. Allein aus diesen Gründen würde ich es vermeiden, !importantwo immer möglich zu verwenden.

Aber zur Frage der Leistung: Nein, das sollte nicht auffallen. Es könnte eine gewisse Wirkung haben, aber es sollte so klein sein, dass Sie es niemals bemerken oder sich darüber Sorgen machen sollten .

Wenn es wichtig genug ist, um wahrgenommen zu werden, haben Sie wahrscheinlich größere Probleme in Ihrem Code als nur !important. Die einfache Verwendung eines normalen Syntaxelements der von Ihnen verwendeten Kernsprachen wird niemals zu einem Leistungsproblem.

Lassen Sie mich Ihre Frage mit einer Antwort beantworten. Ein Winkel, den Sie wahrscheinlich nicht berücksichtigt haben: Welchen Browser meinen Sie?

Jeder Browser verfügt offensichtlich über eine eigene Rendering-Engine mit eigenen Optimierungen. Nun stellt sich die Frage: Was sind die Auswirkungen auf die Leistung in jedem Browser? Vielleicht !importantin einem Browser schlecht, aber in einem anderen wirklich gut? Und vielleicht ist es in den nächsten Versionen umgekehrt?

Ich denke, mein Punkt hier ist, dass wir als Webentwickler nicht über die Auswirkungen einzelner Syntaxkonstrukte der von uns verwendeten Sprachen auf die Leistung nachdenken sollten (oder darüber nachdenken müssen). Wir sollten diese Syntaxkonstrukte verwenden, weil sie der richtige Weg sind, um das zu erreichen, was wir wollen, und nicht aufgrund ihrer Leistung.

Leistungsfragen sollten in Verbindung mit der Verwendung von Profilern gestellt werden, um zu analysieren, wo sich die Quetschpunkte in Ihrem System befinden. Beheben Sie zuerst die Dinge, die Sie wirklich verlangsamen. Es ist fast sicher, dass Sie weitaus größere Probleme beheben müssen, bevor Sie sich auf die Ebene der einzelnen CSS-Konstrukte beschränken.

DEZA
quelle
Gute Argumentation. Ich weiß, dass es sich nicht lohnt, dafür zu optimieren, aber ich bin nur neugierig.
Janw
7

Die Leistung wird dadurch nicht merklich beeinträchtigt. Dies verringert jedoch die Wartbarkeit Ihres Codes und kann daher auf lange Sicht die Leistung beeinträchtigen.

Henrik
quelle
2
@ Jan Dvorak was ist dein Problem?
Enve
@BoltClock Ich beziehe mich auf den ersten Satz.
John Dvorak
4
@Enve mein Problem ist, dass ich einen Benchmark sehen möchte, nicht Apriori-Annahmen als Fakten dargestellt. Ich weiß nicht, welches das ist.
John Dvorak
Ich würde argumentieren, dass die Tatsache, dass es die Pflege Ihres Codes erschwert, ein ausreichendes Argument sein sollte, um ihn nicht zu verwenden. Ich habe noch nie einen Leistungsabfall festgestellt, selbst im Vergleich zu anderen geringfügigen Leistungsverbesserungen wie der Verwendung von ID anstelle von CLASS-Selektoren.
Henrik
7

Ich musste es benutzen !important ich es schon mehrmals verwenden musste, habe ich persönlich keinen nachweisbaren Leistungseinbruch bei der Verwendung festgestellt.

Beachten Sie als Antwort die Antwort auf diese Stapelfrage aus einem Grund, den Sie möglicherweise verwenden möchten!important .

Ich werde auch etwas erwähnen, das alle anderen nicht erwähnt haben. !importantDies ist die einzige Möglichkeit, Inline-CSS zu überschreiben, ohne eine Javascript-Funktion zu schreiben (was sich auf Ihre Leistung auswirkt, wenn auch nur ein wenig). Sie können also tatsächlich Zeit für die Leistung sparen , wenn Sie Inline-CSS überschreiben müssen.

Ryan
quelle
6

hmm ...! wichtig oder !! wichtig?

Lassen Sie uns Schritt für Schritt durchgehen:

  1. Der Parser muss für jede Eigenschaft prüfen, ob sie wichtig ist, unabhängig davon, ob Sie sie verwenden oder nicht. Der Leistungsunterschied beträgt hier also 0
  2. Beim Überschreiben einer Eigenschaft muss der Parser prüfen, ob die zu überschreibende Eigenschaft wichtig ist oder nicht - daher beträgt der Leistungsunterschied hier wieder 0
  3. Wenn die zu überschreibende Eigenschaft !! wichtig ist, muss sie die Eigenschaft überschreiben - Leistungseinbruch von -1, wenn! Wichtig nicht verwendet wird
  4. Wenn die zu überschreibende Eigenschaft! Wichtig ist, wird das Überschreiben der Eigenschaft übersprungen - Leistungssteigerung von +1 für die Verwendung! Wichtig
  5. Wenn die neue Eigenschaft! Wichtig ist, muss die Analyse sie überschreiben, unabhängig davon, ob die zu überschreibende Eigenschaft! Wichtig oder !! wichtig ist - Leistungsunterschied 0 erneut

Ich denke also, wichtig hat tatsächlich eine bessere Leistung, da es dem Parser helfen kann, viele Eigenschaften zu überspringen, die sonst nicht übersprungen werden.

und wie @ryan weiter unten erwähnt, die einzige Möglichkeit, Inline-CSS zu überschreiben und die Verwendung von Javascript zu vermeiden ... also eine andere Möglichkeit, unnötige Leistungseinbußen zu vermeiden

hmm ... stellt sich heraus, dass! wichtig wichtig ist

und auch,

  • Die Verwendung von! wichtig spart einem Entwickler viel Zeit
  • erspart Ihnen manchmal die Neugestaltung des gesamten CSS
  • Manchmal ist HTML oder die übergeordnete CSS-Datei nicht in Ihrer Kontrolle, so dass Sie dort Ihr Leben retten
  • verhindert offensichtlich, dass! wichtige Elemente versehentlich von anderen !! wichtigen Elementen überschrieben werden
  • und manchmal wählen Browser einfach nicht die richtigen Eigenschaften aus, ohne in Selektoren zu spezifisch zu sein. Daher wird die Verwendung von! wichtig wirklich wichtig und erspart Ihnen das Schreiben von Tonnen spezifischer CSS-Selektoren in Ihr CSS. Selbst wenn Sie mehr Bytes zum Schreiben verwenden, ist es wichtig, dass Sie an anderen Stellen Bytes sparen. und wir alle wissen, dass CSS-Selektoren chaotisch werden können.

Ich denke, die Verwendung von! Important kann Entwickler glücklich machen, und ich denke, das ist sehr wichtig : D.

xtrahelp.com
quelle
1
"Also denke ich! Wichtig hat tatsächlich eine bessere Leistung, da es dem Parser helfen kann, viele Eigenschaften zu überspringen, die er sonst nicht überspringt." Diese Anweisung wird sofort ungültig, sobald Sie mehrere !importantDeklarationen haben. Der Browser muss alle überprüfen. Also geht es wirklich zurück zu Schritt 1.
BoltClock
1
@BoltClock Der Parser muss nach der Eigenschaft suchen, unabhängig davon, wie oft Sie sie verwenden. Wenn Sie also 10 Eigenschaften haben, muss der Parser diese Prüfung 10 Mal durchführen, unabhängig davon, ob diese Eigenschaften wichtig sind oder nicht. Wenn Sie also 10 wichtige Eigenschaften haben, führt der Parser die Prüfung 10 Mal durch, und wenn Sie 10 nicht wichtige Eigenschaften haben, führt der Parser die Prüfung immer noch 10 Mal durch ... macht das Sinn?
xtrahelp.com
Ich bin mir immer noch nicht sicher, ob! Wichtig eine Leistungssteigerung ist oder nicht, aber ich freue mich sehr über alle Kommentare und Diskussionen. Mein Wissen macht die nächsten Schritte nach vorne. StackOverflow ist einfach unglaublich: D
Anmol Saraf
4

Ich kann nicht vorhersehen, dass !importantdie Leistung beeinträchtigt wird, jedenfalls nicht von Natur aus. Wenn Ihr CSS jedoch durchsetzt !importantist, bedeutet dies, dass Sie die Auswahl von Qualifizierern überschritten haben und zu spezifisch sind und Ihnen die Eltern oder Qualifizierer ausgehen, um die Spezifität zu erhöhen. Folglich wird haben Ihre CSS aufgebläht werden (was wird die Leistung beeinträchtigen) und schwierig zu warten.

Wichtiges CSS-Regel-Mem

Wenn Sie effizientes CSS schreiben möchten, möchten Sie nur so spezifisch sein, wie Sie müssen, und modulares CSS schreiben . Es wird empfohlen, keine IDs (mit Hashes), Verkettungsselektoren oder qualifizierenden Selektoren zu verwenden.

#In CSS vorangestellte IDs sind bösartig spezifisch, bis zu dem Punkt, an dem 255 Klassen eine ID nicht überschreiben (Geige von: @Faust ). IDs haben jedoch auch ein tieferes Routing-Problem. Sie müssen eindeutig sein. Dies bedeutet, dass Sie sie nicht für doppelte Stile wiederverwenden können, sodass Sie am Ende lineares CSS mit sich wiederholenden Stilen schreiben. Die Auswirkungen davon variieren von Projekt zu Projekt, je nach Umfang, aber die Wartbarkeit leidet immens und in Randfällen auch die Leistung.

Wie können Sie Spezifität ohne !importantVerkettung, Qualifizierung oder IDs hinzufügen (nämlich #) ?

HTML

<div class="eg1-foo">
    <p class="eg1-bar">foobar</p>
</div>
<div id="eg2-foo">
    <p id="eg2-bar">foobar</p>
</div>
<div class="eg3-foo">
    <p class="eg3-foo">foobar</p>
</div>

CSS

.eg1-foo {
    color: blue;
}
.eg1-bar {
    color: red;
}
[id='eg2-foo'] {
    color: blue;
}
[id='eg2-bar'] {
    color: red;
}
.eg3-foo {
    color: blue;
}
.eg3-foo.eg3-foo {
    color: red;
}

JSFiddle

Okay, wie funktioniert das?

Das erste und das zweite Beispiel funktionieren gleich, das erste ist buchstäblich eine Klasse und das zweite ist der Attributselektor. Klassen- und Attributselektoren haben die gleiche Spezifität. .eg1/2-barerbt seine Farbe nicht von.eg1/2-foo weil es eine eigene Regel hat.

Das dritte Beispiel sieht aus wie das Qualifizieren oder Verketten von Selektoren, ist es aber auch nicht. Verkettung ist, wenn Sie Selektoren Eltern, Vorfahren usw. voranstellen. Dies erhöht die Spezifität. Das Qualifying ist ähnlich, aber Sie definieren das Element, auf das der Selektor angewendet wird. Qualifikation: ul.classund Verkettung:ul .class

Ich bin nicht sicher, wie Sie diese Technik nennen würden, aber das Verhalten ist beabsichtigt und wird von W3C dokumentiert

Wiederholte Vorkommen desselben einfachen Selektors sind zulässig und erhöhen die Spezifität.

Was passiert, wenn die Spezifität zwischen zwei Regeln identisch ist?

Wie @BoltClock hervorhob : Wenn es mehrere! Wichtige Deklarationen gibt, schreibt die Spezifikation vor, dass die spezifischste Vorrang haben sollte.

Im folgenden Beispiel haben beide .foound .bardie gleiche Spezifität, sodass das Verhalten auf die Kaskadierung von CSS zurückgreift, wobei die letzte in CSS deklarierte Regel Vorrang hat, d .foo. H.

HTML

<div>
    <p class="foo bar">foobar</p>
</div>

CSS

.bar {
    color: blue !important;
}
.foo {
    color: red !important;
}

JSFiddle

Jack Tuck
quelle