Ich kann nicht vorhersehen, dass !important
die Leistung beeinträchtigt wird, jedenfalls nicht von Natur aus. Wenn Ihr CSS jedoch durchsetzt !important
ist, 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.
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 !important
Verkettung, 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-bar
erbt 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.class
und 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 .foo
und .bar
die 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