Odpowiedzi:
display:none
oznacza, że dany tag w ogóle nie pojawi się na stronie (chociaż nadal możesz z nim wchodzić w interakcje za pośrednictwem domeny). Między pozostałymi tagami nie będzie przydzielone miejsce.
visibility:hidden
oznacza, że w przeciwieństwie display:none
do tagu nie widać, ale na stronie jest dla niego przydzielone miejsce. Tag jest renderowany, po prostu nie jest widoczny na stronie.
Na przykład:
test | <span style="[style-tag-value]">Appropriate style in this tag</span> | test
Wymiana [style-tag-value]
z display:none
wynikami w:
test | | test
Wymiana [style-tag-value]
z visibility:hidden
wynikami w:
test | | test
visibility: hidden
i display: none
będzie równie wydajny, ponieważ oba układy ponownego uruchamiania , farby i kompozyty. Jest to jednak opacity: 0
funkcjonalnie równoważne visibility: hidden
i nie powoduje ponownego uruchomienia kroku układu, więc radzę użyć tego, jeśli nie przeszkadza ci przydzielenie pustej przestrzeni (w przeciwnym razie użyj display: none
).
opacity: 0
należy zachować ostrożność podczas obchodzenia się z danymi wejściowymi lub przyciskami, ponieważ nadal istniałyby i prawdopodobnie powodowałyby dziwne interakcje użytkownika.
Nie są synonimami.
display:none
usuwa element z normalnego przepływu strony, umożliwiając wypełnienie innych elementów.
visibility:hidden
pozostawia element w normalnym przepływie strony tak, że nadal zajmuje miejsce.
Wyobraź sobie, że czeka cię kolejka do wesołego miasteczka, a ktoś w kolejce robi się tak hałaśliwy, że ochrona wyrywa go z linii. Wszyscy w kolejce przesuną się następnie o jedną pozycję do przodu, aby wypełnić puste miejsce. To jest jak display:none
.
Porównaj to z podobną sytuacją, ale ktoś przed tobą zakłada pelerynę niewidzialności. Podczas przeglądania linii będzie wyglądać, jakby była pusta przestrzeń, ale ludzie tak naprawdę nie mogą wypełnić tej pustej przestrzeni, ponieważ ktoś nadal tam jest. To jest jak visibility:hidden
.
Jedną z rzeczy, które warto dodać, choć nie zadawano tego pytania, jest to, że istnieje trzecia opcja uczynienia obiektu całkowicie przezroczystym. Rozważać:
1st <a href="http://example.com" style="display: none;">unseen</a> link.<br />
2nd <a href="http://example.com" style="visibility: hidden;">unseen</a> link.<br />
3rd <a href="http://example.com" style="opacity: 0;">unseen</a> link.
(Aby zobaczyć wynik, kliknij przycisk „Uruchom fragment kodu” powyżej).
Różnica między 1 a 2 została już wskazana (a mianowicie, 2 nadal zajmuje miejsce). Istnieje jednak różnica między 2 a 3: w przypadku 3 mysz nadal przełącza się na dłoń po najechaniu kursorem na link, a użytkownik nadal może kliknąć link, a zdarzenia JavaScript nadal będą się uruchamiać na łączu. Zwykle nie jest to pożądane zachowanie (ale może czasem tak jest?).
Inna różnica polega na tym, że jeśli zaznaczysz tekst, a następnie skopiujesz / wkleisz jako zwykły tekst, otrzymasz:
1st link.
2nd link.
3rd unseen link.
W przypadku 3 tekst zostanie skopiowany. Może byłoby to przydatne w przypadku pewnego rodzaju znaku wodnego lub chciałbyś ukryć informację o prawach autorskich, która pojawiłaby się, gdyby niedbale użytkownik skopiował / wkleił Twoje treści?
Istnieje duża różnica, jeśli chodzi o węzły potomne. Na przykład: jeśli masz div rodzica i zagnieżdżoną div dziecka. Więc jeśli napiszesz w ten sposób:
<div id="parent" style="display:none;">
<div id="child" style="display:block;"></div>
</div>
W takim przypadku żaden div nie będzie widoczny. Ale jeśli napiszesz w ten sposób:
<div id="parent" style="visibility:hidden;">
<div id="child" style="visibility:visible;"></div>
</div>
Wtedy div div będzie widoczny, a div div nie zostanie pokazany.
display: none
usuwa element ze strony całkowicie, a strona jest budowana tak, jakby elementu w ogóle nie było.
Visibility: hidden
pozostawia miejsce w obiegu dokumentów, nawet jeśli go nie widać.
To może, ale nie musi, mieć dużej różnicy w zależności od tego, co robisz.
Gdy visibility:hidden
obiekt nadal zajmuje pionową wysokość na stronie. Dzięki display:none
temu jest całkowicie usuwany. Jeśli masz tekst pod obrazem i tak się dzieje display:none
, tekst zostanie przesunięty w górę, aby wypełnić miejsce, w którym znajdował się obraz. Jeśli zrobisz widoczność: ukryty tekst pozostanie w tej samej lokalizacji.
Oprócz wszystkich innych odpowiedzi, istnieje istotna różnica dla IE8: Jeśli używasz display:none
i próbujesz uzyskać szerokość lub wysokość elementu, IE8 zwraca 0 (podczas gdy inne przeglądarki zwracają rzeczywiste rozmiary). IE8 zwraca poprawną szerokość lub wysokość tylko dla visibility:hidden
.
display: none;
Nie będzie dostępny na stronie i nie zajmuje miejsca.
visibility: hidden;
ukrywa element, ale nadal będzie zajmować taką samą przestrzeń jak poprzednio. Element zostanie ukryty, ale nadal wpływa na układ.
visibility: hidden
zachowaj przestrzeń, display: none
ale nie zachowaj przestrzeni.
Wyświetl brak Przykład: https://www.w3schools.com/css/tryit.asp?filename=trycss_display_none
Ukryty przykład widoczności: https://www.w3schools.com/cssref/tryit.asp?filename=trycss_visibility
Jeśli ustawiono właściwość widoczności "hidden"
, przeglądarka nadal będzie zajmować miejsce na stronie, nawet jeśli jest niewidoczna.
Ale kiedy ustawimy obiekt na "display:none"
, przeglądarka nie przydziela miejsca na stronie na jego zawartość.
Przykład:
<div style="display:none">
Content not display on screen and even space not taken.
</div>
<div style="visibility:hidden">
Content not display on screen but it will take space on screen.
</div>
Inna różnica polega na tym, że visibility:hidden
działa w naprawdę starych przeglądarkach i display:none
nie:
Różnica wykracza poza styl i jest odzwierciedlona w tym, jak zachowują się elementy podczas manipulowania za pomocą JavaScript.
Skutki i skutki uboczne display: none
:
clientWidth
, clientHeight
, offsetWidth
, offsetHeight
, scrollWidth
, scrollHeight
, getBoundingClientRect()
, getComputedStyle()
, cały zysk 0
S.Skutki i skutki uboczne visibility: hidden
:
innerText
(ale nie innerHTML
) elementu docelowego i potomków zwraca pusty ciąg.display:none;
nie wyświetli elementu ani nie przydzieli miejsca na element na stronie, natomiast visibility:hidden;
nie wyświetli elementu na stronie, ale przydzieli miejsce na stronie. W obu przypadkach możemy uzyskać dostęp do elementu w DOM. Aby lepiej to zrozumieć, spójrz na następujący kod:
display: none vs. visibility: hidden
Jest tu wiele szczegółowych odpowiedzi, ale pomyślałem, że powinienem dodać to, aby rozwiązać problem dostępności, ponieważ są to implikacje.
display: none;
i visibility: hidden;
może nie być odczytane przez wszystkie programy do odczytu ekranu. Pamiętaj, czego doświadczą użytkownicy niedowidzący.
Pytanie dotyczy także synonimów. text-indent: -9999px;
to jeden, który jest z grubsza równoważny. Ważną różnicą text-indent
jest to, że często będą czytane przez czytniki ekranu. Może to być trochę nieprzyjemne, ponieważ użytkownicy mogą nadal przechodzić między zakładkami a linkiem.
Dla ułatwienia dostępu widzę dziś kombinację stylów służących do ukrywania elementu, a jednocześnie widoczną dla czytników ekranu.
{
clip: rect(1px, 1px, 1px, 1px);
clip-path: inset(50%);
height: 1px;
width: 1px;
margin: -1px;
overflow: hidden;
padding: 0;
position: absolute;
}
Świetną praktyką jest utworzenie linku „Przejdź do treści” do kotwicy głównej treści. Użytkownicy niedowidzący prawdopodobnie nie chcą słuchać pełnego drzewa nawigacji na każdej stronie. Uczyń link wizualnie ukrytym. Użytkownicy mogą po prostu nacisnąć klawisz Tab, aby uzyskać dostęp do linku.
Aby uzyskać więcej informacji na temat dostępności i ukrytej zawartości, zobacz: