So überschreiben Sie die Eigenschaften einer CSS-Klasse mithilfe einer anderen CSS-Klasse

95

Ich bin ziemlich neu in CSS3 und möchte Folgendes tun können:

Wenn ich einem Element eine Klasse hinzufüge, werden die Eigenschaften einer anderen Klasse überschrieben, die in diesem bestimmten Element verwendet wird.

Nehmen wir an, ich habe

<a class="left carousel-control" href="#carousel" data-slide="prev">

Ich möchte in der Lage sein, eine Klasse mit dem Namen hinzuzufügen bakground-none, die den Standardhintergrund in der Klasse überschreibt left.

Vielen Dank!

user3075049
quelle

Antworten:

90

Es gibt verschiedene Möglichkeiten, wie Eigenschaften überschrieben werden können. Vorausgesetzt, Sie haben

.left { background: blue }

zB würde eine der folgenden Optionen es überschreiben:

a.background-none { background: none; }
body .background-none { background: none; }
.background-none { background: none !important; }

Die ersten beiden "gewinnen" nach Selektorspezifität; der dritte gewinnt mit !importanteinem stumpfen Instrument.

Sie können Ihre Stylesheets auch so organisieren, dass zB die Regel

.background-none { background: none; }

gewinnt einfach durch Ordnung, dh , indem sie nach einer ansonsten gleich „powerful“ -Regel. Dies führt jedoch zu Einschränkungen und erfordert, dass Sie bei der Neuorganisation von Stylesheets vorsichtig sind.

Dies sind alles Beispiele für die CSS-Kaskade , ein entscheidendes, aber weithin missverstandenes Konzept. Es definiert die genauen Regeln für die Lösung von Konflikten zwischen Stylesheet-Regeln.

PS Ich habe verwendet leftund background-nonewie sie in der Frage verwendet wurden. Sie sind Beispiele für Klassennamen, die nicht verwendet werden sollten, da sie bestimmte Renderings und keine strukturellen oder semantischen Rollen widerspiegeln.

Jukka K. Korpela
quelle
Sie haben geschrieben. Sie sind Beispiele für Klassennamen, die nicht verwendet werden sollten, da sie bestimmte Renderings und keine strukturellen oder semantischen Rollen widerspiegeln. Könnten Sie bitte näher darauf eingehen? Warum sollte leftund background-nonesollte vermieden werden?
Sokrates
1
@Socrates: Einige Leute glauben , dass CSS - Klassen nur Namen gegeben werden sollte , die erkennen , was das Element es wird angewendet wird, oder tut (zB button, name-labelusw.). Andere sind der Meinung , dass CSS unkontrollierbar wird , wenn Sie diesen Ansatz verwenden , und Sie sollten „Utility-first“ oder „funktional“ CSS verwenden , in denen Klassen Eigenschaftswerte entsprechen (zB margin-top-4, width-10usw.). Historisch gesehen war der "semantische" Ansatz vorherrschend, während der "funktionale" Ansatz in letzter Zeit Anhänger gefunden hat. Probieren Sie beides bei einem mittelgroßen Projekt aus und entscheiden Sie dann selbst, welches überlegen ist.
Mattia
62

Verwenden !importantSie es einfach, um zu überschreiben

background:none !important;

Obwohl es sich um eine schlechte Praxis handelt, !importantdie für Dienstprogrammklassen nützlich sein kann, müssen Sie sie nur verantwortungsbewusst verwenden. Überprüfen Sie Folgendes: Wenn die Verwendung von wichtig die richtige Wahl ist

Pranav C Balan
quelle
40
Wichtig ist eine schlechte Praxis. Bald wird der gesamte Code wichtig!
TPAKTOPA
25

Alternativ zum importantSchlüsselwort können Sie den Selektor spezifischer gestalten, z. B.:

.left.background-none { background:none; }

(Hinweis: kein Leerzeichen zwischen den Klassennamen).

In diesem Fall gilt die Regel, wenn beide .leftund .background-noneim Klassenattribut aufgeführt sind (unabhängig von der Reihenfolge oder Nähe).

Marc Audet
quelle
25

Sie sollten überschreiben, indem Sie die Spezifität Ihres Stils erhöhen . Es gibt verschiedene Möglichkeiten, die Spezifität zu erhöhen. Die Verwendung der !importantEffektspezifität ist eine schlechte Praxis, da sie die natürliche Kaskadierung in Ihrem Stylesheet unterbricht.

Das folgende Diagramm von css-tricks.com hilft Ihnen dabei, die richtige Spezifität für Ihr Element basierend auf einer Punktestruktur zu erstellen. Welche Spezifität höhere Punkte hat, wird gewinnen. Klingt nach einem Spiel - nicht wahr?

Geben Sie hier die Bildbeschreibung ein

Beispielberechnungen zur Kasse hier auf css-tricks.com . Dies wird Ihnen helfen, das Konzept sehr gut zu verstehen und es dauert nur 2 Minuten.

Wenn Sie dann verschiedene Spezifitäten selbst herstellen und / oder vergleichen möchten, versuchen Sie diesen Spezifitätsrechner: https://specificity.keegan.st/ oder verwenden Sie einfach herkömmliches Papier / Bleistift.

Weitere Informationen finden Sie in MDN Web Docs .

Alles Gute für die Nichtbenutzung !important.

Usman
quelle
9

Wenn Sie die bakground-noneKlasse nach den anderen Klassen auflisten, überschreiben ihre Eigenschaften die bereits festgelegten. Es besteht keine Notwendigkeit, !importanthier zu verwenden .

Beispielsweise:

.red { background-color: red; }
.background-none { background: none; }

und

<a class="red background-none" href="#carousel">...</a>

Der Link hat keinen roten Hintergrund. Bitte beachten Sie, dass dies nur Eigenschaften überschreibt, deren Selektor weniger oder gleich spezifisch ist.

Ruud
quelle
Danke für die Antwort! Ich habe dies als erste Lösung versucht, aber aus irgendeinem Grund hat es nicht funktioniert!
user3075049
Diese Art des Überschreibens von CSS-Klassen funktioniert nicht, wenn die Stile auf eine bestimmte Weise wie .form-horizontal .form-group {margin-left: -15px} definiert sind. Hier müssen Sie! Wichtig verwenden
DanKodi
add! wichtig zu .background-none {Hintergrund: keine! importatn; } das funktioniert gut
Santhosh
1

LIFO ist die Art und Weise, wie der Browser CSS-Eigenschaften analysiert. Wenn Sie Sass verwenden, deklarieren Sie eine Variable mit dem Namen

"$ header-background: red;"

Verwenden Sie es, anstatt Werte wie Rot oder Blau direkt zuzuweisen. Wenn Sie überschreiben möchten, weisen Sie den Wert einfach neu zu

"$ header-background: blue"

dann

Hintergrundfarbe: $ Header-Hintergrund;

es sollte reibungslos überschreiben. Die Verwendung von "! Important" ist nicht immer die richtige Wahl. Es ist nur ein Hotfix

Ignatius Andrew
quelle