Das Folgende ist ein Gastbeitrag von Francisco Dias von HubSpot. Ich habe Francisco und Cris Necochea diese kurze, unterhaltsame Präsentation auf dem Show & Tell auf der CSS Dev Conf dieses Jahr gesehen. Er stimmte freundlicherweise zu, sie für einen Blogbeitrag vorzubereiten!
19 Wege, eine Hintergrundfarbe zu überschreiben
Beginnend mit fast dem niedrigsten Spezifitätsselektor
div {
background: black;
}
Es gibt eine ganze Reihe von Möglichkeiten, die bestehende Spezifität zu übertreffen, ohne den gleichen Trick zu wiederholen.
Klicken Sie sich durch jeden Schritt, um zu sehen, wie die Spione ihre Farbe (Schwarz oder Weiß) über die vorherige Farbe zwingen. Wenn das Übertrumpfen der Spezifität aufhört, haben sie immer noch mehr Tricks auf Lager!
(Die Spy-Form wird aus einem clip-path auf dem div in der Demo erstellt, um es unterhaltsamer und Spy-vs-Spy-ähnlicher zu gestalten. Wenn der Browser, den Sie gerade verwenden, clip-path nicht unterstützt, sehen Sie nur weiße oder schwarze Kästen.)
Siehe den Stift Spy Vs Spy von Francisco Dias (@FranDias) auf CodePen.
Was zum Teufel geht hier vor sich? Der Text in der Demo-Pen oben enthält weitere Informationen zu jedem Schritt, aber nur als schnelle Übersicht, hier sind die Phasen
Schritt 1: Elementselektor
0, 0, 0, 1
div {
background: black;
}
Schritt 2: Zwei Elementselektoren
0, 0, 0, 2
body div {
background: white;
}
Schritt 3: Drei Elementselektoren
0, 0, 0, 3
html body div {
background: black;
}
Schritt 4: Klassen-Selektor
0, 0, 1, 0
.spy {
background: white;
}
Schritt 5: Klasse + Element-Selektor
0, 0, 1, 1
div.spy {
background: black;
}
Schritt 6: Element + Klasse + Pseudo-Klassen-Selektor
0, 0, 2, 1
div.spy:only-of-type {
background: white;
}
Schritt 7: Gestapelte Klassen
0, 0, ∞, 0
.spy.spy.spy.spy.spy.spy.spy.spy.spy {
background: black;
}
Schritt 8: ID-Selektor
0, 1, 0, 0
#spy {
background: white;
}
Schritt 9: ID + Attribut-Selektor
0, 1, 1, 0
#spy[class^="s"] {
background: black;
}
Schritt 10: Viele der oben genannten kombinieren…
0, 1, 3, 3
html body div#spy[class="spy"]:first-of-type.spy {
background: white;
}
Schritt 11: Inline-Stil
1, 0, 0, 0
<div class="spy" id="spy" style="background: black;"></div>
Schritt 12: !important
So etwas wie [1, 0, 0, 0] pro Eigenschaft (kann einen Inline-Stil überschreiben).
div {
background: white !important;
}
Schritt 13: !important auf Inline-Stil
So etwas wie [∞, 0, 0, 0] pro Eigenschaft, was kein CSS überschreiben kann.
<div class="spy" id="spy" style="background: black !important;"></div>
Schritt 14: box-shadow Trickery
Einige Eigenschaften malen über andere. box-shadow malt über den Hintergrund.
div {
box-shadow: inset 0 9001rem 0 white;
}
Schritt 15: Invert-Filter
div {
-webkit-filter: invert(1);
filter: invert(1);
}
Schritt 16: Pseudo-Element-Überlagerung
div::after {
content: "";
height: 9001px;
width: 9001px;
background: black;
top: 0;
left: 0;
position: absolute;
}
Schritt 17: !important wieder
Alle Spezifitätskämpfe könnten wieder ausgetragen werden, einschließlich des kampf pro Eigenschaft mit !important;, also beenden wir das hier.
div:after {
background: white !important;
}
Schritt 18: @keyframes Trickery
!important ist nicht animierbar, daher kann die Animation es überschreiben.
@keyframes white {
to {
background: black;
}
}
div:after {
animation: white 1s linear;
animation-play-state: paused;
animation-delay: -1s;
animation-fill-mode: forwards;
}
Schritt 19: Färben des Inhalts
Ein riesiger Blockcharakter über allem färbt die Farbe wieder um!
div:after {
content: "█";
line-height: 0;
color: white;
font-size: 9001px;
}
Ein GIF der Demo in großem Bildschirm-Chrome

