Ten artykuł jest częscią serii

Jeśli nie przeczytałeś jeszcze poprzednich artykułów, to zawsze możesz to nadrobić klikając w przycisk.

Miniatura artykułu

Podstawy CSS: Zaawansowane techniki stylowania

7 minut

Skopiuj link

Data publikacji: 7/13/2023, 10:52:13

Ostatnia aktualizacja: 5/30/2024

Wprowadzenie

W poprzednim artykule poznałeś między innymi selektory atrybutów, pseudo-elementów oraz pseudo-klas, które były tylko wspomniane z dosłownie jednym przykładem, aby nakreślić ich znaczenie. W tym artykule szczegółowo przyjrzymy się większości z nich, wymienię możliwie najwięcej powszechnie stosowanych pseudo-klas i pseudo-elementów. Dobra znajomość i zrozumienie tego materiału zdecydowanie wyróżni Cię z grona osób, które dopiero zaczynają swoją przygodę. Dla przypomnienia dodam, że pseudo-klasy, pseudo-elementy oraz selektory atrybutów służą nie tylko do określania specyficzności elementu. W kolejnych sekcjach opiszę ich użycie oraz najczęstsze zastosowania.

Selektor atrybutów

Możesz używać atrybutów do dokładnego określenia elementów, na które chcesz zastosować style. Pozwalają Ci one wyszukiwać elementy na podstawie określonych wartości lub wzorców występujących w atrybucie elementu, co daje Ci sporo możliwości. Aby ich używać, możesz skorzystać z następujących operatorów:

  • użycie nazwy atrybutu w [ ] nawiasach, jak w przykładzie poniżej wybierze Ci wszystkie elementy, które posiadają atrybut target

przykład:

  • operator = wybiera elementy, których wartość atrybutu jest dokładnie taka sama jak określona wartość.

Powyższy selektor wybierze wszystkie elementy <a>, których atrybut href ma wartość "https://www.google.com" i zastosuje dla nich styl zmieniający kolor czcionki na niebieski.

  • operator *= wybiera elementy, których wartość atrybutu zawiera określony fragment.

Powyższy selektor wybierze wszystkie elementy <input>, których atrybut type zawiera frazę "text" i zastosuje dla nich styl zmieniający obramowanie na szare.

  • operatory ^= oraz $= z kolei wybierają elementy, których atrybuty odpowiednio dla href zaczyna się od "https://" oraz dla src kończy się na ".png". Zostaną wtedy przypisane odpowiednie style.

Szczególnie przydatne może okazać się stosowanie selektorów atrybutów w momencie, gdy chcesz stylizować elementy posiadające jednakowe wartości atrybutów, dodatkowo gdy zgłębisz nieco język Javascript będziesz mógł wpływać na wartości tych atrybutów poprzez np. interakcję użytkownika, a style przez Ciebie nadane dynamicznie się dostosują. Co chyba najważniejsze to, to że możesz nadawać style elementom niezależnie od struktury HTML, albowiem nie ma znaczenia, gdzie dany element będzie się znajdować.

Pseudo-klasy

W CSS możemy odnieść się do konkretnych elementów lub zachowań stosując pseudo-klasy. Możesz przykładowo przypisać jakie style mają zostać zastosowane w danym elemencie, gdy zostanie najechany kursorem:

Te proste reguły zastosowane powyżej określają, że element button ma normalnie przydzielony kolor tła na biały, natomiast gdy zostanie najechany kursorem jego kolor zmieni się na różowy. Dodatkowa reguła z transition została dodana tylko w celu płynnej zmiany koloru w czasie 0.3 sekundy, gdyby jej nie było sama zmiana również nastąpi, lecz kolor zmieni się natychmiastowo co może być nieprzyjemne lub wręcz przeciwnie w odczuciach użytkownika, w osobnym artykule opiszemy czym jest UX (User Experiance), w skrócie są to zasady, których użytkownik wręcz podświadomie oczekuje od strony czy aplikacji z której korzysta. Dobrym przykładem jest chociażby zastosowanie odpowiednich kolorów w projekcie, nie każdy się nad tym zastanawia, ale nie bez powodu działania destrukcyjne takie jak: usuwanie, wyłączanie, anulowanie, pomijanie są często stylowane w kolorze czerwonym, który sugeruje nam powagę podjętej decyzji, kolor zielony odpowiada często za zapisywanie, akceptowanie, potwierdzanie itd. ale jak wspomniałem zdecydowanie jest to temat na osobny artykuł. Wracając do tematu to jestem przekonany, że nie każdy początkujący developer zna wszystkie wymienione tutaj pseudo-klasy.

