В чем разница между visibility: hidden и display: none?

Оба правила CSS visibility:hidden и display:none приводят к тому, что элемент не отображается. Это синонимы?

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
1 244
0
618 266
19
Перейти к ответу Данный вопрос помечен как решенный

Ответы 19

display:none удаляет элемент из потока макета.

visibility:hidden скрывает это, но оставляет пространство.

Ответ принят как подходящий

display:none означает, что рассматриваемый тег вообще не будет отображаться на странице (хотя вы все равно можете взаимодействовать с ним через dom). Для него не будет места между другими тегами.

visibility:hidden означает, что, в отличие от display:none, тег не отображается, но для него выделяется место на странице. Тег отображается, его просто нет на странице.

Например:

test | <span style = "[style-tag-value]">Appropriate style in this tag</span> | test

Замена [style-tag-value] на display:none приводит к:

test |   | test

Замена [style-tag-value] на visibility:hidden приводит к:

test |                        | test

Без комментариев по поводу производительности того и другого? Мне любопытно, какой метод использовать, чтобы скрыть абсолютно позиционированные элементы, которые часто отображаются и скрываются.

Tomáš Zato - Reinstate Monica 17.01.2014 14:34

Это полное предположение, что я не проводил никаких тестов, но я предполагаю, что они примерно такие же. Как только что-то изменится на экране, весь экран будет повторно визуализирован (по крайней мере, раньше), так что это не имеет особого значения. Вы все еще заставляете перерисовывать экран. Тем не менее, это может происходить от браузера к браузеру, и на самом деле, вероятно, есть лучшие способы оптимизации кода, чем сосредоточение внимания на них.

kemiller2002 29.01.2014 21:20

Если я использую display: none в таблице стилей, используемой для FF, версия IE ничего не отображает. Вы думаете, что это ошибка?

Si8 11.03.2014 23:01

@Kevin прав в том, что visibility: hidden и display: none будут одинаково эффективны, поскольку они оба повторно запускают макет, раскраску и композицию. Однако opacity: 0 функционально эквивалентен visibility: hidden и не перезапускает шаг макета, поэтому я бы посоветовал использовать это, если вы не возражаете, что пустое пространство все еще выделяется (в противном случае используйте display: none).

jayrobin 23.04.2015 21:25

Когда речь идет о видимости и отображении, важно помнить о css-переходах. Например, переключение видимости: скрыто; видимости: видимый; позволяет использовать css-переходы, тогда как переключение с дисплея: none; для отображения: блок; не. visibility: hidden имеет дополнительное преимущество, так как не фиксирует события javascript, тогда как opacity: 0; фиксирует события.

Michael Deal 21.07.2015 11:09

@MichaelDeal Хорошие моменты. Однако обратите внимание, что хотя css-переходы поддерживаются при изменении видимости, графические процессоры не очень хороши с этим. (думаю, мобильный / заикание).

Ethan 03.12.2015 05:00

@Ethan Интересно, а у вас случился тест? Я действительно считаю, что для каждого элемента требуется дополнительное использование памяти с использованием видимости: скрыто, поскольку браузер сохраняет элемент в состоянии «готово». Я определенно видел, как это ухудшает производительность, если используется большое количество элементов, использующих видимость: скрытый. Например, я бы не стал использовать этот метод для перехода между окнами просмотра, но использовал бы его для перехода кнопки внутри окна просмотра.

Michael Deal 03.12.2015 10:45

@MichaelDeal Использование его с кнопками или подобными небольшими областями (слоями) должно быть нормальным. Я экспериментировал с меню вне холста, где я сохранял видимость меню: скрытый (чтобы не влиять на поисковую оптимизацию, если это вообще происходит), и при щелчке я делал его видимым с переходом - проверил его на временной шкале Chrome, и там было высокое нагрузка. Впоследствии было обнаружено, что такие сильные стороны графических процессоров - это хорошо известная трансляция / поворот / перекос / непрозрачность (www.html5rocks.com/en/tutorials/speed/high-performance-anim‌ations). Однако я не понимаю изменения видимости с помощью переходов - ... (следующий пост)

Ethan 03.12.2015 22:06

