Kurs HTML

5.7. Dekoracja tekstu (text-decoration)

Strona główna > Kurs CSS > Rozdział 5: Stylizowanie Tekstu > Dekoracja tekstu (text-decoration)

Wprowadzenie: Linie ozdobne tekstu

Właściwość text-decoration w CSS służy do dodawania linii dekoracyjnych do tekstu, takich jak podkreślenie, nadkreślenie czy przekreślenie. Jest to właściwość zbiorcza (shorthand), która kontroluje kilka bardziej szczegółowych właściwości związanych z dekoracją tekstu.

Najczęstszym zastosowaniem jest stylizowanie linków (usuwanie domyślnego podkreślenia lub dodawanie go w stanie :hover) oraz wizualne wyróżnianie lub oznaczanie tekstu.

Właściwość zbiorcza text-decoration

Właściwość text-decoration jest skrótem dla następujących właściwości składowych:

  • text-decoration-line: Określa typ linii (np. underline, overline, line-through).
  • text-decoration-color: Określa kolor linii.
  • text-decoration-style: Określa styl linii (np. solid, wavy, dotted, dashed, double).
  • text-decoration-thickness: Określa grubość linii.

W najprostszej formie, text-decoration przyjmuje głównie wartości określające typ linii (text-decoration-line).

Podstawowe wartości dla text-decoration (i text-decoration-line):

  • none: Brak jakichkolwiek linii dekoracyjnych. Używane np. do usuwania domyślnego podkreślenia linków. Jest to wartość domyślna dla większości elementów (poza np. <a>).
  • underline: Dodaje linię pod tekstem (podkreślenie). Domyślna dla linków (<a>).
  • overline: Dodaje linię nad tekstem (nadkreślenie).
  • line-through: Dodaje linię przez środek tekstu (przekreślenie). Podobne do efektu elementów <s> i <del>.

Można również łączyć wiele typów linii, oddzielając je spacjami, np. text-decoration: underline overline;.

a {
  /* Usunięcie domyślnego podkreślenia linków */
  text-decoration: none; 
}

a:hover {
  /* Dodanie podkreślenia po najechaniu myszką */
  text-decoration: underline;
}

.przekreslony {
  text-decoration: line-through;
}

.naglowek-specjalny {
  text-decoration: underline overline dotted red 2px; /* Przykład użycia wielu wartości */
  /* Powyższe jest równoważne: */
  /* text-decoration-line: underline overline; */
  /* text-decoration-style: dotted; */
  /* text-decoration-color: red; */
  /* text-decoration-thickness: 2px; */
}

Szczegółowe właściwości dekoracji tekstu

Chociaż właściwość zbiorcza text-decoration jest często wystarczająca, czasami chcemy kontrolować poszczególne aspekty linii dekoracyjnej niezależnie.

  • text-decoration-line:
    • Wartości: none, underline, overline, line-through (można łączyć spacjami).
  • text-decoration-color:
    • Określa kolor linii. Może przyjmować dowolną wartość koloru CSS (nazwa, HEX, RGB, HSL, currentColor itp.).
    • Domyślnie linia przyjmuje kolor tekstu (jakby miała wartość currentColor).
    a.specjalny {
      text-decoration: underline;
      text-decoration-color: orange; /* Podkreślenie będzie pomarańczowe, nawet jeśli tekst jest inny */
    }
  • text-decoration-style:
    • Określa styl linii.
    • Wartości: solid (ciągła - domyślna), double (podwójna), dotted (kropkowana), dashed (przerywana), wavy (falowana).
    .wazne-ostrzezenie {
      text-decoration: underline;
      text-decoration-style: wavy;
      text-decoration-color: red;
    }
  • text-decoration-thickness:
    • Określa grubość linii.
    • Wartości: auto (domyślna), wartość długości (np. 2px, 0.1em), procent (względem 1em).
    h2 {
      text-decoration: underline;
      text-decoration-thickness: 3px; /* Grube podkreślenie */
    }