Poniższa tabela prezentuje wszystkie (na dzień pisania niniejszego artykułu) dostępne pseudo-klasy w CSS:

pseudo-klasa

opis

:active

zdarzenie to następuje w momencie akcji użytkownika takiej jak kliknięcie lub tapnięcie (w przypadku urządzeń mobilnych) natomiast najechanie kursorem nie aktywuje tego efektu. Warto dodać, że czas utrzymania tego zdarzenia jest zazwyczaj krótki albowiem dotyczy momentu kliknięcia / tapnięcia i zostaje zdezaktywowany w momencie puszczenia przycisku myszy lub palca z ekranu

:hover

uaktywnia się w momencie najechania kursora na element, do którego się odnosimy

:focus

aktywuje się w momencie kliknięcia lub przejścia tabulatorem na dany element. Różnica między :active, a :focus polega na tym że :focus nie ustępuje po puszczenia przycisku myszy lub palca z ekranu, jest to stan utrzymujący się tak długo dopóki nie zmienimy naszego celu

:visited

używając tej pseudo-klasy możemy określić style dla linków, które zostały odwiedzone (oczywiście domyślnie style te są określone przez przeglądarkę, które na pewno kojarzysz chociażby z odwiedzonych linków w wyszukiwarkach internetowych)

:link

określa style dla linków jeszcze nieodwiedzonych

:first-child

element, który zostaje wybrany po przypisaniu tej pseudo-klasy oznacza, że wybierasz jego pierwsze dziecko (czyli element, który w drzewie DOM jest jako pierwszy wewnątrz niego)

:last-child

element, który zostaje wybrany po przypisaniu tej pseudo-klasy oznacza, że wybierasz jego ostatnie dziecko (czyli element, który w drzewie DOM jest jako ostatni wewnątrz niego)

:nth-child(n)

ta pseudo-klasa pozwala na wybranie któregoś dziecka, gdzie n określa Ci, który element/elementy chcesz wybrać. Można przekazać ten argument w formie liczby :nth-child(2) co pozwoli na wybranie drugiego dziecka, specjalnych słów kluczowych odd lub even :nth-child(odd) co pozwoli wybrać Ci wszystkie nieparzyste elementy co często może przydać się na przykład w przypadku list, gdzie chcesz aby co drugi element miał inny kolor tła, :nth-child(even) odpowiada rzecza jasna za parzyste elementy. Można też użyć formuły dla przykładu :nth-child(3n) wybierze co trzeci element, a :nth-child(-n+4) pierwsze cztery elementy lub :nth-child(4n+3) co czwarty element, startując od trzeciego

:nth-last-child(n)

podobny do swojego poprzednika z jedną różnicą iż liczy kolejne dzieci od ostatniego elementu

:first-of-type

pozwala określić Ci pierwsze wystąpienie typu elementu dla przykładu p:first-of-type wybierze pierwsze napotkane p nawet jeśli będzie ich wiele i niekoniecznie musi być to pierwszy element

:last-of-type

działa tak, jak poprzednia pseudo-klasa z tym, że określa ostatnie wystąpienie typu

:nth-of-type(n)

tu możesz określić któreś wystąpienie typu zgodnie z zasadami poznanymi w opisie :nth-child(n)

:nth-last-of-type(n)

określa któreś wystąpienie typu licząc od ostatniego elementu

:only-child

dopasowuje element, który jest jedynym dzieckiem swojego rodzica

:only-of-type

dopasowuje element, który jest jedynym wystąpieniem typu wśród swojego "rodzeństwa"

:empty

w ten sposób możesz wybrać element, który nie ma żadnych dzieci lub nie posiada treści tekstowej

