Selektory CSS od podstaw: selektor elementu, klasy, identyfikatora, uniwersalny, grupowanie przecinkiem, selektory atrybutu oraz kombinatory potomka, dziecka i braci, z przykładami na stronie sklepu. Lekcja 4.2 kursu INF.03.
Selektor to część reguły CSS stojąca przed nawiasem klamrowym, która mówi, KTÓRE elementy strony dostaną opisany w niej styl. Reszta reguły to deklaracje, czyli pary właściwość i wartość, ale bez trafionego selektora nie zadziała żadna z nich. W części pisemnej wracają pytania „co oznacza zapis p > i", „którym selektorem sformatować wszystkie obrazy w akapicie", „czego dotyczy zapis .uzytkownik", „co robi img + p" oraz „w co trafia *". W zadaniu praktycznym arkusz pisze „style wyłącznie przez selektor dla danego znacznika" albo „zdefiniować styl dla klasy", więc źle dobrany selektor kosztuje punkt, choć strona wygląda wtedy prawie tak samo.
Selektory proste: element, klasa, identyfikator
Selektor prosty wskazuje elementy po jednej cesze: po nazwie znacznika, po klasie albo po identyfikatorze. Selektor elementu to sama nazwa znacznika, bez żadnego znaku przed nią, i obejmuje WSZYSTKIE takie elementy w dokumencie: reguła dla p sformatuje każdy akapit strony. To właśnie o niego prosi arkusz zdaniem „style wyłącznie przez selektor dla danego znacznika".
Selektor klasy to kropka i nazwa. Klasa jest wartością atrybutu class w HTML, więc żeby z niej skorzystać, trzeba tę wartość najpierw dopisać do znaczników. Tę samą klasę wolno dać dowolnej liczbie elementów i różnym znacznikom naraz, a jeden element może nieść kilka klas rozdzielonych spacją: class="cena promocja" łapie się i na .cena, i na .promocja. Selektor identyfikatora to krzyżyk i nazwa. Wartość atrybutu id jest na stronie unikalna, więc taki selektor trafia dokładnie w jeden element i nadaje się do banera, stopki albo kotwicy, do której prowadzi odnośnik href="#baner".
Selektor
Trafia w
Przykład
p
wszystkie akapity, wskazane nazwą znacznika
p { color: #222; }
.cena
elementy z klasą cena w atrybucie class
.cena { color: Tomato; }
#baner
jeden element o id="baner"
#baner { height: 80px; }
*
każdy element dokumentu
* { font-family: Helvetica; }
h1, h2
nagłówki obu stopni, grupowanie przecinkiem
h1, h2 { text-align: center; }
p.uwaga
tylko akapity z klasą uwaga
p.uwaga { color: Tomato; }
a#logo
odnośnik o id="logo"
a#logo { border: none; }
Selektor uniwersalny * trafia w każdy element dokumentu, od <html> po ostatnią komórkę tabeli, więc odpowiedź na pytanie z banku brzmi: dotyczy całego kodu HTML jako formatowanie domyślne, a nie znaczników o klasie albo identyfikatorze równym *. Używa się go do rzeczy wspólnych dla całej strony, na przykład do wyzerowania marginesów zewnętrznych albo do ustawienia jednego kroju czcionki.
Dwa zapisy skracają arkusz. Grupowanie przecinkiem daje jednej deklaracji kilka selektorów naraz: h1, h2 znaczy tyle samo co dwie osobne reguły o identycznej treści. Łączenie bez spacji zawęża trafienie do elementu spełniającego oba warunki: p.uwaga to akapit, który ma klasę uwaga, a a#logo to odnośnik o tym identyfikatorze. Oba zapisy stoją obok siebie w pytaniu o formatowanie akapitów klasy tekst oraz bloku o identyfikatorze obrazki, gdzie poprawna odpowiedź brzmi p.tekst, div#obrazki.
Pułapka: p.uwaga bez spacji to akapit Z KLASĄ uwaga, a p .uwaga ze spacją to dowolny element z tą klasą wewnątrz akapitu. Spacja jest tu znakiem działania, nie ozdobą.
Selektory atrybutu
Selektor atrybutu wybiera elementy po tym, czy mają dany atrybut i jaką ma on wartość. Zapisuje się go w nawiasie kwadratowym, zwykle zaraz po nazwie znacznika. Zysk jest taki, że styl trafia w grupę elementów bez dopisywania czegokolwiek do HTML: formularz zamówienia ma kilka pól liczbowych, a jeden selektor input[type="number"] zwęża je wszystkie naraz i pomija pola tekstowe.
[type]
element, który ma atrybut type, bez względu na wartość
[type="number"]
element, którego type ma dokładnie wartość number
[href^="https"]
odnośnik, którego adres ZACZYNA się od https
[href$=".pdf"]
odnośnik, którego adres KOŃCZY się na .pdf
[href*="sklep"]
odnośnik, którego adres ZAWIERA sklep
[title~="jest"]
element, w którego title stoi całe słowo jest
Trzy znaki przed znakiem równości czyta się jak strzałki: daszek celuje w początek wartości, znak dolara w jej koniec, gwiazdka w dowolne miejsce w środku. Falka jest osobnym przypadkiem i szuka CAŁEGO słowa oddzielonego spacjami, więc [title~="jest"] pominie element o tytule „jesteśmy". Cudzysłów wokół wartości wolno pominąć i banki pytań podają zapis input[type=number] bez niego, ale wersja z cudzysłowem jest zawsze bezpieczna.
input[type="number"] {
width: 60px;
}
a[href$=".pdf"] {
font-weight: bold;
}
Pierwsza reguła zwęża pola liczbowe formularza zamówienia, druga pogrubia w stopce sklepu odnośnik do regulaminu zapisanego w PDF, bez ruszania samego odnośnika w HTML.
Selektory relacji: potomek, dziecko, brat
Kombinator to znak stojący MIĘDZY dwoma selektorami, który mówi, w jakim położeniu względem siebie mają być elementy. Bez niego reguła patrzy na element w oderwaniu od reszty strony, a z nim da się zawęzić styl do jednego bloku: nav a formatuje odnośniki menu i nie tyka odnośników w treści.
potomka
nav a
każdy a wewnątrz nav, na dowolnej głębokości
dziecka
ul > li
tylko li leżący bezpośrednio w ul
brata bezpośredniego
h2 + p
pierwszy p stojący zaraz po h2
braci ogólnych
h2 ~ p
wszystkie p za h2 w tym samym rodzicu
Cztery kopie tego samego drzewa HTML: p img trafia w każdy obraz w akapicie, p > img tylko w bezpośredni, h2 + p w sąsiada, h2 ~ p we wszystkich dalszych
Rysunek pokazuje jedno drzewo cztery razy, z podświetlonymi trafieniami. Selektor potomka p img bierze obraz leżący w akapicie na dowolnej głębokości, także wtedy, gdy stoi w środku odnośnika albo innego znacznika wewnątrz tego akapitu. Selektor dziecka p > img bierze wyłącznie obraz będący bezpośrednią zawartością akapitu, więc obraz schowany o jeden poziom głębiej wypada z gry. Brat bezpośredni h2 + p trafia w jeden element: akapit stojący zaraz za nagłówkiem, i tylko wtedy, gdy nic się między nie nie wcisnęło. Bracia ogólni h2 ~ p trafiają we wszystkie akapity stojące za tym nagłówkiem, byle miały tego samego rodzica.
Rodzeństwo działa tylko w przód. Nie ma kombinatora, który sformatowałby element stojący PRZED innym, więc opis „akapit poprzedzający obraz" nie da się zapisać żadnym z czterech znaków.
Pułapka: p > i to tekst pochylony bezpośrednio wewnątrz akapitu, a p i to każdy tekst pochylony w akapicie, choćby leżał w środku innego znacznika. Zamiana jednego zapisu na drugi zmienia liczbę trafionych elementów.
Ta sama różnica wraca w pytaniu z trójką b > i, b + i i b i. Pierwszy zapis to pochylenie bezpośrednio w pogrubieniu, drugi to pochylony fragment stojący zaraz ZA pogrubionym, trzeci to pochylenie gdziekolwiek w pogrubieniu. Podobnie img + p znaczy akapit stojący bezpośrednio po obrazie, a nie akapit z obrazem w środku ani obraz w akapicie.
Pseudoklasy i pseudoelementy
Pseudoklasa to zapis z dwukropkiem, który wybiera element według stanu, a nie według miejsca w kodzie: a:hover (najechanie) trafia w odnośnik dopiero wtedy, gdy stoi nad nim wskaźnik myszy, a tr:nth-child(even) w parzyste wiersze tabeli. Pseudoelement to zapis z podwójnym dwukropkiem, który sięga po część elementu nieistniejącą w HTML jako osobny znacznik, na przykład p::first-letter (pierwsza litera) albo p::first-line (pierwszy wiersz). Obie grupy mają własną lekcję: pseudoklasy i pseudoelementy. Który selektor kiedy
Wybór zaczyna się od dwóch pytań: ile elementów ma zmienić wygląd i czy wolno ruszać HTML. Nazwa znacznika wystarcza, gdy styl obejmuje wszystkie elementy jednego rodzaju, i to jest domyślna droga na egzaminie praktycznym. Klasa jest właściwa, gdy ten sam wygląd ma wrócić w kilku miejscach albo na różnych znacznikach: cena w tabeli i cena w opisie produktu dostają class="cena" oraz jedną regułę. Identyfikator pasuje do elementu jedynego na stronie, zwłaszcza gdy i tak jest potrzebny jako cel kotwicy. Kombinator potomka zawęża styl do bloku, dzięki czemu aside a i nav a mogą wyglądać inaczej, choć oba dotyczą odnośników.
Gdy dwie reguły dotyczą tego samego elementu i ustawiają tę samą właściwość, wygrywa ta o wyższej specyficzności, czyli licząca więcej identyfikatorów, potem klas, a na końcu nazw znaczników. Liczy to lekcja o dołączaniu stylów i kaskadowości. Styl sklepu w jednym arkuszu
nav a {
color: #f4f4f4;
}
main > section {
padding: 10px;
}
table td {
border: 1px solid #222;
}
input[type="number"] {
width: 60px;
}
Pierwsza reguła rozjaśnia odnośniki menu, bo leżą na ciemnym pasku, i nie dotyka odnośników w treści. Druga daje marginesy wewnętrzne sekcjom leżącym bezpośrednio w bloku głównym, więc sekcja zagnieżdżona o poziom głębiej ich nie dostanie. Trzecia rysuje obramowanie komórek danych w każdej tabeli. Czwarta zwęża pola liczbowe formularza. Piąta rzecz, wyróżnienie ceny promocyjnej, jest inna: wymaga najpierw dopisania klasy do znacznika w HTML, a dopiero potem reguły w arkuszu.
.promocja {
color: Tomato;
}
Na egzaminie
Pytania pisemne o selektory mają kilka stałych kształtów. Pierwszy to odczytanie gotowego zapisu: p > i znaczy „tylko tekst pochylony umieszczony bezpośrednio wewnątrz akapitu", a nie „akapit z przypisaną klasą" ani „pochylony tekst gdziekolwiek na stronie". Drugi to dobranie selektora do opisu: wszystkie obrazy zawarte w akapicie formatuje p img, a nie p#img, p.img ani p+img, bo krzyżyk oznacza identyfikator, kropka klasę, a plus akapit stojący za obrazem. Trzeci to pytanie o klasę: styl .uzytkownik obejmuje wyłącznie te elementy, którym przypisano tę klasę atrybutem class, a nie wszystkie akapity strony. Czwarty to selektor uniwersalny *, czyli formatowanie domyślne całego kodu HTML. Piąty to img + p, czyli akapit występujący bezpośrednio po obrazie. Szósty to trójka b > i, b + i i b i, w której rozstrzyga, czy pochylony tekst ma leżeć w pogrubionym, czy zaraz za nim. Wraca też pytanie o nazewnictwo: w regule h1 { color: blue; } zapis h1 jest selektorem, klasę definiuje się kropką, a a:link i tr:nth-child(even) to pseudoklasy, nie klasy ani pseudoelementy.
W zadaniu praktycznym polecenia są krótkie i trzeba je przełożyć na zapis. „Style wyłącznie przez selektor dla danego znacznika" znaczy: sama nazwa znacznika, bez kropki, bez krzyżyka i bez dopisywania czegokolwiek do HTML, więc p { } przechodzi, a .tresc { } nie. „Zdefiniuj styl dla klasy o nazwie promocja" znaczy kropkę i tę samą nazwę w arkuszu oraz atrybut class="promocja" przy znaczniku, przy czym nazwa musi zgadzać się co do znaku i nie ma w niej polskich liter. Gdy arkusz opisuje wygląd jednego bloku wskazanego z nazwy, na przykład banera, wystarczy selektor identyfikatora tego bloku. Cały arkusz ma być plikiem zewnętrznym dołączonym znacznikiem <link>, bo styl wpisany w atrybut style kosztuje punkt.
Ściąga
p
wszystkie akapity, selektor elementu
.cena
elementy z klasą cena
#baner
jeden element o id="baner"
*
każdy element dokumentu
h1, h2
oba nagłówki naraz, grupowanie przecinkiem
p.uwaga
akapity mające klasę uwaga
input[type="number"]
pola formularza typu liczbowego
a[href$=".pdf"]
odnośniki do plików PDF
nav a
odnośniki wewnątrz menu, na dowolnej głębokości
ul > li
punkty leżące bezpośrednio w liście
h2 + p
akapit stojący zaraz po nagłówku
h2 ~ p
wszystkie akapity za nagłówkiem
Pobierz ściągę PDF