Kolejność wartości w skróconej właściwości text-decoration:

Zalecana kolejność to: <text-decoration-line> || <text-decoration-style> || <text-decoration-color> || <text-decoration-thickness>. Można pominąć dowolne wartości (przyjmą wtedy wartości domyślne), ale przynajmniej text-decoration-line jest zazwyczaj potrzebne, aby linia była widoczna (chyba że ustawiamy tylko kolor/styl/grubość dla linii dziedziczonej).

Dziedziczenie i Zastosowanie

Właściwości text-decoration-* **nie są dziedziczone**. Oznacza to, że jeśli ustawisz text-decoration: underline; dla diva, tekst bezpośrednio w divie będzie podkreślony, ale tekst w zagnieżdżonych paragrafach już nie (chyba że one same mają ustawione podkreślenie).

Jednak linie dekoracyjne są rysowane dla całego elementu, w tym dla jego potomków. Jeśli podkreślisz diva, linia będzie biegła pod całą jego zawartością, włączając w to zagnieżdżone elementy.

Uwaga: Domyślne podkreślenie linków (<a>) jest często uważane za ważny wskaźnik interaktywności i dostępności. Całkowite usuwanie podkreślenia linków (text-decoration: none;) bez zapewnienia innego, wyraźnego wizualnego wyróżnienia (np. kolorem o wysokim kontraście, zmianą wyglądu po najechaniu) może utrudnić użytkownikom identyfikację linków.

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Usuń domyślne podkreślenie ze wszystkich linków (a) na stronie, ale dodaj je ponownie, gdy użytkownik najedzie na link myszką (stan :hover).

Rozwiązanie:

CSS:

a {
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

Efekt: Linki nie będą miały podkreślenia, dopóki kursor myszy nie znajdzie się nad nimi.

Zadanie 2 (do samodzielnego wykonania)

Stwórz element span z klasą .highlight. Użyj właściwości składowych, aby nadać mu falowane (wavy), czerwone (red) podkreślenie (underline) o grubości 2px.

Zadanie 3 (do samodzielnego wykonania)

Masz tekst oznaczający starą cenę, np. <span class="old-price">100 zł</span>. Użyj text-decoration, aby przekreślić tę cenę.

FAQ - Najczęściej zadawane pytania

Jaka jest różnica między text-decoration: line-through; a elementami <s> lub <del>?

Efekt wizualny jest podobny (przekreślenie). Jednak elementy <s> (struck-through) i <del> (deleted text) mają znaczenie semantyczne. <s> oznacza treść, która nie jest już poprawna lub aktualna. <del> oznacza treść usuniętą. text-decoration: line-through; jest czysto prezentacyjne. Używaj HTML zgodnie ze znaczeniem, a CSS do stylizacji.

Czy mogę kontrolować odstęp między tekstem a podkreśleniem?

Standardowa właściwość text-decoration nie daje bezpośredniej kontroli nad tym odstępem. Istnieje nowsza właściwość text-underline-offset, która na to pozwala, i jest już dość dobrze wspierana przez nowoczesne przeglądarki. Można jej używać w połączeniu z text-decoration.

Czy text-decoration-color zawsze nadpisuje kolor tekstu dla linii?

Tak. Jeśli ustawisz text-decoration-color na inną wartość niż kolor tekstu, linia dekoracyjna będzie miała ten specyficzny kolor, niezależnie od wartości właściwości color.

Czy animowanie text-decoration jest możliwe?

Animowanie właściwości text-decoration (np. płynne pojawianie się podkreślenia) jest trudne i często nie działa płynnie, ponieważ wiele z tych właściwości (jak text-decoration-line) nie jest łatwo interpolowalnych. Lepsze efekty wizualne często osiąga się, symulując podkreślenie za pomocą pseudoelementów (::before/::after) z tłem lub obramowaniem, które można łatwiej animować.