Kurs HTML

4.6. Przezroczystość: Właściwość opacity

Strona główna > Kurs CSS > Rozdział 4: Jednostki i Kolory w CSS > Przezroczystość: Właściwość opacity

Wprowadzenie: Przezroczystość całego elementu

W poprzednich lekcjach nauczyliśmy się definiować przezroczystość dla **kolorów** za pomocą kanału alfa w funkcjach rgba() i hsla(). Pozwala to na tworzenie półprzezroczystych teł, tekstów czy cieni.

Jednak czasami chcemy, aby **cały element**, wraz z całą jego zawartością (tekstem, obrazkami, elementami potomnymi), stał się przezroczysty. Do tego celu służy właściwość opacity.

Właściwość opacity

Właściwość opacity ustawia poziom krycia (nieprzezroczystości) dla całego elementu. Przyjmuje wartość liczbową z zakresu od 0.0 do 1.0:

  • 0.0: Element jest całkowicie przezroczysty (niewidoczny).
  • 0.5: Element jest w 50% przezroczysty (półprzezroczysty).
  • 1.0: Element jest całkowicie nieprzezroczysty (domyślna wartość).

Wartość opacity wpływa na element oraz **wszystkie jego elementy potomne**. Nie można sprawić, aby element potomny był bardziej nieprzezroczysty niż jego rodzic, jeśli rodzic ma ustawioną wartość opacity mniejszą niż 1.0.

<div class="box">
    Ten tekst i obrazek będą półprzezroczyste.
    <img src="obrazek.jpg" alt="Przykład">
</div>
.box {
  background-color: lightblue;
  padding: 20px;
  opacity: 0.6; /* Cały div, włącznie z tłem, tekstem i obrazkiem, będzie w 60% nieprzezroczysty */
}

.box img {
  /* Ustawienie opacity: 1 tutaj nie sprawi, że obrazek będzie w pełni widoczny, 
     ponieważ dziedziczy przezroczystość od rodzica .box */
  opacity: 1; /* Nieefektywne w tym kontekście */
}

Różnica między opacity a kanałem alfa (RGBA/HSLA)

Jest to kluczowa różnica, którą należy zrozumieć:

  • Kanał alfa (w rgba()/hsla()): Ustawia przezroczystość **tylko dla koloru**, do którego jest zastosowany (np. background-color, color, border-color). **Nie wpływa** na przezroczystość zawartości elementu (np. tekstu wewnątrz diva z półprzezroczystym tłem).
  • Właściwość opacity: Ustawia przezroczystość **całego elementu**, w tym jego tła, obramowania ORAZ całej jego zawartości (tekstu, obrazków, elementów potomnych).

Przykład porównawczy:

<div class="tlo-rgba">Tekst na półprzezroczystym tle (RGBA)</div>
<div class="element-opacity">Tekst na półprzezroczystym tle (Opacity)</div>
div {
  width: 300px;
  padding: 15px;
  margin-bottom: 10px;
  border: 1px solid black;
}

.tlo-rgba {
  /* Tylko tło jest półprzezroczyste, tekst pozostaje w pełni widoczny */
  background-color: rgba(0, 0, 255, 0.5); /* Półprzezroczysty niebieski */
  color: black; /* Tekst jest czarny i nieprzezroczysty */
}

.element-opacity {
  /* Cały element, włącznie z tekstem, staje się półprzezroczysty */
  background-color: blue; /* Niebieski */
  color: black; /* Czarny */
  opacity: 0.5; 
}

W efekcie, w pierwszym divie tekst będzie bardzo czytelny na półprzezroczystym niebieskim tle. W drugim divie zarówno niebieskie tło, jak i czarny tekst staną się półprzezroczyste, co może utrudnić czytanie.

