Diese Frage wurde mir neulich gestellt. Mein erster Gedanke war: * seltsame Frage! * Spezifität bezieht sich auf Selektoren, und at-rules sind keine Selektoren, also... irrelevant?
Um das zu beweisen, können wir denselben Selektor innerhalb und außerhalb einer At-Rule verwenden und sehen, ob dies die Spezifität zu beeinflussen scheint.
body {
background: red;
}
@media (min-width: 1px) {
body {
background: black;
}
}
Der Hintergrund ist schwarz. Aber... liegt das daran, dass die Media-Query die Spezifität erhöht? Wechseln wir sie.
@media (min-width: 1px) {
body {
background: black;
}
}
body {
background: red;
}
Der Hintergrund ist rot, also nein. Der rote Hintergrund gewinnt hier, einfach weil er später in der Stylesheet steht. Die Media-Query hat keinen Einfluss auf die Spezifität.
Wenn es sich so anfühlt, als ob Selektoren die Spezifität erhöhen und andere Stile mit demselben Selektor überschreiben, liegt es wahrscheinlich einfach daran, dass sie später in der Stylesheet kommen.
Dennoch hat mich das @keyframes in der ursprünglichen Frage zum Nachdenken gebracht. Keyframes können natürlich Stile beeinflussen. Nicht die Spezifität, aber es kann sich anfühlen wie Spezifität, wenn die Stile letztendlich überschrieben werden.
Siehe dieses winzige Beispiel
@keyframes winner {
100% { background: green; }
}
body {
background: red !important;
animation: winner forwards;
}
Man würde denken, der Hintergrund wäre rot, besonders mit der !important Regel dort. (Übrigens, !important beeinflusst die Spezifität nicht; es ist eine pro-Regel-Angelegenheit.) Er ist rot in Firefox, aber grün in Chrome. Das ist also eine komische Sache, auf die man achten muss. (Es ist laut Estelle Weyl seit mindestens 2014 ein Fehler.)
Wurde dazu nichts in den Spezifikationen geschrieben?
Ja, das steht im CSS Cascading and Inheritance-Modul (sowohl Level 3 als auch Level 4). Der Kaskadenalgorithmus vergleicht zuerst den Ursprung der Stile (normale Stile alias "Autor-Deklarationen", Browser-integrierte Stile alias "Benutzeragenten-Deklarationen" usw.), diese Ursprünge haben unterschiedliche Prioritäten, und die Spezifität kommt nur ins Spiel, wenn der Ursprung derselbe ist. Stile innerhalb der
@keyframe-Blöcke werden als eine spezielle Art von Ursprung ("Animations-Deklarationen") betrachtet, und die Spezifikation besagt, dass sie eine höhere Priorität haben als die gewöhnlichen "Autor-Deklarationen", aber eine niedrigere Priorität als die "Autor-Deklarationen" mit!important. Firefox verhält sich also korrekt, während das Verhalten von Chrome ein Fehler ist.Der Chrome-Fehler ist hier: https://bugs.chromium.org/p/chromium/issues/detail?id=552085