PorównaniePorównania

display vs visibility vs opacity

display: none usuwa element z układu, visibility: hidden go chowa, ale zostawia miejsce, a opacity: 0 robi go przezroczystym, lecz wciąż klikalnym.

Na tej stronie

Porównanie w tabeli

#

Przykład

#
CSS
.item-none { display: none; }
Podgląd

Definicja i zastosowanie

#

Trzy sposoby na "schowanie" elementu różnią się tym, co zostaje z jego obecności na stronie. display: none usuwa element z układu całkowicie, razem z zajmowanym miejscem, jakby go nigdy nie było. visibility: hidden tylko go chowa, miejsce w layoucie zostaje puste. opacity: 0 też zachowuje miejsce, ale strukturalnie element wciąż jest w pełni obecny, tylko wizualnie przezroczysty.

Ta różnica w obecności przekłada się na interakcję. Element z display: none i visibility: hidden nie da się kliknąć, zaznaczyć klawiszem Tab, a czytniki ekranu go pomijają. Element z opacity: 0 zachowuje się tak, jakby był widoczny: reaguje na kliknięcia, wchodzi w kolejność Tab i jest odczytywany przez czytniki ekranu, o czym łatwo zapomnieć.

Ma to też znaczenie dla animacji. opacity zmienia się płynnie, więc nadaje się do animowanego pojawiania i znikania. visibility zmienia się skokowo, ale da się ją połączyć z transition tak, żeby element zniknął dla interakcji dokładnie wtedy, gdy animacja się skończy. display domyślnie wcale nie bierze udziału w przejściach, choć nowszy transition-behavior: allow-discrete to zmienia.

Składnia

#
Składnia
display: none;
visibility: hidden;
opacity: 0;

Więcej przykładów

#
visibility: hidden zachowuje miejsce
CSS
.item-hidden { visibility: hidden; }
Podgląd

Miejsce po elemencie 2 zostaje puste, inaczej niż przy display: none.

opacity: 0 nadal reaguje na kliknięcie
CSS
.ghost { opacity: 0; }
Podgląd

Mimo niewidoczności przycisk da się kliknąć i zaznaczyć klawiszem Tab, bo opacity nie wyłącza interakcji.

Dobre praktyki

#
  • Do animowanego pojawiania się elementu użyj opacity, ewentualnie w parze z visibility i transition-behavior: allow-discrete.
  • Jeśli element ma zniknąć całkowicie i zwolnić miejsce, wybierz display: none.
  • Przezroczysty, ale wciąż klikalny element to częsty błąd. Dodaj pointer-events: none, jeśli nie powinien reagować.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.