4.6. Przezroczystość: Właściwość opacity
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()
dlabackground-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 oddisplay: none;
(które usuwa element z układu) ivisibility: 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.