:checked

przydatny, gdy chcesz określić elementy input typu checkbox lub radio, które są wybrane (zaznaczone)

:disabled

w ten sposób możesz określić style dla elementów formularza lub przycisków, gdy są niedostępne. Wyłączenie w/w elementów odbywa się poprzez dodanie do nich w HTML lub za pośrednictwem Javascript atrybutu disabled

:enabled

oznacza, że wybierasz elementy, które są dostępne, a oznacza to że użytkownik ma możliwość interakcji z nimi, czyli możesz coś wpisać w input typu text lub możesz kliknąć w przycisk. Poprzednia pseudo-klasa jest tego odwrotnością

:target

możesz tego użyć w przypadku, gdy chcesz nadać style dla elementu, który ma zakotwiczenie z linkiem. Dla lepszego zrozumienia załóżmy, że masz nawigację, której element posiada link <a href="#projekty">Projekty</a>, a w treści strony posiadasz element, który ma podpięcie do tego linku <section id="projects"></section>, jeśli nie jest znane Ci działanie to już tłumaczę, gdy klikniesz w link strona zostanie przewinięta do miejsca, w którym id jest zgodne z przypisanym linkiem poprzez #

:not(selector)

bardzo ciekawa pseudo-klasa pozwalająca dość precyzyjnie określić wybierany element, jako selector należy rozumieć, jak dany element ma być wyszukany. Na przykład :not(.active) wybierze Ci wszystkie elementy, które nie posiadają klasy active, lecz można używać jej w bardziej zaawansowany sposób i określić :not([disabled]):not([type="checkbox"]) co w rezultacie, przypisania jej do elementu input oznacza wybranie tych, które nie są wyłączone (disabled), ale też nie są typu checkbox, gdyż nic nie stoi na przeszkodzie aby łączyć w ten sposób warunki poprzez, które chcesz wybrać elementy

:root

ta pseudo-klasa wybiera główny element dokumentu np. <html>

Jeśli myślisz, że to wszystko to nic z tego, możliwości jakie niesie ze sobą CSS są niemalże nieograniczone, tym krótkim wstępem do kolejnej porcji wiedzy poznaj pseudo-elementy.

Pseudo-elementy

W tabeli poniżej przedstawię Ci pseudo-klasy, które w rękach obytego dewelopera potrafią zdziałać cuda. Zauważ różnicę, że tak jak wcześniej w przypadku pseudo-klas odnosiliśmy się do elementów np. p:first-child (element p będący pierwszy dzieckiem) stosowaliśmy pojedynczy : w przypadku pseudo-elementów stosujemy :: podwójny. Chcę też zaznaczyć Ci w tym miejscu, że generalnie jest to (w niektórych przypadkach) przyjęta konwencja, której zalecam się trzymać jednak, gdybyś przypadkiem spotkał się w starszym kodzie z zapisem pojedynczym, dla niżej wymienionych pseudo-elementów to nie zdziw się, gdyż w CSS wersji 2 zarówno pseudo-klasy, jak i pseudo-elementy były definiowane stosując taki zapis. Specyfikacja CSS w wersji 3 wprowadziła składnię podwójnego :: dla pseudo-elementów co pozwala na ich odróżnienie od pseudo-klas, jest to zabieg bardziej przejrzysty co pozwala też uniknąć nieporozumień. Ze względu na kompatybilność wsteczną (kod napisany kiedyś, nadal musi działać) starszy zapis zostanie zaakceptowany, lecz nie w każdym przypadku, bo dla przykładu ::before, ::after, ::first-letter czy też ::first-line nie przejdą bez zastosowania podwójnego :: jednak jeszcze raz podkreślam, że stanowczo zalecam stosować ogólnie przyjętą konwencję, aby rozgraniczać w ten sposób pseudo-klasy i pseudo-elementy.

pseudo-element

opis

::before