Zastosowania opacity

  • Efekty wizualne: Tworzenie efektów "zanikania" (fade-in/fade-out) w połączeniu z przejściami (transition) lub animacjami (animation) CSS.
  • Wskazanie stanu nieaktywnego: Zmniejszenie opacity dla nieaktywnych przycisków lub pól formularza (choć często łączy się to ze zmianą koloru tła/tekstu).
  • Nakładki: Czasami używane do tworzenia półprzezroczystych nakładek, chociaż rgba()/hsla() dla background-color jest zazwyczaj lepszym wyborem, jeśli chcemy, aby tekst pod spodem był widoczny.
  • Ukrywanie elementów (z zastrzeżeniami): Ustawienie opacity: 0; sprawia, że element jest niewidoczny, ale **nadal zajmuje miejsce** w układzie strony i może reagować na zdarzenia (np. kliknięcia). Różni się to od display: none; (które usuwa element z układu) i visibility: hidden; (które ukrywa element, ale nadal zajmuje miejsce, lecz nie reaguje na zdarzenia).

Wydajność i Dostępność

  • Wydajność: Zmiana opacity jest zazwyczaj operacją wydajną pod względem renderowania, często obsługiwaną przez akcelerację sprzętową (GPU), co czyni ją dobrym wyborem dla animacji.
  • Dostępność: Należy uważać, aby nadmierne użycie przezroczystości (niskie wartości opacity) nie pogorszyło kontrastu i czytelności treści, szczególnie dla osób z wadami wzroku. Zawsze sprawdzaj kontrast między tekstem a tłem.

Zadania praktyczne

Zadanie 1 (z rozwiązaniem)

Stwórz obrazek (<img>). Użyj CSS, aby domyślnie był on w 30% nieprzezroczysty (opacity: 0.3;). Dodaj regułę dla stanu :hover, która sprawi, że po najechaniu myszką obrazek stanie się w pełni widoczny (opacity: 1;). Dodaj płynne przejście (transition) dla właściwości opacity.

Rozwiązanie:

HTML:

<img src="obrazek.jpg" alt="Przykład" class="fade-image">

CSS:

.fade-image {
  opacity: 0.3;
  transition: opacity 0.5s ease-in-out; /* Płynne przejście przez 0.5 sekundy */
}

.fade-image:hover {
  opacity: 1;
}

Efekt: Obrazek będzie domyślnie "wyblakły", a po najechaniu myszką płynnie stanie się w pełni widoczny.

Zadanie 2 (do samodzielnego wykonania)

Stwórz dwa divy z tym samym tekstem "Test". Pierwszemu nadaj tło za pomocą background-color: rgba(255, 0, 0, 0.4); (półprzezroczysty czerwony). Drugiemu nadaj tło background-color: red; i ustaw opacity: 0.4;. Porównaj wygląd tekstu w obu divach.

Zadanie 3 (do samodzielnego wykonania)

Masz przycisk (<button disabled>Wyślij</button>), który jest nieaktywny (ma atrybut disabled). Użyj selektora atrybutu [disabled], aby zmniejszyć opacity nieaktywnych przycisków do 0.6 i zmienić kursor na not-allowed.

FAQ - Najczęściej zadawane pytania

Czy opacity: 0; to dobry sposób na ukrywanie elementów?

Zależy od celu. Jeśli chcesz, aby element był niewidoczny, ale nadal zajmował miejsce i potencjalnie reagował na zdarzenia (np. dla animacji), opacity: 0; może być odpowiednie. Jeśli chcesz całkowicie usunąć element z układu strony, użyj display: none;. Jeśli chcesz ukryć element, zachowując jego miejsce, ale bez interakcji, użyj visibility: hidden;.

Czy opacity wpływa na wydajność animacji?

Animowanie opacity jest generalnie uważane za wydajne, ponieważ przeglądarki często mogą optymalizować tę operację za pomocą GPU, unikając konieczności ponownego przeliczania layoutu czy malowania. Jest to jedna z właściwości (obok transform) zalecanych do animowania.

Czy mogę ustawić różne opacity dla tła i tekstu tego samego elementu?

Nie bezpośrednio za pomocą właściwości opacity, ponieważ wpływa ona na cały element. Aby osiągnąć taki efekt, musisz użyć kanału alfa w rgba() lub hsla() dla background-color i/lub color, ustawiając dla nich różne poziomy przezroczystości.

Czy opacity jest dziedziczone?

Nie, sama właściwość opacity nie jest dziedziczona. Jednak efekt wizualny przezroczystości tak - jeśli rodzic ma opacity: 0.5;, to wszystkie jego dzieci, nawet jeśli mają opacity: 1;, będą renderowane z maksymalnie 50% kryciem.