Niedziela 19 Maj 2024r. Godz 00:00:00      
Postów: 251      

Kaskada i dziedziczenie CSS

Arkusz stylów jest „aplikowany” na dokument wg reguł kaskadydziedziczenia.

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>

 Selektor p.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:

  1. Policzyć ilość identyfikatorów — im więcej, tym selektor dokładniejszy.
  2. Jeśli jest tyle samo, policzyć ilość klas, pseudoklas i innych atrybutów — im więcej, tym dokładniej.
  3. 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>