Wie ist die Rangfolge für CSS?

109

Ich versuche herauszufinden, warum eine meiner CSS-Klassen die andere zu überschreiben scheint (und nicht umgekehrt).

Hier habe ich zwei CSS-Klassen

.smallbox { 
    background-color: white;
    height: 75px;
    width: 150px;
    font-size:20px;
    box-shadow: 0 0 10px #ccc;
    font-family: inherit;
}

.smallbox-paysummary {
    @extend .smallbox; 
    font-size:10px;
}

und aus meiner Sicht rufe ich an

<pre class = "span12 pre-scrollable smallbox-paysummary smallbox "> 

Die Schriftart (das überlappende Element) wird als 10 statt 20 Pixel angezeigt. Kann jemand erklären, warum dies der Fall ist?

Stephen
quelle
2
Verwenden Sie einen CSS-Vorprozessor? Ich sehe, dass Sie das haben @extend .smallbox;, was wie nicht standardmäßiges cSS aussieht.
Jared Farrish
Sie sollten wirklich nicht kombinieren @extend- wenn es das tut, was ich denke - und beide Selektoren für dasselbe Element verwenden.
Millimoose
SMACSS scheint zu empfehlen , nur die geänderten Eigenschaften in eine "Unterklasse" (dh .smallbox-paysummary) aufzunehmen und optional die CSS-Deklaration klarer zu machen (ohne sich auf die Reihenfolge des Auftretens in der CSS-Datei zu verlassen), indem.smallbox.smallbox-paysummary { font-size: 10px; }
millimoose
1
Und wenn Sie NICHT möchten .smallbox-paysummary, dass die Schrift kleiner ist, warum verkleinern Sie sie dann überhaupt?
Millimoose
Jetzt frage ich mich, warum, wenn beide Regeln dieselbe Spezifität haben, die später im Klassenattribut des Elements deklarierte Regel unabhängig von der Reihenfolge der CSS-Regeln keinen Vorrang hat.
Andy

Antworten:

186

Es gibt verschiedene Regeln (in dieser Reihenfolge angewendet):

  1. Inline-CSS (HTML-Stilattribut) überschreibt CSS-Regeln in Stil-Tags und CSS-Dateien
  2. Ein spezifischerer Selektor hat Vorrang vor einem weniger spezifischen
  3. Regeln, die später im Code erscheinen, überschreiben frühere Regeln, wenn beide dieselbe Spezifität haben.
  4. Eine CSS-Regel mit hat !importantimmer Vorrang.

In Ihrem Fall gilt die Regel 3.

