Kaskada i dziedziczenie CSS
Arkusz stylów jest „aplikowany” na dokument wg reguł kaskady i dziedziczenia.
Kaskada decyduje, które właściwości zostaną zaaplikowane. Jeśli kilka reguł pasuje do danego elementu w dokumencie, to nałożą się wg ich ważności. Właściwości z najważniejszych reguł przykryją właściwości z mniej ważnych.
p.wazny {color: red}
p {color:blue; background: yellow;}
<p class="wazny">
ten tekst będzie czerwony na żółtym tle</p>
Selektorp.wazny
jest bardziej szczegółowy, niżp
. Przez to pierwsza reguła jest ważniejsza od drugiej i akapit będzie miał czerwony kolor tekstu. Ponieważ kaskada jest osobna dla każdej właściwości, akapit będzie miał także ustalony kolor tła nadany w mniej ważnej regule, bo nie został on zmieniony w ważniejszej.
ważność autor-user. Zmieniła się w CSS21.
Ważność określa kolejno:
- !important
- reguły oznaczone jako ważne mają pierwszeństwo
- precyzja selektora
- im precyzyjniejszy selektor, tym ważniejszy.
- kolejność dołączania arkuszy
- później dołączone arkusze są ważniejsze.
- kolejność danej reguły
- późniejsze nadpisują wcześniejsze
p {color: red !important;}
jest ważniejsze, niż:ul#menu > li > a {color:blue}
ponieważ!important
nadaje większą ważność pierwszej regule, niż precyzja selektora drugiej.p {background: blue url(foo.png) 50% 50% no-repeat;}
p {background-color: red;}
Paragrafy będą miały czerwone tło z wyśrodkowaną na nim grafiką. Pierwsza reguła ustali wszystkie wartości dla tła, a druga zmieni z nich tylko kolor.
Najpierw za wartościami właściwości dodaj !important
:
.przyklad {color:red !important;}
Jeśli to pomaga, to znaczy, że w którymś z arkuszy jest precyzyjniejszy selektor pasujący do tego samego elementu. Możesz pozostawić !important
albo zmienić selektor na precyzyjniejszy (patrz niżej).
Jeśli to nie pomaga, to upewnij się, że selektor na pewno pasuje do tego elementu w dokumencie, którego się spodziewasz. Możesz mieć gdzieś literówkę albo używać selektorów w nieodpowiedniej kolejności. Możesz nadać elementowi identyfikator i użyć selektora identyfikatora — to prosty zestaw, który najpewniej zadziała.
<p id="to-na-pewno-ten">
test</p>
#to-na-pewno-ten {color:red;}
Upewnij się też, że arkusz nie zawiera błędów składniowych, bo one mogą powodować ignorowanie nawet całych reguł.
Najmniejszą precyzję i tym samym ważność ma selektor ogólny (*
). W dalszej kolejności, najogólniejsze są selektory zawierające nazwy elementów i pseudoelementów (p
, :first-letter
...). Dokładniejsze od nich są selektory atrybutów, klas i pseudoklas ([type=submit]
, .abc
, :hover
...). Jeszcze precyzyjniejsze są selektory identyfikatorów (#abc
). Nad wszystkimi selektorami góruje atrybut style
elementów HTML (często używany za pośrednictwem Javascript).
atrybut style został pominięty, chyba jednak trzeba go gdzieś wcisnąć...
Ważność selektora złożonego z kilku selektorów prostych jest sumą precyzji jego składników.
Jeśli zatem chcemy porównać precyzję dwóch selektorów, możemy to zrobić tak:
- Policzyć ilość identyfikatorów — im więcej, tym selektor dokładniejszy.
- Jeśli jest tyle samo, policzyć ilość klas, pseudoklas i innych atrybutów — im więcej, tym dokładniej.
- Jeśli jest tyle samo, policzyć ilość elementów i pseudoelementów — im więcej, tym precyzyjniej.
Kilka przykładów uporządkowanych od najogólniejszego do najdokładniejszego:
*
li
li:first-line
ul ol+li
h1 + *[rel=up]
ul ol li.red
li.red.level
#x34y
style=""
W typowym arkuszu stylów nie przypisuje wszystkich właściwości wszystkim elementom (np. ustawia się preferowany krój czcionki tylko dla <body>
). Pozostałe elementy otrzymują swoje właściwości przez dziedziczenie, czyli przekazanie właściwości z elementu-rodzica do elementu-dziecka.
Nie wszystkie właściwości są domyślnie dziedziczone. Np. krój i wielkość pisma jest, ale tło i obramowanie — nie. Wymusić dziedziczenie można podając inherit
jako wartość.
p {color: green}
strong {color: yellow;}
<p>
ten tekst będzie zielony, ten <em>
też będzie</em>
, a ten <strong>
już nie!</strong></p>