Menu

CSS !important: jak działa i kiedy go używać

!important sprawia, że deklaracja wygrywa ze zwykłymi deklaracjami bez względu na ich specyficzność. Dowiedz się dokładnie, co pokonuje, co pokonuje jego, jak działa pod spodem specyficzność i jakie są czystsze sposoby na wygranie konfliktu stylów.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Co robi !important

Dodanie !important po wartości sprawia, że ta deklaracja wygrywa z każdą zwykłą deklaracją tej samej właściwości na tym samym elemencie. Specyficzność selektora i kolejność w kodzie przestają mieć znaczenie.

Bez !important wygrałby selektor ID i tekst byłby niebieski. Usuń !important w edytorze, żeby to zobaczyć.

Składnia

selector {
  property: value !important;
}

Pisze się go po wartości, a przed średnikiem. Dotyczy tylko tej jednej deklaracji, a nie całej reguły. Działa też we właściwościach skróconych (margin: 0 !important; sprawia, że wszystkie cztery strony są important) i w atrybucie style.

Co wygrywa z czym

Dla stylów napisanych przez autora strony, od najsłabszego do najsilniejszego:

PozycjaDeklaracjaPrzykład
1Zwykła deklaracja w arkuszu stylówp { color: blue; }
2Zwykła deklaracja w atrybucie style<p style="color: blue">
3!important w arkuszu stylówp { color: blue !important; }
4!important w atrybucie style<p style="color: blue !important">

W obrębie jednej pozycji decyduje specyficzność, a potem kolejność deklaracji: wygrywa późniejsza.

To jedyne uzasadnione codzienne zastosowanie !important: nadpisanie stylu inline, którego nie możesz edytować, na przykład wstawionego przez widżet z zewnętrznej biblioteki.

Gdy obie deklaracje mają !important

!important przeciwko !important wraca do zwykłych zasad: wygrywa wyższa specyficzność, a przy remisie późniejsza deklaracja.

Tak właśnie eskaluje !important: gdy jedna reguła go użyje, reguła, która musi ją nadpisać, też musi go użyć, a specyficzność znów zaczyna rosnąć.

Specyficzność CSS w jednej tabeli

Specyficzność to waga selektora. Policz trzy liczby:

KolumnaCo się liczyPrzykładowy selektorSpecyficzność
ASelektory ID#nav(1,0,0)
BKlasy, atrybuty, pseudoklasy.btn, [type="text"], :hover(0,1,0) każdy
CSelektory typu, pseudoelementyp, ::before(0,0,1) każdy
brak*, kombinatory (>, +, ~, spacja)*, ul > linic nie dodają

Najpierw porównaj kolumnę A; dopiero przy remisie patrz na B, potem na C. Dlatego #nav a (1,0,1) pokonuje .menu .item .link a (0,3,1): jeden ID waży więcej niż dowolna liczba klas.

Zrozumienie tej tabeli pozwala unikać !important: większość problemów typu "mój CSS nie działa" to bardziej specyficzna reguła gdzie indziej, widoczna w panelu Styles w DevTools, gdzie twoja deklaracja jest przekreślona.

Czystsze alternatywy

  • Dorównaj specyficzności i polegaj na kolejności. Wczytaj swój arkusz stylów po arkuszu biblioteki i użyj selektora co najmniej tak samo specyficznego.
  • Obniż specyficzność drugiej reguły przez :where(). Wszystko wewnątrz :where() liczy się jako zero, więc style bazowe napisane w ten sposób łatwo nadpisać.
  • Użyj zmiennej CSS jako punktu zaczepienia. Komponent, który odczytuje var(--btn-bg), można dostosować bez walki z jego selektorami. Zobacz zmienne CSS.

Ustawianie !important z JavaScriptu

element.style.color = 'red !important' nie działa: wartość jest nieprawidłowa i zostaje zignorowana. Użyj setProperty z trzecim argumentem:

el.style.setProperty('color', '#f59e0b', 'important');

Częste błędy

  • Umieszczanie go w złym miejscu. color: !important red; jest nieprawidłowe; pisze się go po wartości.
  • Używanie go w @keyframes. Deklaracje oznaczone !important wewnątrz klatek kluczowych są ignorowane.
  • Rozwiązywanie nim każdego konfliktu. Znajdź zwycięską regułę w DevTools i zamiast tego dorównaj jej specyficzności albo ją obniż.
  • Oczekiwanie, że wpłynie na inną właściwość. color: red !important nic nie robi z background.
  • Zapominanie, że !important inline pokonuje twoje. Żadna reguła w arkuszach stylów strony nie nadpisze style="color: red !important"; zmień sam atrybut, na przykład JavaScriptem.

Najczęściej zadawane pytania

Co robi !important w CSS?

Daje jednej deklaracji pierwszeństwo przed każdą zwykłą deklaracją tej samej właściwości na tym samym elemencie, bez względu na specyficzność selektora czy kolejność. Pisze się go po wartości: color: red !important;.

Jak nadpisać !important?

Inną deklaracją !important, która ma wyższą specyficzność albo taką samą specyficzność i późniejsze miejsce w arkuszu stylów. Atrybut style z !important pokonuje każde !important z arkusza stylów.

Czy !important nadpisuje style inline?

Tak. Deklaracja z arkusza stylów oznaczona !important pokonuje zwykłą deklarację w atrybucie style. Nie pokonuje deklaracji inline, która sama jest oznaczona !important.

Czy używanie !important to zła praktyka?

Jeśli służy do wygrania walki o specyficzność, tak: kolejne nadpisanie też będzie potrzebować !important, a arkusz stylów staje się trudny do zmiany. Ma sens w klasach narzędziowych, które zawsze muszą działać (jak .hidden), przy nadpisywaniu stylów inline z zewnętrznych bibliotek i w arkuszach stylów użytkownika.

Jak oblicza się specyficzność CSS?

Policz trzy kolumny: selektory ID, potem klasy, atrybuty i pseudoklasy, potem selektory typu i pseudoelementy. Porównuj kolumna po kolumnie od początku, więc #nav a (1,0,1) pokonuje .menu .item a (0,2,1). Selektor uniwersalny * i kombinatory nic nie dodają.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