służy do wstawiania zawartości przed elementem, która nie modyfikuje drzewa DOM (struktury HTML). Można tego, jak i kolejnego pseudo-elementu używać w wielu przypadkach, albowiem jego zawartością może być tekst, ale też obrazek lub dodatkowy element stworzony przez Ciebie - taki wirtualny. Ważną kwestią jest, że wymaga ona co najmniej jednej właściwości i jest nią content. W niej możemy przekazać wspomniany wcześniej tekst, który wyświetli się przed elementem, ale to nie wszystko, jako przykład podam klasyczny awatar, który kojarzysz na pewno z wielu aplikacji, często taki awatar (jeśli np. jest kołem) posiada też w swoim obrębie mniejsze kółko wskazujące dostępność użytkownika (zielony - dostępny, czerwony - niedostępny), jest to jeden z przykładów, gdzie możesz nie tworzyć nowego elementu w strukturze tylko posługując się tą pseudo-klasą określić jej width, height itd. teoretycznie rysując nowy element i przekazać użytkownikowi ważne informacje. Ten przykład to tylko namiastka tego co można zdziałać z tą i kolejną pseudo-klasą. Są powszechnie używane do celów dekoracyjnych lub dodawania dodatkowej treści. Jednak poruszę szerzej ich zastosowanie w artykule poświęconym tworzeniu rozmaitych kształtów za pomocą CSS.

::after

tak, jak jego poprzednik niesie ze sobą wiele możliwości, lecz wstawia zawartość za elementem

::first-letter

możesz użyć tego pseudo-elementu do stylizowania pierwszej litery tekstu, który jest zawartością wybranego przez Ciebie elementu. Z książek lub artykułów możesz kojarzyć, jak czasami rozdział zaczyna się od znacząco większej pierwszej litery, dla przykładu ::first-letter { font-size: 36px } sprawi, że pierwsza litera będzie o rozmiarze 36px

::first-line

podobny do ::first-letter z tym, że tym razem stylizujemy całą pierwsza linię tekstu

::selection

ten pseudo-element również dotyczy tekstu i posłuży wtedy kiedy chcemy zmienić style dla tekstu zaznaczonego przez użytkownika

::placeholder

używany w elementach input lub textarea pozwalający nadać style tekstowi zastępczemu, który jest widoczny zanim uzupełnimy dane pole. Możesz przykładowo nadać w atrybucie placeholder jakiś tekst <input type="text" placeholder="Wpisz swoje imię" /> , a korzystając z tego pseudo-elementu w CSS zmienić przykładowo kolor czcionki, gdy nic jeszcze nie zostało wpisane

::marker

stosowany do zmieniania styli markerów list numerowanych i nienumerowanych. Przykładowo lista nienumerowana domyślnie listuje marker •, numerowana liczby, oczywiście istnieją też inne znaki przy obu tych listach przy odpowiednim dostosowaniu (co opisywałem w jednym z artykułów o HTML), a ich dodatkowy styl można zmienić właśnie za pomocą tego pseudo-elementu

Oczywiście istnieje jeszcze wiele innych pseudo-klas oraz pseudo-elementów, jednak nie wszystkie są szeroko wspierane przez najpopularniejsze przeglądarki, część z tych których nie wymieniłem są też zwyczajnie rzadko używane lub dopiero przechodzą fazę eksperymentalną. Jednak gdyby nadal było Tobie mało i chciałbyś poznać jeszcze inne możliwości, które oferuje CSS poprzez stosowanie pseudo-klas i pseudo elementów to zachęcam do odwiedzenia strony MDN.

Podsumowanie

W niniejszym artykule poznałeś, jak stosować selektor atrybutów oraz listy powszechnie używanych pseudo-klas i pseudo-elementów i ich zastosowania. Moim subiektywnym zdaniem nie staraj się też ich uczyć na pamięć, ale warto znać możliwości jakie możesz użyć, to że zapomina się nazwy danej funkcjonalności, właściwości czy funkcji to często norma. Bez trudu odnajdziesz wtedy potrzebną nazwę w internecie.

Avatar: Maciej Mikołajczak

Front-end Developer

Maciej Mikołajczak

mcj.mikolajczak@gmail.com

Podziel się na

Dodaj komentarz

Komentarze (0)

Brak komentarzy

Jeżeli zainteresował Cię ten artykuł koniecznie przeczytaj inne artykuły z tej serii