(из пред.) ... это либо правда, либо ложь (видимый / скрытый). Наверное, переходы помогают создать буфер на его первом rAF или что-то очень похожее. Небольшое отступление: ознакомьтесь с новым свойством 'will-change'. Вы можете использовать это даже для тех, у кого графические процессоры хороши. Я видел, как сглаживает масло, используя это (хотя и не для видимости) даже на телефонах xiaomi с низким уровнем цен. Ссылка: dev.opera.com/articles/css-will-change-property

Ethan 03.12.2015 22:09

@MichaelDeal Вот еще одна ссылка (из моего списка ссылок), которая может вам помочь. Это дает пример с display: none -> something. indiegamr.com/…

Ethan 03.12.2015 23:36

opacity: 0 следует использовать с осторожностью при работе с входами или кнопками, поскольку они все еще существуют и могут вызывать странные взаимодействия с пользователем.

jacques mouette 15.03.2018 21:21

visibility: collapse; также не выделяет место. developer.mozilla.org/en-US/docs/Web/CSS/visibility

Agnel Vishal 20.01.2019 14:02

@jayrobin display: none на самом деле немного лучше в использовании, чем visibility: hidden, с точки зрения производительности. Если вы имеете дело только с несколькими объектами, это не будет слишком очевидным, но я видел значительное увеличение производительности при использовании display: none вместо visibility: hidden для оптимизации игр с объектами 1k +.

Greyson R. 22.04.2019 20:00

@AgnelVishal - как описано в цитируемой вами ссылке, visibility: collapse делает то, что подразумевает название для элементов таблиц, гибких элементов и элементов XUL. «Для других элементов свертывание рассматривается как скрытое».

ToolmakerSteve 30.04.2019 15:37

display: none полностью удаляет элемент со страницы, и страница строится так, как если бы элемента вообще не было.

Visibility: hidden оставляет пространство в потоке документов, даже если вы его больше не видите.

Это может иметь или не иметь большого значения в зависимости от того, что вы делаете.

Использование $ ('# element'). Remove () полностью удаляет элемент со страницы (DOM). Не отображать его или не использовать пробел не означает его удаление. Вы все еще можете изменить его статус с помощью простого $ ('# element'). Show (), поэтому он не будет «полностью удален».

foxontherock 20.09.2013 23:16

Это не синонимы - display: none удаляет элемент из потока страницы, а остальная часть страницы течет так, как если бы его там не было.

visibility: hidden скрывает элемент от просмотра, но не поток страницы, оставляя для него место на странице.

С visibility:hidden объект по-прежнему занимает вертикальную высоту на странице. В display:none он полностью удален. Если у вас есть текст под изображением и вы используете display:none, этот текст сместится вверх, чтобы заполнить пространство, на котором было изображение. Если вы сделаете видимость: скрыто, текст останется в том же месте.

При скрытом сохраняемое пространство имеет только вертикальное измерение. А как насчет горизонтали?

Chris Noe 25.09.2008 16:50

Сохраняется и горизонтальный размер.

JB Hurteaux 30.10.2008 15:57

display:none скроет элемент и свернет занимаемое пространство, тогда как visibility:hidden скроет элемент и сохранит пространство элементов. display: none также влияет на некоторые свойства, доступные из javascript в более старых версиях IE и Safari.

Это не синонимы.

display:none удаляет элемент из обычного потока страницы, позволяя другим элементам заполнять его.

visibility:hidden оставляет элемент в обычном потоке страницы, так что он все еще занимает место.

Представьте, что вы стоите в очереди на прогулку в парке развлечений, а кто-то в очереди становится настолько шумным, что охрана срывает их с очереди. Затем все в очереди переместятся на одну позицию вперед, чтобы заполнить теперь пустой слот. Это как display:none.

Сравните это с аналогичной ситуацией, но когда кто-то перед вами надевает плащ-невидимку. При просмотре строки будет казаться, что есть пустое пространство, но люди не могут заполнить это пустое пространство, потому что кто-то все еще там. Это как visibility:hidden.

Между ними есть еще одно большое различие: по крайней мере, в Chrome видимость может использоваться с задержкой перехода, но дисплей ее игнорирует.

SapphireSun 02.04.2015 05:47

Забавный способ объяснить, но интересный. :)

Elango Paul Victor 08.02.2020 18:10

Стоит добавить одну вещь, хотя об этом не спрашивали, - это то, что есть третий вариант сделать объект полностью прозрачным. Рассматривать:

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.