Spezifität für einzelne Selektoren vom höchsten zum niedrigsten:

  • IDs (Beispiel: #mainwählt aus <div id="main">)
  • Klassen (Bsp .: .myclass), Attributselektoren (Bsp .: [href=^https:]) und Pseudoklassen (Bsp .: :hover)
  • Elemente (Bsp .: div) und Pseudoelemente (Bsp .: ::before)

Um die Spezifität von zwei kombinierten Selektoren zu vergleichen, vergleichen Sie die Anzahl der Vorkommen einzelner Selektoren für jede der oben genannten Spezifitätsgruppen.

Beispiel: Vergleiche #nav ul li a:hovermit#nav ul li.active a::after

  • Zählen Sie die Anzahl der ID-Selektoren: Für jeden gibt es einen ( #nav)
  • Zählen Sie die Anzahl der Klassenselektoren: Es gibt einen für jeden ( :hoverund .active)
  • Zählen Sie die Anzahl der Elementselektoren: Es gibt 3 ( ul li a) für den ersten und 4 für den zweiten ( ul li a ::after), daher ist der zweite kombinierte Selektor spezifischer.

Ein guter Artikel über CSS-Selektor-Spezifität .

Lorenz Meyer
quelle
Wie überschreibt die Spezifität Inline-Stildeklarationen?
Jared Farrish
3
"... CSS-Regeln im Style-Tag ... überschreibt Regeln in der CSS-Datei". Ich habe diesen Mythos in letzter Zeit einige Male gesehen. Ich weiß nicht, woher es kommt, aber es ist Unsinn.
Alohci
@jared Ich habe die beiden ersten Punkte getauscht. Ist es das was du meinst?
Lorenz Meyer
Ja, das habe ich gemeint.
Jared Farrish
2
@PakiPat :hoverist kein Klassenwähler, sondern ein Pseudo-Klasse - Selektor.
Lorenz Meyer
30

Hier ist eine Zusammenstellung der CSS-Stilreihenfolge in einem Diagramm, in dem CSS-Regeln eine höhere Priorität haben und Vorrang vor den anderen haben: CSS-Styling-Reihenfolge

Haftungsausschluss : Mein Team und ich haben dieses Stück zusammen mit einem Blog-Beitrag ( https://vecta.io/blog/definitive-guide-to-css-styling-order ) ausgearbeitet, von dem ich denke, dass er für alle Frontends nützlich sein wird Entwickler.

Qin
quelle
3
Dieses Diagramm erfordert eine besondere Denkweise. Für mich ist es viel schwieriger, dieses Diagramm zu verstehen als die Stilvererbung selbst.
Lorenz Meyer
10

Was wir hier betrachten, heißt Spezifität, wie von Mozilla angegeben :

Die Spezifität ist das Mittel, mit dem Browser entscheiden, welche CSS-Eigenschaftswerte für ein Element am relevantesten sind und daher angewendet werden. Die Spezifität basiert auf den Übereinstimmungsregeln, die sich aus verschiedenen Arten von CSS-Selektoren zusammensetzen.

Die Spezifität ist ein Gewicht, das auf eine bestimmte CSS-Deklaration angewendet wird und durch die Nummer jedes Selektortyps im passenden Selektor bestimmt wird. Wenn mehrere Deklarationen gleich spezifisch sind, wird die zuletzt im CSS gefundene Deklaration auf das Element angewendet. Die Spezifität gilt nur, wenn auf dasselbe Element mehrere Deklarationen abzielen. Gemäß CSS-Regeln haben direkt ausgerichtete Elemente immer Vorrang vor Regeln, die ein Element von seinem Vorfahren erbt.

Ich mag die 0-0-0 Erklärung unter https://specifishity.com :

Geben Sie hier die Bildbeschreibung ein

Ganz beschreibend das Bild der !importantRichtlinie! Manchmal ist dies jedoch die einzige Möglichkeit, das Inline- styleAttribut zu überschreiben . Es ist also eine bewährte Methode, beides zu vermeiden.

AMS777
quelle
1
Ausgezeichnet. genau das, wonach ich gesucht habe. Diese Grafik ist hervorragend lol.
Saran3h
7

Zunächst @extendscheint es , basierend auf Ihrer Direktive, dass Sie kein reines CSS verwenden, sondern einen Präprozessor wie SASS os Stylus.

Wenn wir nun über "Rangfolge" in CSS sprechen, gibt es eine allgemeine Regel: Alle Regeln, die nach der Anwendung anderer Regeln (von oben nach unten) festgelegt wurden. In Ihrem Fall können Sie die Priorität Ihrer Regeln ändern , indem Sie einfach angeben, .smallboxnachdem .smallbox-paysummarySie dies getan haben.

Wenn Sie jedoch etwas weiter gehen möchten, empfehle ich folgende Lektüre: CSS-Kaskaden-W3C-Spezifikation . Sie werden feststellen, dass die Priorität einer Regel basiert auf:

  1. Der aktuelle Medientyp;
  2. Bedeutung;
  3. Ursprung;
  4. Spezifität des Selektors und schließlich unsere bekannte Regel:
  5. Welches ist letzteres angegeben.
Renato
quelle
5

AS ist Status in W3: W3 Cascade CSS

Die Reihenfolge, in der verschiedene Stylesheets angewendet werden, lautet wie folgt (Zitat aus dem W3-Kaskadenabschnitt):

  1. Benutzeragentendeklarationen

  2. normale Benutzererklärungen

  3. Autor normale Erklärungen

  4. Autor wichtige Erklärungen

  5. Benutzer wichtige Erklärungen

Weitere Informationen hierzu finden Sie im verwiesenen W3-Dokument

freedeveloper
quelle
4

Die Reihenfolge, in der die Klassen im HTML-Element angezeigt werden, spielt keine Rolle. Was zählt, ist die Reihenfolge, in der die Blöcke im Stylesheet angezeigt werden.

In Ihrem Fall .smallbox-paysummarywird nach .smallboxdaher die 10px Priorität definiert.

LifeQuery
quelle
4
Element, Pseudo Element: d = 1  (0,0,0,1)
Class, Pseudo class, Attribute: c = 1  (0,0,1,0)
Id: b = 1  (0,1,0,0)
Inline Style: a = 1  (1,0,0,0)

Inline-CSS (HTML-Stilattribut) überschreibt CSS-Regeln in Stil-Tags und CSS-Dateien

Ein spezifischerer Selektor hat Vorrang vor einem weniger spezifischen.

Regeln, die später im Code erscheinen, überschreiben frühere Regeln, wenn beide dieselbe Spezifität haben.

Glücklicher Chaturvedi
quelle
Hier ist eine gute Erklärung: vanseodesign.com/css/css-specificity-inheritance-cascaade
akostadinov
1
@ Mahi Ich habe Ihre vorgeschlagene Bearbeitung in dieser Zeit geschwenkt, aber in Zukunft fügen Sie einer Bearbeitung bitte keinen Müll hinzu, nur um sie lang genug zu machen. Eine zweite Bearbeitung, die den Schaden einer ersten "rückgängig macht", ist eine sehr schlechte Praxis, für Rezensenten sehr unintuitiv und schafft mehr Arbeit als nötig. Suchen Sie stattdessen nach anderen Dingen, die verbessert werden könnten (z. B. Rechtschreibung oder Grammatik).
Siguza
0

Es ist auch wichtig zu beachten, dass der Browser den Stilen, die zuletzt in das DOM geschrieben wurden, Vorrang einräumt, wenn Sie zwei Stile in einem HTML-Element mit gleicher Priorität haben. Wenn also im DOM:

<html>
<head>
<style>.container-ext { width: 100%; }</style>
<style>.container { width: 50px; }</style>
</head>
<body>
<div class="container container-ext">Hello World</div>
</body>

... die Breite des Div beträgt 50px

P. Avery
quelle
Dies ist nicht wirklich Vorrang, dies ist der Cascading-Teil von Cascading Style Sheets.
TylerH