Kurs HTML

2.5. Selektory atrybutów

Wprowadzenie: Stylizowanie na podstawie atrybutów HTML

Oprócz wybierania elementów na podstawie ich typu, klasy czy ID, CSS pozwala również na ich selekcję w oparciu o **obecność lub wartość ich atrybutów HTML**. Służą do tego **selektory atrybutów**.

Jest to bardzo potężny mechanizm, który pozwala na precyzyjne stylizowanie elementów, które niekoniecznie mają unikalne klasy czy ID, ale posiadają określone atrybuty, np. wszystkie pola formularza typu `text`, wszystkie linki prowadzące do plików PDF, czy wszystkie obrazki z określonym atrybutem `alt`.

Składnia selektorów atrybutów

Selektory atrybutów umieszcza się w nawiasach kwadratowych []. Istnieje kilka wariantów tych selektorów:

  1. [atrybut] - Selekcja na podstawie obecności atrybutu.

    Wybiera wszystkie elementy, które posiadają określony atrybut, niezależnie od jego wartości.

    /* Wybierz wszystkie elementy posiadające atrybut 'target' */
    [target] {
      border: 1px solid green;
    }
    
    /* Wybierz wszystkie elementy posiadające atrybut 'disabled' */
    [disabled] {
      opacity: 0.5;
      cursor: not-allowed;
    }
  2. [atrybut="wartosc"] - Selekcja na podstawie dokładnej wartości atrybutu.

    Wybiera wszystkie elementy, których określony atrybut ma dokładnie podaną wartość. Wartość jest wrażliwa na wielkość liter (case-sensitive) w HTML.

    /* Wybierz wszystkie inputy typu 'text' */
    input[type="text"] {
      border: 1px solid #ccc;
      padding: 5px;
    }
    
    /* Wybierz wszystkie linki z atrybutem target="_blank" */
    a[target="_blank"] {
      /* Dodaj ikonkę oznaczającą otwarcie w nowej karcie */
      padding-right: 18px;
      background: url('external-link-icon.png') no-repeat right center;
    }
  3. [atrybut~="wartosc"] - Selekcja na podstawie wartości zawierającej określone słowo.

    Wybiera elementy, których atrybut zawiera podaną wartość jako jedno ze słów oddzielonych spacjami.

    <p class="text info important">...</p>
    <p class="text warning">...</p>
    /* Wybierz elementy, których atrybut 'class' zawiera słowo 'info' */
    [class~="info"] {
      color: blue;
    }
    /* Powyższe wybierze pierwszy paragraf, ale nie drugi */

    Uwaga: Dla atrybutu class zazwyczaj wygodniej jest używać selektora klasy (.info).

  4. [atrybut|="wartosc"] - Selekcja na podstawie wartości zaczynającej się od określonego słowa (lub będącej dokładnie tym słowem), po którym może wystąpić myślnik.

    Przydatne np. do wybierania elementów na podstawie atrybutu lang.

    <p lang="en">Hello</p>
    <p lang="en-US">Hi</p>
    <p lang="pl">Cześć</p>
    /* Wybierz elementy z atrybutem 'lang' równym 'en' lub zaczynającym się od 'en-' */
    [lang|="en"] {
      font-style: italic;
    }
    /* Powyższe wybierze pierwsze dwa paragrafy */
  5. [atrybut^="wartosc"] - Selekcja na podstawie wartości zaczynającej się od określonego ciągu znaków.

    Wybiera elementy, których wartość atrybutu zaczyna się od podanego ciągu.

    /* Wybierz linki, których 'href' zaczyna się od 'https://' */
    a[href^="https://"] {
      font-weight: bold; /* Pogrubienie bezpiecznych linków */
    }
    
    /* Wybierz elementy, których ID zaczyna się od 'sekcja-' */
    [id^="sekcja-"] {
      margin-top: 30px;
    }
  6. [atrybut$="wartosc"] - Selekcja na podstawie wartości kończącej się określonym ciągiem znaków.

    Wybiera elementy, których wartość atrybutu kończy się podanym ciągiem.

    /* Wybierz linki, których 'href' kończy się na '.pdf' */
    a[href$=".pdf"] {
      /* Dodaj ikonkę PDF */
      padding-left: 20px;
      background: url('pdf-icon.png') no-repeat left center;
    }
    
    /* Wybierz obrazki, których 'src' kończy się na '.png' */
    img[src$=".png"] {
      border: 2px solid lightblue;
    }
  7. [atrybut*="wartosc"] - Selekcja na podstawie wartości zawierającej określony ciąg znaków.

    Wybiera elementy, których wartość atrybutu zawiera podany ciąg znaków w dowolnym miejscu.

    /* Wybierz linki, których 'href' zawiera słowo 'example' */
    a[href*="example"] {
      color: green;
    }
    
    /* Wybierz elementy, których klasa zawiera ciąg 'button' (np. 'button', 'button-primary', 'my-button') */
    [class*="button"] {
      cursor: pointer;
    }

Można również łączyć selektor atrybutu z innymi selektorami (np. typu, klasy) dla większej precyzji:

/* Wybierz tylko inputy typu 'submit' */
input[type="submit"] {
  background-color: blue;
  color: white;
}

/* Wybierz tylko linki z klasą 'external' i atrybutem target="_blank" */
a.external[target="_blank"] {
  /* ... */
}

Specyficzność selektora atrybutu