(Не забудьте нажать кнопку «Выполнить фрагмент кода» выше, чтобы увидеть результат.)

На разницу между 1 и 2 уже указывалось (а именно, 2 все еще занимает место). Однако есть разница между 2 и 3: в случае 3 мышь по-прежнему переключается на руку при наведении курсора на ссылку, и пользователь по-прежнему может щелкнуть ссылку, а события Javascript по-прежнему будут запускаться по ссылке. Обычно это поведение нет, которое вы хотите (но, может быть, иногда это так?).

Другое отличие состоит в том, что если вы выделите текст, а затем скопируете / вставите его как обычный текст, вы получите следующее:

1st link.
2nd  link.
3rd unseen link.

В случае 3 текст копируется. Может быть, это будет полезно для водяных знаков или если вы хотите скрыть уведомление об авторских правах, которое появится, если пользователь по неосторожности скопирует / вставит ваш контент?

@greenoldman Вы можете привести пример? Вот jsfiddle, где скрытый элемент (я пробовал div и span), который является единственным элементом в своем контейнере, и он все еще занимает место: jsfiddle.net/rmb5wdLd/1

Kip 09.09.2016 16:58

@ Кип, странно - сейчас я не могу этого сделать (да и свой проект тоже поменял). Хорошо, мне лучше удалить свой предыдущий комментарий, и когда у меня будет надежный тестовый пример, я покажу его, извините за шум.

greenoldman 09.09.2016 20:40

Если для свойства видимости установлено значение "hidden", браузер все равно будет занимать место на странице для содержимого, даже если оно невидимо. Но когда мы устанавливаем объект в "display:none", браузер не выделяет место на странице для его содержимого.

Пример:

<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>

Посмотреть детали

В дополнение ко всем другим ответам для IE8 есть важное отличие: если вы используете display:none и пытаетесь получить ширину или высоту элемента, IE8 возвращает 0 (в то время как другие браузеры возвращают фактические размеры). IE8 возвращает правильную ширину или высоту только для visibility:hidden.

visibility:hidden сохраняет пространство; display:none - нет.

visibility:hidden сохранит элемент на странице и займет это пространство, но не будет отображаться пользователю.

display:none не будет доступен на странице и не займет места.

Когда дело доходит до дочерних узлов, существует большая разница. Например: если у вас есть родительский div и вложенный дочерний div. Итак, если вы напишете так:

<div id = "parent" style = "display:none;">
    <div id = "child" style = "display:block;"></div>
</div>

В этом случае ни один из div не будет виден. Но если вы напишете так:

<div id = "parent" style = "visibility:hidden;">
    <div id = "child" style = "visibility:visible;"></div>
</div>

Тогда будет виден дочерний div, тогда как родительский div не будет отображаться.

Хороший момент, это легко упустить. display: none / block не будет запускать переходы, поэтому использование visibility: hidden может работать, но дочерние элементы также нуждаются в vilibility: hidden одновременно

Drenai 08.12.2017 16:39

Еще одно отличие состоит в том, что visibility:hidden работает в действительно старых браузерах, а display:none - нет:

https://www.w3schools.com/cssref/pr_class_visibility.asp

https://www.w3schools.com/cssref/pr_class_display.asp

display: none; 

Он не будет доступен на странице и не займет места.

visibility: hidden; 

он скрывает элемент, но по-прежнему занимает то же место, что и раньше. Элемент будет скрыт, но все равно повлияет на макет.

visibility: hidden сохраняет пространство, тогда как display: none не сохраняет его.

Отображать нет Пример: https://www.w3schools.com/css/tryit.asp?filename=trycss_display_none

Пример скрытой видимости: https://www.w3schools.com/cssref/tryit.asp?filename=trycss_visibility

Я бы не советовал давать ссылки на w3schools из-за известных неточностей на сайте.

Skere 22.10.2018 14:22

display:none; не будет отображать элемент и не будет выделять пространство для элемента на странице, тогда как visibility:hidden; не будет отображать элемент на странице, но будет выделять пространство на странице. В обоих случаях мы можем получить доступ к элементу в DOM. Чтобы лучше понять это, посмотрите следующий код: отображение: нет vs видимость: скрыто

