7.2. Ukrywanie elementów: display: none
vs visibility: hidden
display: none
vs visibility: hidden
Wprowadzenie: Dwa sposoby na niewidzialność
Czasami chcemy, aby element HTML był niewidoczny na stronie. CSS oferuje dwa główne sposoby na osiągnięcie tego celu: ustawienie właściwości display
na none
lub właściwości visibility
na hidden
.
Choć oba te podejścia sprawiają, że element znika z widoku, działają one w fundamentalnie różny sposób i mają odmienne konsekwencje dla układu strony oraz dostępności.
display: none;
Ustawienie display: none;
na elemencie powoduje, że jest on **całkowicie usuwany z przepływu dokumentu**, tak jakby go w ogóle nie było w kodzie HTML.
- Usuwa element z layoutu: Element nie zajmuje żadnego miejsca na stronie. Pozostałe elementy zachowują się tak, jakby ukryty element nie istniał, przesuwając się, aby wypełnić zwolnioną przestrzeń.
- Niedostępny dla interakcji: Użytkownik nie może wejść w interakcję z elementem (np. kliknąć linku, zaznaczyć tekstu).
- Niedostępny dla technologii wspomagających: Czytniki ekranu zazwyczaj ignorują elementy z
display: none;
, czyniąc je niedostępnymi dla użytkowników niewidomych lub niedowidzących. - Zdarzenia nie są wywoływane: Zdarzenia JavaScript (np.
click
,mouseover
) nie będą wywoływane na tym elemencie. - Potomkowie również są ukryci: Wszystkie elementy potomne również stają się niewidoczne i są usuwane z przepływu. Nie można "przywrócić" widoczności potomka, jeśli rodzic ma
display: none;
.
display: none;
jest często używane do dynamicznego pokazywania/ukrywania elementów za pomocą JavaScript (np. rozwijane menu, modale, zakładki) lub w responsywnym designie do ukrywania elementów na określonych rozmiarach ekranu.
<p>Tekst przed.</p>
<div class="ukryty-display">Ten div jest ukryty za pomocą display: none;</div>
<p>Tekst po.</p>
.ukryty-display {
display: none;
width: 100px;
height: 50px;
background-color: red;
}
/* Efekt: .ukryty-display nie będzie widoczny, a "Tekst po" pojawi się */
/* bezpośrednio pod "Tekst przed", bez żadnej przerwy. */
visibility: hidden;
Ustawienie visibility: hidden;
na elemencie sprawia, że staje się on **niewidoczny (przezroczysty)**, ale **nadal zajmuje swoje miejsce w layoucie**.
- Pozostaje w layoucie: Element nadal zajmuje swoją przestrzeń (szerokość, wysokość, marginesy). Pozostałe elementy nie przesuwają się, aby wypełnić jego miejsce – pozostaje po nim pusta przestrzeń.
- Niedostępny dla interakcji: Podobnie jak przy
display: none;
, użytkownik nie może wejść w interakcję z elementem. - Dostępny dla technologii wspomagających (?): Zachowanie czytników ekranu może być różne, ale generalnie elementy z
visibility: hidden
mogą być nadal odczytywane lub nawigowane, co może prowadzić do konfuzji. Zaleca się ostrożność przy używaniu tej metody dla treści interaktywnych. - Zdarzenia nie są wywoływane: Zdarzenia JavaScript zazwyczaj nie są wywoływane.
- Potomkowie mogą być widoczni: Co ciekawe, jeśli element potomek ma ustawione
visibility: visible;
, stanie się on widoczny, nawet jeśli jego rodzic mavisibility: hidden;
.
visibility: hidden;
jest używane rzadziej niż display: none;
. Może być przydatne, gdy chcemy zachować układ strony, ukrywając tylko wizualną reprezentację elementu, lub w animacjach, gdzie chcemy płynnie zmieniać widoczność.
<p>Tekst przed.</p>
<div class="ukryty-visibility">Ten div jest ukryty za pomocą visibility: hidden;</div>
<p>Tekst po.</p>
.ukryty-visibility {
visibility: hidden;
width: 100px;
height: 50px;
background-color: blue; /* Tło nie będzie widoczne */
border: 1px solid black; /* Obramowanie też nie */
}
/* Efekt: .ukryty-visibility nie będzie widoczny, ale pozostanie po nim */
/* pusta przestrzeń o wymiarach 100x50px (plus marginesy/border), */
/* a "Tekst po" pojawi się poniżej tej pustej przestrzeni. */
Przykład z widocznym potomkiem:
<div class="parent-hidden">
Rodzic jest ukryty...
<span class="child-visible">...ale dziecko jest widoczne!</span>
</div>
.parent-hidden {
visibility: hidden;
border: 1px dashed red;
padding: 10px;
}
.child-visible {
visibility: visible;
background-color: lightgreen;
}
/* Efekt: Tekst "Rodzic jest ukryty..." i ramka będą niewidoczne, */
/* ale span z zielonym tłem będzie widoczny w miejscu, gdzie normalnie by był. */
Podsumowanie różnic
Cecha | display: none; |
visibility: hidden; |
---|---|---|
Wpływ na layout | Usuwa element, zwalnia miejsce | Ukrywa element, ale zachowuje miejsce |
Zajmowane miejsce | Nie zajmuje miejsca | Zajmuje swoje normalne miejsce |
Interakcja użytkownika | Niemożliwa | Niemożliwa |
Dostępność (czytniki ekranu) | Zazwyczaj ignorowany (niedostępny) | Może być odczytywany (potencjalnie mylące) |
Widoczność potomków | Zawsze ukryci | Mogą być widoczni (jeśli mają visibility: visible; ) |
Animacje/Przejścia | Nie można animować display |
Można animować visibility (choć efekt jest skokowy) |
Zadania praktyczne
Zadanie 1 (z rozwiązaniem)
Stwórz trzy elementy div
w jednej linii (użyj display: inline-block;
). Środkowemu elementowi nadaj display: none;
. Zaobserwuj, jak pozostałe elementy się do siebie zbliżają.
Rozwiązanie:
HTML:
<div class="box">1</div><div class="box middle-none">2</div><div class="box">3</div>
CSS:
.box {
display: inline-block;
width: 50px;
height: 50px;
background-color: lightblue;
margin: 5px;
text-align: center;
line-height: 50px;
}
.middle-none {
display: none;
background-color: lightcoral; /* Nie będzie widoczne */
}
Efekt: Widoczne będą tylko pudełka 1 i 3, ułożone bezpośrednio obok siebie, ponieważ pudełko 2 zostało całkowicie usunięte z layoutu.
Zadanie 2 (do samodzielnego wykonania)
Wykonaj Zadanie 1 ponownie, ale zamiast display: none;
użyj visibility: hidden;
dla środkowego elementu. Zaobserwuj różnicę w układzie.
Zadanie 3 (do samodzielnego wykonania)
Stwórz element div
z visibility: hidden;
. Wewnątrz niego umieść element span
z tekstem i nadaj mu visibility: visible;
. Sprawdź, czy tekst w spanie jest widoczny.
FAQ - Najczęściej zadawane pytania
Której metody używać do ukrywania treści dla czytników ekranu?
Ani display: none;
, ani visibility: hidden;
nie są idealne do ukrywania treści *tylko wizualnie*, ale pozostawiania jej dostępnej dla czytników ekranu (np. dla etykiet dla pól formularzy). Do tego celu stosuje się specjalne techniki CSS, często nazywane "visually hidden" lub "sr-only" (screen reader only), które pozycjonują element poza ekranem lub drastycznie zmniejszają jego rozmiar, nie używając display
ani visibility
.
Czy opacity: 0;
to to samo co visibility: hidden;
?
Nie. opacity: 0;
również czyni element całkowicie przezroczystym, ale **nadal jest on interaktywny** (można na niego kliknąć, zaznaczyć tekst, wywołać zdarzenia). visibility: hidden;
czyni element nieinteraktywnym. Ponadto, opacity
można płynnie animować.
Jak dynamicznie pokazać/ukryć element za pomocą JavaScript?
Najczęściej zmienia się właściwość display
między none
a jej pierwotną wartością (np. block
, inline-block
) lub dodaje/usuwa klasę CSS, która zawiera regułę display: none;
. Można też przełączać visibility
między hidden
a visible
.
Czy ukrywanie elementów wpływa na SEO?
Treść ukryta za pomocą display: none;
może być indeksowana przez Google, ale jeśli jest używana do manipulowania rankingiem (np. ukrywanie słów kluczowych), może to prowadzić do kar. Ukrywanie treści, która jest normalnie dostępna dla użytkownika po interakcji (np. w zakładkach, menu), jest zazwyczaj akceptowalne. visibility: hidden;
ma mniejszy wpływ, bo treść technicznie jest w DOM.