Kurs HTML

2.6. Grupowanie selektorów (,)

Wprowadzenie: DRY (Don't Repeat Yourself) w CSS

Często zdarza się, że chcemy zastosować dokładnie te same style do wielu różnych elementów lub grup elementów. Na przykład, możemy chcieć, aby wszystkie nagłówki (h1, h2, h3) miały tę samą czcionkę, albo aby zarówno paragrafy, jak i elementy listy miały ten sam kolor tekstu.

Zamiast pisać oddzielne reguły CSS dla każdego selektora z tymi samymi deklaracjami, co prowadziłoby do powtarzania kodu, możemy użyć mechanizmu **grupowania selektorów**. Polega on na wymienieniu wszystkich selektorów, do których chcemy zastosować dany zestaw stylów, oddzielając je **przecinkami (,)**.

Składnia

Aby zgrupować selektory, wystarczy wymienić je jeden po drugim, oddzielając każdy przecinkiem. Po ostatnim selektorze w grupie następuje standardowy blok deklaracji {}.

/* Zamiast pisać: */
h1 {
  font-family: 'Georgia', serif;
  color: #333;
}
h2 {
  font-family: 'Georgia', serif;
  color: #333;
}
h3 {
  font-family: 'Georgia', serif;
  color: #333;
}

/* Możemy zgrupować selektory: */
h1, h2, h3 {
  font-family: 'Georgia', serif;
  color: #333;
}

/* Inny przykład: styl dla paragrafów i elementów listy */
p, li {
  line-height: 1.6;
  margin-bottom: 10px;
}

/* Można grupować różne typy selektorów */
.przycisk, #glowny-link, input[type="submit"] {
  padding: 10px 15px;
  border-radius: 5px;
  cursor: pointer;
}

Grupowanie selektorów znacząco skraca kod CSS, czyni go bardziej czytelnym i łatwiejszym w utrzymaniu. Zmiana stylu w jednym miejscu (w bloku deklaracji zgrupowanej reguły) wpłynie na wszystkie elementy pasujące do któregokolwiek ze zgrupowanych selektorów.

Specyficzność zgrupowanych selektorów

Grupowanie selektorów **nie wpływa** na specyficzność poszczególnych selektorów w grupie. Każdy selektor w liście oddzielonej przecinkami jest traktowany niezależnie pod względem obliczania specyficzności.

Na przykład, w regule h1, .klasa, #id { color: red; }:

  • Dla elementów <h1>, specyficzność tej reguły wynosi (0,0,0,1).
  • Dla elementów z klasą .klasa, specyficzność tej reguły wynosi (0,0,1,0).
  • Dla elementu z ID #id, specyficzność tej reguły wynosi (0,1,0,0).

Przeglądarka stosuje styl color: red; do elementu, jeśli pasuje on do któregokolwiek ze selektorów w grupie, biorąc pod uwagę specyficzność tego konkretnego selektora w kontekście innych reguł dotyczących tego elementu.

Zastosowania i dobre praktyki

  • Ujednolicanie bazowych stylów: Idealne do ustawiania wspólnych stylów dla powiązanych elementów, np. wszystkich poziomów nagłówków, różnych elementów tekstowych, elementów formularzy.
  • Resetowanie/Normalizacja: Grupowanie jest powszechnie stosowane w resetach CSS do zastosowania tych samych zerowych marginesów, paddingów itp. do wielu różnych elementów jednocześnie.
  • Czytelność: Używaj grupowania, aby unikać powtórzeń i utrzymać zwięzłość kodu.
  • Formatowanie: Dla lepszej czytelności, często umieszcza się każdy selektor w grupie w nowej linii, zwłaszcza gdy lista jest długa:
h1,
h2,
h3,
h4,
h5,
h6 {
  margin-top: 1.5em;
  margin-bottom: 0.5em;
  font-weight: bold;
}

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz plik HTML zawierający nagłówek <h1>, paragraf <p> oraz element <strong> wewnątrz paragrafu. Użyj grupowania selektorów w CSS, aby nadać wszystkim tym trzem typom elementów (h1, p, strong) ten sam kolor tekstu, np. ciemnoszary (#444).

Rozwiązanie:

Plik HTML (np. index.html):

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Zadanie 1 - Grupowanie Selektorów</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Główny Nagłówek</h1>
    <p>To jest paragraf z <strong>pogrubionym</strong> tekstem.</p>
</body>
</html>

Plik CSS (style.css):

h1, 
p, 
strong {
  color: #444;
}

Efekt: Zarówno nagłówek, jak i cały tekst paragrafu (włącznie z pogrubionym fragmentem) będą miały kolor ciemnoszary.

Zadanie 2 (do samodzielnego wykonania)

Masz różne elementy formularza: <input type="text">, <input type="email">, <textarea>, <select>. Użyj grupowania selektorów (w tym selektorów atrybutów dla inputów), aby nadać im wszystkim wspólne style, np. szerokość 100% (width: 100%;), padding 8px i obramowanie 1px solid #ccc.

Zadanie 3 (do samodzielnego wykonania)

Zdefiniuj styl dla klasy .highlight (np. żółte tło). Zdefiniuj również styl dla ID #special-item (np. czerwone obramowanie). Następnie użyj grupowania, aby nadać zarówno elementom z klasą .highlight, jak i elementowi o ID #special-item pogrubioną czcionkę (font-weight: bold;).

FAQ - Najczęściej zadawane pytania

Czy mogę grupować bardzo różne typy selektorów?

Tak, można grupować dowolne poprawne selektory CSS: selektory typu, klasy, ID, atrybutów, pseudoklasy, pseudoelementy, a nawet złożone kombinatory. Wszystkie elementy pasujące do któregokolwiek ze selektorów w grupie otrzymają zdefiniowane style.

Co się stanie, jeśli jeden z selektorów w grupie jest niepoprawny?

Jeśli jeden z selektorów w grupie oddzielonej przecinkami jest niepoprawny składniowo, przeglądarka zazwyczaj zignoruje **całą regułę CSS** (dla wszystkich selektorów w tej grupie). Dlatego ważne jest, aby upewnić się, że wszystkie selektory w grupie są poprawne.

Czy kolejność selektorów w grupie ma znaczenie?

Nie, kolejność selektorów oddzielonych przecinkami nie ma wpływu na działanie reguły ani na specyficzność. h1, p działa tak samo jak p, h1.

Czy grupowanie selektorów poprawia wydajność CSS?

Główną zaletą grupowania jest redukcja rozmiaru pliku CSS i poprawa jego czytelności oraz łatwości utrzymania. Bezpośredni wpływ na wydajność renderowania jest zazwyczaj minimalny, ale mniejszy rozmiar pliku oznacza szybsze jego pobranie przez przeglądarkę.