Jak przesłonić właściwości klasy CSS przy użyciu innej klasy CSS

102

Jestem całkiem nowy w CSS3 i chcę mieć możliwość wykonywania następujących czynności:

Kiedy dodaję klasę do elementu, nadpisuje ona właściwości innej klasy używanej w tym konkretnym elemencie.

Powiedzmy, że tak

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

Chcę mieć możliwość dodania klasy o nazwie bakground-none, która zastąpi domyślne tło w klasie left.

Dzięki!

user3075049
źródło

Odpowiedzi:

93

Istnieje kilka sposobów nadpisywania właściwości. Zakładając, że masz

.left { background: blue }

np. którekolwiek z poniższych mogłoby go zastąpić:

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

Pierwsze dwa „wygrywają” dzięki specyficzności selektora; trzeci wygrywa !important, tępy instrument.

Możesz również zorganizować swoje arkusze stylów tak, aby np

.background-none { background: none; }

wygrywa po prostu porządku, czyli będąc po skądinąd jednakowo „potężnego” reguły. Ale to nakłada ograniczenia i wymaga zachowania ostrożności przy każdej reorganizacji arkuszy stylów.

To wszystko przykłady CSS Cascade , kluczowej, ale powszechnie niezrozumianej koncepcji. Definiuje dokładne zasady rozwiązywania konfliktów między regułami arkusza stylów.

PS użyłem lefti background-nonetak jak zostały użyte w pytaniu. Są to przykłady nazw klas, których nie należy używać, ponieważ odzwierciedlają one określone renderowanie, a nie role strukturalne lub semantyczne.

Jukka K. Korpela
źródło
Napisałeś: Są to przykłady nazw klas, których nie należy używać, ponieważ odzwierciedlają one określone renderowanie, a nie role strukturalne lub semantyczne. Czy mógłbyś to rozwinąć, proszę? Dlaczego należy lefti background-nonenależy tego unikać?
Sokrates
1
@Socrates: Niektórzy ludzie czują, że klasy css należy podawać tylko nazwy, które identyfikują jaki element jest ona stosowana do jest lub nie (np button, name-labelitp). Inni uważają, że CSS staje się niewykonalna, jeśli używasz tego podejścia i należy użyć „narzędzie pierwszego” lub „funkcjonalny” css gdzie zajęcia odpowiadają wartości nieruchomości (np margin-top-4, width-10itp). Historycznie rzecz biorąc, dominowało podejście „semantyczne”, podczas gdy ostatnio podejście „funkcjonalne” zdobywało zwolenników. Wypróbuj oba na średniej wielkości projekcie, a następnie sam zdecyduj, który jest lepszy.
Mattia
61

Po prostu użyj !importantgo, aby zastąpić

background:none !important;

Chociaż mówi się, że jest to zła praktyka, !importantmoże być przydatna w przypadku klas narzędzi, po prostu musisz jej używać odpowiedzialnie, sprawdź to: Kiedy Korzystanie z ważnych jest właściwym wyborem

Pranav C Balan
źródło
45
! ważne to zła praktyka. Wkrótce cały kod staje się! Ważny.
TPAKTOPA
28

Alternatywnie do importantsłowa kluczowego możesz sprecyzować selektor, na przykład:

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

(Uwaga: brak spacji między nazwami klas).

W takim przypadku reguła będzie obowiązywać, gdy oba .lefti .background-nonezostaną wymienione w atrybucie klasy (niezależnie od kolejności lub bliskości).

Marc Audet
źródło
27

Powinieneś to zmienić, zwiększając Specyfika swojej stylizacji. Specyfika można zwiększyć na różne sposoby. Korzystanie ze !importantspecyficzności efektów jest złą praktyką, ponieważ przerywa naturalne kaskadowanie w arkuszu stylów.

Poniższy diagram zaczerpnięty z css-tricks.com pomoże Ci stworzyć odpowiednią specyfikację dla Twojego elementu w oparciu o strukturę punktów. Niezależnie od tego, która specyfika ma wyższe punkty, wygra. Brzmi jak gra - prawda?

wprowadź opis obrazu tutaj

Przykładowe obliczenia w usłudze Checkout tutaj na css-tricks.com . Pomoże Ci to bardzo dobrze zrozumieć koncepcję i zajmie tylko 2 minuty.

Jeśli chcesz samodzielnie wytwarzać i / lub porównywać różne specyfikacje, wypróbuj ten kalkulator specyficzności: https://specificity.keegan.st/ lub możesz po prostu użyć tradycyjnego papieru / ołówka.

Aby dowiedzieć się więcej, wypróbuj MDN Web Docs .

Wszystkiego najlepszego, aby nie używać !important.

Usman
źródło
9

Jeśli umieścisz bakground-noneklasę po innych klasach, jej właściwości zastąpią te już ustawione. Nie ma potrzeby używania !importanttutaj.

Na przykład:

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

i

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

Link nie będzie miał czerwonego tła. Należy pamiętać, że zastępuje to tylko właściwości, które mają mniej lub równie dokładny selektor.

Ruud
źródło
Dziękuję za odpowiedź! Wypróbowałem to jako pierwsze rozwiązanie, ale z jakiegoś powodu nie zadziałało!
user3075049
Ten sposób nadpisywania klas css nie zadziała, jeśli style są zdefiniowane w określony sposób, np. .Form-horizontal .form-group {margin-left: -15px}. Tutaj będziesz musiał użyć! Ważne
DanKodi
dodaj! ważne do .background-none {background: none! importatn; } to działa dobrze
santhosh,
1

LIFO to sposób, w jaki przeglądarka analizuje właściwości CSS. Jeśli używasz Sass, zadeklaruj zmienną o nazwie as

"$ header-background: red;"

użyj go zamiast bezpośredniego przypisywania wartości, takich jak czerwony lub niebieski. Jeśli chcesz przesłonić, po prostu ponownie przypisz wartość

„$ header-background: blue”

następnie

background-color: $ header-background;

powinien płynnie zastąpić. Używanie „! Important” nie zawsze jest właściwym wyborem… to tylko poprawka

Ignacy Andrzej
źródło