Разница выходит за рамки стиля и отражается в поведении элементов при манипулировании с помощью JavaScript.

Эффекты и побочные эффекты display: none:

  • целевой элемент выводится из документооборота (не влияет на расположение других элементов);
  • затронуты все потомки (тоже не отображаются и не могут «вырваться» из этого наследования);
  • невозможно выполнить измерения ни для целевого элемента, ни для его потомков - они вообще не отображаются, поэтому их clientWidth, clientHeight, offsetWidth, offsetHeight, scrollWidth, scrollHeight, getBoundingClientRect(), getComputedStyle(), все возвращают 0.

Эффекты и побочные эффекты visibility: hidden:

  • целевой элемент скрыт от просмотра, но не выводится из потока и влияет на макет, занимая его обычное пространство;
  • innerText (но не innerHTML) целевого элемента и потомков возвращает пустую строку.

Здесь много подробных ответов, но я подумал, что должен добавить это, чтобы решить проблему доступности, поскольку есть последствия.

display: none; и visibility: hidden; могут быть прочитаны не всеми программами чтения с экрана. Помните, что будут испытывать пользователи с ослабленным зрением.

Вопрос также касается синонимов. text-indent: -9999px; - это еще один, который примерно эквивалентен. Важным отличием text-indent является то, что он часто читается программами чтения с экрана. Это может быть немного неприятно, поскольку пользователи все еще могут переходить по ссылке.

Что касается доступности, то сегодня я использую комбинацию стилей, чтобы скрыть элемент, оставаясь видимым для программ чтения с экрана.

{
  clip: rect(1px, 1px, 1px, 1px);
  clip-path: inset(50%);
  height: 1px;
  width: 1px;
  margin: -1px;
  overflow: hidden;
  padding: 0;
  position: absolute;
}

Отличной практикой является создание ссылки «Перейти к содержимому» на привязку к основной части содержимого. Пользователи с ослабленным зрением, вероятно, не хотят прослушивать ваше полное дерево навигации на каждой странице. Сделайте ссылку визуально скрытой. Пользователи могут просто нажать вкладку, чтобы получить доступ к ссылке.

Подробнее о специальных возможностях и скрытом содержимом см.

дисплей: нет

Он удалит элемент из обычного потока страницы, позволяя другим элементам заполниться.

Элемент вообще не появится на странице, но мы все равно можем взаимодействовать с ним через DOM. Для него не будет места между остальными элементами.

видимость: скрыто

Он оставит элемент в обычном потоке страницы, который все еще занимает место.

Элемент не отображается, и для него выделяется место на странице.

Некоторые другие способы скрыть элементы

Используйте z-индекс

#element {
   z-index: -11111;
}

Переместить элемент со страницы

#element {
   position: absolute; 
   top: -9999em;
   left: -9999em;
}

Интересная информация о свойствах visibility: hidden и display: none

visibility: hidden и display: none будут одинаково эффективны, поскольку они оба повторно запускают макет, окраску и композит. Однако opacity: 0 по функциональности эквивалентен visibility: hidden и не запускает повторно этап макета.

И свойство CSS-transition - тоже важная вещь, о которой нам нужно позаботиться. Потому что переключение с visibility: hidden на visibility: visible позволяет использовать CSS-переходы, а переключение с display: none на display: block - нет. visibility: hidden имеет дополнительное преимущество в том, что не захватывает события JavaScript, тогда как opacity: 0 захватывает события.

Другие вопросы по теме

Есть ли способ вызвать частный метод класса из экземпляра в Ruby?
Как предотвратить скрытие курсора мыши после вызова CComboBox :: ShowDropDown?
Скрытая видимость для библиотеки только заголовка С++
Проблема с тестированием Cypress: модальное окно корзины не отображается
Ошибка PHP: невозможно получить доступ к частной собственности
Как я могу исправить предупреждение о том, что класс «Форма» доступен за пределами определенной области видимости? (ЯВА 17)
Скрытая кнопка не появляется при определенных условиях
Как правильно скомпоновать библиотеку C++, которая ведет себя по-разному в зависимости от ее компиляции?
Как сделать родственный элемент div видимым при наведении курсора на элемент списка
Используя только javascript и css: могу ли я позволить пользователю выборочно отображать и скрывать div разных классов с помощью одного раскрывающегося меню?