Ich hatte das Glück, das live auf dieser Show und Tell zu sehen. Coole Präsentation. Gut gemacht, Jungs
Doppelter Dank für die Ermutigung während der Präsentation und jetzt.
Jetzt geht mir das Lied „50 Ways to Leave Your Lover“ nicht mehr aus dem Kopf ...
Wir brauchen etwas wie !superimportant, das einfach all diesen Mist-CSS überschreibt (wichtige Dinge überall, heute habe ich !important am Selektor 'a img' gesehen, das mein ganzes Joomla-Portal ruiniert) von Drittanbieterkomponenten, die von Junior-Entwicklern geschrieben wurden. Ja, warum nicht!
Ich glaube nicht, dass das gut wäre :)
Das Problem ist, dass sobald diese Junior-Entwickler von dieser neuen Spezifität erfahren, wir
!superduperimportanthinzufügen müssten :)Ich stimme Brad und Jeffrey zu —
Was wir brauchen, ist ein besseres Bewusstsein dafür, wie man seine Funktionen verantwortungsbewusst kapselt. Jeffery Sweeny drückte es sehr gut aus: Wenn wir etwas Extremeres als
!importanthätten, hätten sie wahrscheinlich das benutzt.Es gibt Fälle, in denen ein
!important-Modifikator mit einem bewusst spezifischen Selektor oder einer Utility-Klasse mit nur einer Funktion wie.uppercase { text-transform: uppercase;}nützlich sein kann und sogar dazu beiträgt, ein Projekt zu skalieren. Leider scheint!importanteher aus Frustration als als bewusstes Werkzeug verwendet zu werden.Ich denke, eine effektivere Sache wäre eine Möglichkeit, !important zu ignorieren und zur Standard-Spezifität zurückzukehren. Auf diese Weise, anstatt in den Waffenlauf von aufdringlichen Entwicklern für höhere Trumpfkarten einzusteigen, wäre es eine Möglichkeit für Leute, die CSS tatsächlich verstanden haben, das von anderen hinterlassene Chaos zu entwirren.
Also haben wir die Spezifität, die wir verstehen, und so ist 'div > p' höher als 'p' und gewinnt. Machen wir es einfach und machen wir es !1, !2, !3, !4… bis unendlich?, 100? Viel einfacher ;) Wenn man einen Junior sieht, der !100 benutzt, dann ist er pur böse :D
Halb Scherz, halb ernst, ja warum nicht – diskutieren.
P.S. Trotzdem denke ich, es ist besser, die Spezifität zu lernen, anstatt am Ende einzelner CSS-Regeln mehr hinzuzufügen.
Nun, von Anfang an war CSS so konzipiert, dass es individuelle lokale Benutzer-CSS hat, das serverseitiges Autoren-CSS überschreibt (aber jeder hasst das und tut so, als würde es nicht existieren), so dass es denkbar wäre, zwischen seitenübergreifendem CSS und eigenem CSS zu unterscheiden. (Hilft hier aber nicht, da !important bereits den Benutzer-CSS übertrumpft.)
Ich muss den anderen Kommentaren zustimmen. Außerdem – Sie sollten vielleicht überlegen, eine solche Erweiterung überhaupt zu verwenden (natürlich könnten die Entwickler sehr versiert in PHP/JS sein und nur neu in CSS …).
!unimportant wäre genial
Beispiel
Entschuldigung... Tippfehler im Beispiel, sollte !unimportant sein
doh!
Die Regel
!importantsollte eher als Debugging-Tool behandelt werden. Genau wie Debugging-Meldungen sollte sie nicht im Produktionscode verwendet werden. Das Letzte, was wir brauchen, ist eine weitere Spezifitätsebene wie !superimportant. Die derzeitige verursacht zu viele Probleme.Ich wäre sogar für ein Flag / Regel / Direktive / Assertion, das wir in unserem Code platzieren könnten, das es einfach deaktiviert.
„Sie hatten Atombomben, also bauten wir Wasserstoffbomben“ ist nicht gerade die beste Strategie für Softwarearchitektur. ;)
Das muss die kreativste und informativste Demonstration von CSS-Spezifität sein, die ich je gesehen habe. Ich habe so viele clevere Techniken gesehen, die ich noch nicht kannte oder an die ich nicht gedacht hatte, und doch glaube ich, dass noch Dutzende mehr übrig geblieben sind.
Wow, danke für diesen Kommentar, das ist ein riesiges Kompliment. Es gibt zwei Tricks im Quellcode, die auskommentiert wurden, weil sie mit
clip-pathnicht funktionieren, und man kann auch IDs verketten#spy#spy#spy. Ansonsten wollte ich nicht auf!importantbei Animationen oder die Verwendung minimal spezifischerer Selektoren eingehen, um nicht pedantisch zu wirken. Danke nochmal!#19 wurde mir nicht angezeigt. Ich sehe nur den knallpinken Körper. Trotzdem eine tolle Präsentation. Ich benutze Chrome Version 48.0.2564.71 beta-m (64-Bit).
Meine Lieblingstechnik zur Bewältigung von Spezifitätsproblemen
Danke für den Fehlerbericht & das Kompliment. Ich sehe, was ich tun kann.
Ich hatte erwartet, hier den Inline-Stil-Überschreibungstrick zu sehen, aber da ich ihn nicht gesehen habe, hier ist er. Nehmen wir an, Sie haben ein Div mit einem Inline-Stil (wahrscheinlich von JavaScript), dann können Sie dies tun, um den Inline-Stil aus dem internen/externen CSS zu überschreiben.
Sie verwenden nur die Regel
!important, um Inline-CSS zu überschreiben, wie wir in Schritt 12 gesehen haben.Ich denke, es ist wichtig zu beachten, dass die Änderung des Erscheinungsbilds eines Elements mit JavaScript durch Modifizieren der style-Eigenschaft nicht dasselbe ist wie ein Inline-Stil. Es hat einfach die gleiche Spezifität.
Es gibt hier jedoch etwas Interessantes. Ich hätte erwartet, dass Ihr CSS nur Elemente anspricht, die tatsächlich eine
style-Eigenschaft im HTML haben, aber ich lag falsch. Anscheinend spricht es auch Elemente an, bei denen die style-Eigenschaft mit JavaScript im DOM gesetzt wurde.http://codepen.io/Ghodmode/pen/GoExqW
Am niedrigsten ist *.
Der universelle Selektor hat keine Spezifität (genauso wenig wie !important).
Sie haben Recht (es sei denn, man zählt Browser-Standardstile). Er wurde einfach nicht aufgenommen, da ich ihn nicht nackt einfügen konnte. Danke für den Kommentar.
Und danke für den Artikel – die Trickereien ab Schritt 14 sind interessant (wenn auch hacky).
Es geht um die Hintergrundfarbe, aber wenn Sie versuchen würden, die Textfarbe zu ändern, ist eines der kniffligsten Ungeheuer, die ich je gesehen habe, -webkit-text-fill-color. Ehrlich gesagt, das hat mich einmal verrückt gemacht, als ich eine ganze Stunde lang nicht verstehen konnte, warum nicht einmal !important funktionierte…