Kurs HTML

2.1. Selektor uniwersalny (*)

Wprowadzenie: Złap je wszystkie!

Rozpoczynamy naukę o selektorach CSS od jednego z najprostszych, ale jednocześnie potencjalnie potężnych (i czasem niebezpiecznych) selektorów – **selektora uniwersalnego**, reprezentowanego przez gwiazdkę (*).

Jak sama nazwa wskazuje, selektor uniwersalny **wybiera wszystkie elementy** w dokumencie HTML, niezależnie od ich typu, klasy, ID czy atrybutów.

Składnia i użycie

Składnia selektora uniwersalnego jest bardzo prosta – to po prostu znak gwiazdki:

* {
  /* Deklaracje stylów stosowane do WSZYSTKICH elementów */
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

W powyższym przykładzie, reguła CSS zostanie zastosowana do każdego pojedynczego elementu na stronie HTML. Jest to często spotykany fragment kodu w tzw. "resetach CSS" lub "normalizacjach", mający na celu usunięcie domyślnych marginesów i wypełnień dodawanych przez przeglądarki oraz ustawienie spójnego modelu pudełkowego dla wszystkich elementów.

Selektor uniwersalny może być również używany w połączeniu z innymi selektorami (kombinatorami), aby wybrać wszystkie elementy będące potomkami lub rodzeństwem określonego elementu, ale o tym dowiemy się więcej w lekcjach o zaawansowanych selektorach.

/* Wybierz wszystkie elementy będące bezpośrednimi dziećmi elementu o ID 'kontener' */
#kontener > * {
  border: 1px solid red;
}

Specyficzność selektora uniwersalnego

Selektor uniwersalny (*) ma **zerową specyficzność** (0, 0, 0, 0). Oznacza to, że jest najmniej specyficznym selektorem i każda inna reguła z bardziej specyficznym selektorem (np. selektorem typu, klasy, ID) łatwo ją nadpisze.

* { 
  color: red; /* Niska specyficzność */
}

p {
  color: blue; /* Wyższa specyficzność (selektor typu) - nadpisze czerwień dla paragrafów */
}

.klasa {
  color: green; /* Jeszcze wyższa specyficzność (selektor klasy) */
}

#identyfikator {
  color: purple; /* Najwyższa specyficzność (selektor ID) */
}

Z tego powodu selektor uniwersalny jest często używany do ustawiania bardzo podstawowych, globalnych resetów lub domyślnych wartości, które mają być łatwo nadpisywane przez bardziej konkretne style.

Potencjalne problemy i wydajność

Chociaż selektor uniwersalny jest prosty w użyciu, należy go stosować z rozwagą:

  • Wydajność: Stosowanie stylów do absolutnie każdego elementu na stronie może mieć negatywny wpływ na wydajność renderowania, zwłaszcza w przypadku bardzo dużych i złożonych dokumentów HTML. Przeglądarka musi przeanalizować i zastosować regułę do każdego węzła w drzewie DOM.
  • Nadpisywanie domyślnych stylów: Użycie * do resetowania wszystkich marginesów i wypełnień może być pomocne, ale może też niepotrzebnie nadpisać domyślne style przeglądarki dla elementów, które ich potrzebują (np. marginesy dla list czy nagłówków), co wymaga późniejszego ich przywracania w bardziej specyficznych regułach.

Nowocześniejsze podejścia do resetowania stylów (np. Normalize.css lub bardziej ukierunkowane resety) często unikają nadmiernego użycia selektora uniwersalnego na rzecz bardziej precyzyjnych selektorów.

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz prosty plik HTML zawierający nagłówek <h1>, paragraf <p> i listę nienumerowaną <ul> z kilkoma elementami <li>. Użyj selektora uniwersalnego (*) w zewnętrznym pliku CSS, aby ustawić czerwone obramowanie (border: 1px solid red;) dla wszystkich elementów na stronie. Zaobserwuj efekt w przeglądarce.

Rozwiązanie:

Plik HTML (np. index.html):

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Zadanie 1 - Selektor Uniwersalny</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Nagłówek</h1>
    <p>Paragraf tekstu.</p>
    <ul>
        <li>Element 1</li>
        <li>Element 2</li>
    </ul>
</body>
</html>

Plik CSS (style.css):

* {
  border: 1px solid red;
}

Efekt: Po otwarciu pliku HTML w przeglądarce zobaczysz, że każdy element (w tym <html>, <head> - choć niewidoczne, <body>, <h1>, <p>, <ul>, <li>) otrzymał czerwone obramowanie, co ilustruje działanie selektora uniwersalnego.

Zadanie 2 (do samodzielnego wykonania)

Zmodyfikuj plik CSS z Zadania 1. Oprócz reguły z selektorem uniwersalnym, dodaj nową regułę używającą selektora typu p, która ustawi zielone obramowanie (border: 1px solid green;) dla paragrafów. Jaki kolor obramowania będzie miał paragraf? Dlaczego?

Zadanie 3 (do samodzielnego wykonania)

Użyj selektora uniwersalnego, aby ustawić właściwość box-sizing na border-box dla wszystkich elementów na stronie. Jest to popularna technika ułatwiająca zarządzanie wymiarami elementów. (Nie musisz jeszcze w pełni rozumieć box-sizing, po prostu zastosuj regułę).

FAQ - Najczęściej zadawane pytania

Czy selektor uniwersalny wybiera również elementy <head> i jego zawartość?

Tak, selektor uniwersalny wybiera absolutnie wszystkie elementy w dokumencie, włączając w to <html>, <head>, <title>, <meta>, <link>, <script> oraz oczywiście wszystkie elementy wewnątrz <body>. Jednak style wizualne (jak kolor czy obramowanie) zastosowane do elementów niewidocznych (jak te w <head>) nie będą miały widocznego efektu.

Czy używanie * { margin: 0; padding: 0; } to dobra praktyka?

Jest to popularna, ale nieco przestarzała technika "twardego resetu". Może być skuteczna w usunięciu niespójności domyślnych stylów przeglądarek, ale jest też mało precyzyjna i może niepotrzebnie nadpisywać style. Nowocześniejsze podejścia, jak Normalize.css lub bardziej ukierunkowane resety, są często preferowane, ponieważ zachowują użyteczne domyślne style i korygują tylko niespójności.

Jak selektor uniwersalny wpływa na wydajność?

W prostych stronach wpływ jest zazwyczaj niezauważalny. Jednak w bardzo dużych i złożonych aplikacjach internetowych z tysiącami elementów DOM, reguła z selektorem uniwersalnym może potencjalnie spowolnić renderowanie, ponieważ przeglądarka musi ją zastosować do każdego elementu. Dlatego zaleca się ostrożność i unikanie nadmiernego używania *, zwłaszcza w złożonych selektorach.

Czy * ma taką samą specyficzność jak brak selektora (style dziedziczone)?

Nie. Selektor uniwersalny * ma specyficzność (0,0,0,0), co jest najniższą możliwą specyficznością dla jawnie zdefiniowanego selektora. Style dziedziczone mają jeszcze niższy priorytet niż jakakolwiek reguła z selektorem, w tym z selektorem uniwersalnym. Oznacza to, że reguła z * nadpisze styl odziedziczony.