Pseudoklasy opisują stan i pozycję elementu (:hover, :visited, :nth-child, :checked), pseudoelementy formatują fragment, którego nie ma w kodzie HTML (::first-letter, ::before). Kolejność LVHA, zebra w tabeli i zapis z jednym albo dwoma dwukropkami. Lekcja 4.3 kursu INF.03.
Pseudoklasa to dopisek do selektora, który opisuje STAN albo POZYCJĘ elementu: wskazany kursorem, odwiedzony, zaznaczony, drugi w kolejności. Pseudoelement to dopisek, który wskazuje FRAGMENT elementu nieistniejący w kodzie HTML: pierwszą literę akapitu, pierwszy wiersz tekstu albo treść dostawioną przed zawartością i po niej. W części pisemnej wracają pytania „która pseudoklasa formatuje odwiedzony odnośnik", „co zrobi tr:nth-child(even)", „jak sformatować pierwszą literę akapitu" i „w jakim kolorze będzie hiperłącze po powrocie na stronę". W zadaniu praktycznym arkusz pisze wprost „zmiana koloru tła wiersza tabeli po najechaniu kursorem", a listę ocenianych poleceń dla stylu CSS zwykle zamyka punkt z pseudoklasą albo pseudoelementem.
Cztery stany odnośnika i kolejność LVHA
Odnośnik ma cztery stany, a każdy z nich ma własną pseudoklasę. :link obejmuje odnośnik jeszcze nieodwiedzony, :visited (odwiedzony) ten, którego adres jest już w historii przeglądarki, :hover (najechanie) ten, nad którym stoi wskaźnik myszy, a :active (aktywny) ten w trakcie naciskania przycisku myszy. Pseudoklasę dopisuje się do selektora bez spacji, zaraz za nazwą znacznika albo klasy: a:hover, tr:hover, li:hover.
a:link {
color: DarkSlateGray;
}
a:visited {
color: Purple;
}
a:hover {
color: Tomato;
}
a:active {
color: Red;
}
Kolejność w arkuszu nie jest ozdobna. Wszystkie cztery reguły mają tę samą specyficzność, więc przy odnośniku pasującym do dwóch z nich wygrywa ta zapisana NIŻEJ, tak jak opisuje lekcja o dołączaniu stylów i kaskadzie. Gdy a:hover stoi przed a:visited, odwiedzony odnośnik nie zmieni koloru po najechaniu, bo późniejsza reguła :visited nadpisze kolor ustawiony dla najechania. Zapamiętuje się to jako kolejność LVHA: :link, :visited, :hover, :active. Piąta pseudoklasa, :focus (uaktywnienie), obejmuje element wybrany klawiszem Tab albo kliknięciem w pole formularza i wstawia się między :visited a :hover. W stanie :visited przeglądarka pozwala zmienić praktycznie tylko kolory, żeby strona nie odczytała z wyglądu odnośników historii odwiedzin. Pułapka: :hover znaczy „wskaźnik myszy stoi nad elementem", a :active „element jest właśnie naciskany". Pytanie o wyróżnienie elementu wskazywanego kursorem ma odpowiedź :hover, nigdy :active.
Pseudoklasy strukturalne: pozycja wśród rodzeństwa
Pseudoklasa strukturalna wybiera element po jego MIEJSCU wśród elementów mających tego samego rodzica, bez dokładania klas do kodu HTML. Dzięki temu zebrę w tabeli cen albo wyróżnienie pierwszej pozycji menu robi się w jednym miejscu arkusza, a nie przez dopisywanie class="parzysty" do co drugiego wiersza.
:first-child
element będący pierwszym dzieckiem swojego rodzica
:last-child
element będący ostatnim dzieckiem
:nth-child(2)
drugie dziecko, licząc od 1
:nth-child(odd)
dzieci nieparzyste, czyli 1, 3, 5, 7
:nth-child(even)
dzieci parzyste, czyli 2, 4, 6, 8
:nth-child(3n)
co trzecie dziecko, czyli 3, 6, 9
:nth-of-type(2)
drugi element tego samego typu wśród rodzeństwa
:not(.promocja)
każdy element poza pasującym do zapisu w nawiasie
nav li:first-child {
font-weight: bold;
}
tbody tr:nth-child(even) {
background-color: #f2f2f2;
}
tbody tr:nth-child(3n) {
border-bottom: 1px solid #222;
}
article p:not(.uwaga) {
color: #222;
}
Liczenie zaczyna się od 1, więc even to wiersz drugi, czwarty i szósty, a odd to pierwszy, trzeci i piąty. Druga rzecz do sprawdzenia w pytaniu: :nth-child liczy WSZYSTKIE dzieci rodzica, a nie tylko te pasujące do znacznika stojącego przed dwukropkiem. Zapis p:nth-child(2) znaczy „akapit, który jest drugim dzieckiem swojego rodzica", więc gdy drugim dzieckiem jest nagłówek, nie zadziała nic. p:nth-of-type(2) pomija rodzeństwo innych typów i trafia w drugi akapit niezależnie od tego, co stoi między akapitami. Tak samo li:first-child to pierwszy punkt KAŻDEJ listy na stronie, bo każda lista jest osobnym rodzicem.
Pseudoklasy formularza
Pseudoklasy formularza opisują stan kontrolki: zaznaczenie, blokadę i wynik sprawdzenia wpisanej wartości. Dzięki nim błędne pole podświetla się bez jednej linii JavaScriptu, bo przeglądarka sama zna reguły walidacji HTML5 z lekcji o formularzach. input:required {
border: 1px solid DarkSlateGray;
}
input:invalid {
border: 1px solid Tomato;
}
input:focus {
background-color: #f4f4f4;
}
input:disabled {
color: #999999;
}
:checked (zaznaczony) obejmuje zaznaczone pole wyboru i wybrany przycisk opcji, :disabled (wyłączony) kontrolkę z atrybutem disabled, :required (wymagany) pole z atrybutem required, a :valid (poprawny) i :invalid (błędny) pole odpowiednio spełniające i łamiące swoje reguły, czyli zakres min i max, typ email albo wzorzec pattern. Pole wymagane i puste jest błędne od razu po wczytaniu strony, więc ramka z :invalid pojawia się, zanim ktokolwiek zacznie pisać. Podświetlenie jest podpowiedzią dla użytkownika, a nie zabezpieczeniem: dane sprawdza się jeszcze raz po stronie serwera.
Pseudoelementy i zapis z dwoma dwukropkami
Pseudoelement formatuje fragment elementu, którego w kodzie HTML nie ma, albo dostawia do elementu treść, której autor strony nie napisał. Takiego fragmentu nie da się wskazać zwykłym zapisem z lekcji o selektorach, bo pierwsza litera akapitu nie jest osobnym znacznikiem. Pseudoelement
Co formatuje
::first-letter
pierwszą literę bloku tekstu, czyli inicjał
::first-line
pierwszy wyświetlony wiersz, zmienny przy zwężeniu okna
::before
treść dostawioną przed zawartością elementu
::after
treść dostawioną po zawartości elementu
::selection
fragment zaznaczony przez użytkownika
::placeholder
podpowiedź widoczną w pustym polu formularza
article p::first-letter {
font-size: 400%;
color: DarkSlateGray;
}
article p::first-line {
font-weight: bold;
}
h2::before {
content: "// ";
color: Tomato;
}
::before i ::after wymagają właściwości content (treść): bez niej nie powstaje nic, a wartością bywa napis w cudzysłowie, pusty napis content: "" przy samym ozdobniku graficznym albo obraz wskazany zapisem url(). Dostawiona treść nie trafia do kodu strony, więc wyszukiwarka i czytnik ekranu mogą ją pominąć: idą tam ozdobniki, jednostki i numery, nigdy zdanie ważne dla czytelnika. ::first-letter i ::first-line działają wyłącznie na elementach blokowych, czyli na akapicie i nagłówku, a nie na odnośniku w środku zdania.
Różnica zapisu bywa całym pytaniem: pseudoklasa ma JEDEN dwukropek, pseudoelement DWA. Cztery najstarsze pseudoelementy (::first-letter, ::first-line, ::before, ::after) przeglądarki przyjmują też z jednym dwukropkiem, bo tak zapisywał je CSS2, i w takiej postaci stoją jeszcze w bankach pytań. Nowsze, jak ::selection, wymagają już dwóch, więc w kodzie pisanym dziś używa się dwóch dwukropków wszędzie.
Pułapka: p::first-letter to pseudoelement, p.first-letter to akapit z klasą o nazwie first-letter, #first-letter to element o takim identyfikatorze, a p [first-letter] to zapis selektora atrybutu. Cały zestaw odpowiedzi rozstrzyga się na różnicy tych czterech znaków.
Sklep: menu, zebra, inicjał i złotówki
Witryna sklepu komputerowego z działu o HTML dostaje w pliku styl.css cztery reguły. Menu to lista odnośników w <nav>, cennik to tabela z <tbody>, a opisy produktów siedzą w <article>, tak jak zbudowała je lekcja o znacznikach sekcji. nav li a:hover {
color: Tomato;
}
tbody tr:nth-child(even) {
background-color: #f4f4f4;
}
tbody tr:hover {
background-color: DarkSlateGray;
color: #ffffff;
}
article p::first-letter {
font-size: 250%;
color: DarkSlateGray;
}
Pozycja menu zmienia kolor dopiero pod kursorem, a poza nim wygląda jak reszta. Co drugi wiersz cennika ma jasne tło, przez co tabela czyta się wierszami, a wiersz pod kursorem robi się ciemny z białym tekstem. Pierwsza litera każdego opisu produktu jest dwa i pół raza większa od reszty akapitu. Kolejność reguł znaczy tu tyle samo co przy odnośnikach: tr:hover stoi za tr:nth-child(even), więc podświetlenie wskazanego wiersza wygrywa z tłem zebry. Gdyby kolumna z ceną w tabeli cennika trzymała samą liczbę, jednostkę dopisze arkusz stylów: td.cena::after {
content: " zł";
}
Na egzaminie
Pytania pisemne mają kilka stałych kształtów. Pierwszy to nazwanie zapisu: a:link {color: red} definiuje pseudoklasę, a nie klasę, identyfikator czy pseudoelement, natomiast p::first-letter to pseudoelement. Drugi to wskazanie pseudoklasy do zadanego opisu: element zmieniający kolor czcionki po najechaniu kursorem to :hover, odnośnik już otwarty to :visited, a kolor hiperłącza „po powrocie na stronę" bierze się zawsze z reguły zapisanej dla :visited. Trzeci to odczytanie gotowej reguły: tr:nth-child(even) wypełnia tłem wiersze PARZYSTE, a nie nieparzyste. Czwarty to formatowanie pierwszej litery akapitu, gdzie poprawną odpowiedzią jest p::first-letter, a nie klasa p.first-letter, identyfikator #first-letter ani selektor atrybutu; pierwszemu wierszowi tekstu odpowiada p::first-line. Piąty to reguła li:hover { color: Maroon; } z pytaniem, co zrobi: zmieni kolor tekstu punktu listy po najechaniu kursorem, a nie sformatuje elementy o identyfikatorze hover, bo identyfikator zaczyna się krzyżykiem.
Pomyłki wracają w tych samych miejscach. :nth-child liczy od 1, więc even obejmuje wiersz drugi, czwarty i szósty, a pierwszy zostaje bez tła. Pseudoklasa ma jeden dwukropek, pseudoelement dwa, choć stare zapisy z jednym dwukropkiem nadal działają i pojawiają się wśród odpowiedzi. ::before i ::after bez właściwości content nie wyświetlą niczego. Pseudoklasa dopisana ze spacją, jak tr :hover, to już związek selektorów i wskazuje element w środku wiersza, a nie wiersz.
W zadaniu praktycznym polecenia z tej lekcji brzmią zwykle „zmiana koloru tła wiersza tabeli po najechaniu na niego kursorem myszy" oraz „powiększona pierwsza litera akapitu". Tłumaczy się je wprost: pierwsze to tr:hover { background-color: ... }, drugie to p::first-letter z podanym rozmiarem czcionki. Reguła musi trafić do ZEWNĘTRZNEGO pliku dołączonego przez <link>, bo styl w atrybucie style kosztuje punkt, a stanu po najechaniu i tak nie da się w nim zapisać. Egzaminator sprawdza efekt myszą, więc po zapisaniu arkusza przejedź kursorem po menu i po tabeli, zamiast ufać samemu kodowi.
Ściąga
a:link
odnośnik jeszcze nieodwiedzony
a:visited
odnośnik odwiedzony, kolor po powrocie na stronę
a:hover
element wskazywany kursorem myszy
a:active
element w trakcie naciskania
input:focus
pole formularza wybrane do pisania
tr:hover
wiersz tabeli pod kursorem, tło zmienia background-color
li:first-child
pierwszy punkt każdej listy
tr:nth-child(even)
wiersze parzyste: 2, 4, 6
tr:nth-child(odd)
wiersze nieparzyste: 1, 3, 5
li:nth-child(3n)
co trzeci element: 3, 6, 9
p:nth-of-type(2)
drugi akapit wśród rodzeństwa tego typu
input:checked
zaznaczone pole wyboru albo przycisk opcji
input:invalid
pole z wartością łamiącą reguły walidacji
p::first-letter
pierwsza litera akapitu, inicjał
p::first-line
pierwszy wyświetlony wiersz akapitu
h2::before
treść z content dostawiona przed nagłówkiem
td.cena::after
treść z content dostawiona po komórce, tu jednostka
Pobierz ściągę PDF