Selektor atrybutu (we wszystkich swoich wariantach) ma taką samą specyficzność jak selektor klasy i pseudoklasa. W notacji specyficzności (A, B, C, D), selektor atrybutu ma wartość (0, 0, 1, 0).

  • Jest bardziej specyficzny niż selektor typu (0,0,0,1) i selektor uniwersalny (0,0,0,0).
  • Jest mniej specyficzny niż selektor ID (0,1,0,0).
  • Ma taką samą specyficzność jak selektor klasy (.klasa) i pseudoklasa (:hover). W przypadku konfliktu między nimi decyduje kolejność w arkuszu CSS.

Zastosowania i dobre praktyki

  • Stylizowanie formularzy: Bardzo przydatne do stylizowania różnych typów pól <input> (np. [type="text"], [type="email"], [type="checkbox"]) lub pól wymaganych ([required]).
  • Stylizowanie linków: Umożliwia odróżnienie linków zewnętrznych ([target="_blank"]), linków do określonych typów plików ([href$=".pdf"]) czy linków do bezpiecznych stron ([href^="https://"]).
  • Stylizowanie na podstawie stanu: Wybieranie elementów nieaktywnych ([disabled]).
  • Alternatywa dla klas: Czasem mogą zastąpić potrzebę dodawania specjalnych klas, jeśli element ma już odpowiedni atrybut (np. stylizowanie na podstawie [data-*]).
  • Wydajność: Bardziej złożone selektory atrybutów (szczególnie te z dopasowaniem podciągu, jak *=) mogą być mniej wydajne niż proste selektory typu czy klasy, zwłaszcza na dużych stronach. Używaj ich z rozwagą tam, gdzie są naprawdę potrzebne.

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz plik HTML z kilkoma linkami (<a>). Niektórym z nich nadaj atrybut target="_blank". Użyj selektora atrybutu w CSS, aby wszystkim linkom, które otwierają się w nowej karcie (mają target="_blank"), dodać małą ikonkę strzałki po tekście (możesz użyć pseudoelementu ::after i właściwości content, np. content: ' ↗';).

Rozwiązanie:

Plik HTML (np. index.html):

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Zadanie 1 - Selektor Atrybutu</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <p>
        Odwiedź <a href="https://www.google.com" target="_blank">Google</a> (nowa karta) lub 
        <a href="#">link wewnętrzny</a>.
        Inny link: <a href="https://example.com" target="_blank">Example.com</a> (nowa karta).
    </p>
</body>
</html>

Plik CSS (style.css):

a[target="_blank"]::after {
  content: ' ↗'; /* Dodaje strzałkę po tekście linku */
  font-size: 0.8em; /* Opcjonalnie zmniejsza rozmiar strzałki */
  display: inline-block; /* Może być potrzebne dla lepszego pozycjonowania */
  margin-left: 3px; /* Opcjonalny odstęp */
}

Efekt: Linki z atrybutem target="_blank" będą miały dodaną małą strzałkę po tekście, wizualnie wskazując, że otworzą się w nowej karcie.

Zadanie 2 (do samodzielnego wykonania)

Stwórz formularz HTML z polami input różnych typów: text, email, password oraz przyciskiem submit. Użyj selektorów atrybutów, aby nadać inne obramowanie polom tekstowym (input[type="text"]) i inne polom email (input[type="email"]).

Zadanie 3 (do samodzielnego wykonania)

Dodaj do strony kilka linków, z których niektóre prowadzą do plików PDF (mają href kończące się na .pdf). Użyj selektora atrybutu [href$=".pdf"], aby pogrubić tekst tych linków.

FAQ - Najczęściej zadawane pytania

Czy wartość w selektorze [atrybut="wartosc"] jest wrażliwa na wielkość liter?

Tak, w przypadku dokumentów HTML, wartości atrybutów w selektorach CSS są zazwyczaj wrażliwe na wielkość liter (case-sensitive). Oznacza to, że [type="text"] nie wybierze elementu <input type="TEXT">. Można dodać modyfikator i (np. [type="text" i]) w CSS Selectors Level 4, aby wymusić niewrażliwość na wielkość liter, ale wsparcie dla tego może się różnić między przeglądarkami.

Czy mogę użyć selektora atrybutu do stylizowania na podstawie atrybutów data-*?

Tak, selektory atrybutów doskonale nadają się do stylizowania elementów na podstawie niestandardowych atrybutów danych (data-*). Na przykład, możesz ostylować elementy z data-status="active" za pomocą selektora [data-status="active"]. Jest to użyteczna technika do przekazywania stanu lub dodatkowych informacji z HTML do CSS.

Który selektor atrybutu jest najbardziej wydajny?

Najprostsze selektory atrybutów, takie jak sprawdzanie obecności atrybutu ([atrybut]) lub dokładnej wartości ([atrybut="wartosc"]), są generalnie bardziej wydajne niż te wymagające dopasowania podciągów (^=, $=, *=). Jednak w większości przypadków różnice wydajności są niewielkie i nie powinny być głównym zmartwieniem, chyba że pracujesz nad bardzo złożoną aplikacją.

Czy mogę łączyć wiele selektorów atrybutów?

Tak, można łączyć wiele selektorów atrybutów dla tego samego elementu, aby stworzyć bardziej precyzyjną regułę. Na przykład: input[type="checkbox"][checked] wybierze tylko zaznaczone pola wyboru. Każdy kolejny selektor atrybutu w łańcuchu zwiększa specyficzność reguły.