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






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
Это полное предположение, что я не проводил никаких тестов, но я предполагаю, что они примерно такие же. Как только что-то изменится на экране, весь экран будет повторно визуализирован (по крайней мере, раньше), так что это не имеет особого значения. Вы все еще заставляете перерисовывать экран. Тем не менее, это может происходить от браузера к браузеру, и на самом деле, вероятно, есть лучшие способы оптимизации кода, чем сосредоточение внимания на них.
Если я использую display: none в таблице стилей, используемой для FF, версия IE ничего не отображает. Вы думаете, что это ошибка?
@Kevin прав в том, что visibility: hidden и display: none будут одинаково эффективны, поскольку они оба повторно запускают макет, раскраску и композицию. Однако opacity: 0 функционально эквивалентен visibility: hidden и не перезапускает шаг макета, поэтому я бы посоветовал использовать это, если вы не возражаете, что пустое пространство все еще выделяется (в противном случае используйте display: none).
Когда речь идет о видимости и отображении, важно помнить о css-переходах. Например, переключение видимости: скрыто; видимости: видимый; позволяет использовать css-переходы, тогда как переключение с дисплея: none; для отображения: блок; не. visibility: hidden имеет дополнительное преимущество, так как не фиксирует события javascript, тогда как opacity: 0; фиксирует события.
@MichaelDeal Хорошие моменты. Однако обратите внимание, что хотя css-переходы поддерживаются при изменении видимости, графические процессоры не очень хороши с этим. (думаю, мобильный / заикание).
@Ethan Интересно, а у вас случился тест? Я действительно считаю, что для каждого элемента требуется дополнительное использование памяти с использованием видимости: скрыто, поскольку браузер сохраняет элемент в состоянии «готово». Я определенно видел, как это ухудшает производительность, если используется большое количество элементов, использующих видимость: скрытый. Например, я бы не стал использовать этот метод для перехода между окнами просмотра, но использовал бы его для перехода кнопки внутри окна просмотра.
@MichaelDeal Использование его с кнопками или подобными небольшими областями (слоями) должно быть нормальным. Я экспериментировал с меню вне холста, где я сохранял видимость меню: скрытый (чтобы не влиять на поисковую оптимизацию, если это вообще происходит), и при щелчке я делал его видимым с переходом - проверил его на временной шкале Chrome, и там было высокое нагрузка. Впоследствии было обнаружено, что такие сильные стороны графических процессоров - это хорошо известная трансляция / поворот / перекос / непрозрачность (www.html5rocks.com/en/tutorials/speed/high-performance-animations). Однако я не понимаю изменения видимости с помощью переходов - ... (следующий пост)
(из пред.) ... это либо правда, либо ложь (видимый / скрытый). Наверное, переходы помогают создать буфер на его первом rAF или что-то очень похожее. Небольшое отступление: ознакомьтесь с новым свойством 'will-change'. Вы можете использовать это даже для тех, у кого графические процессоры хороши. Я видел, как сглаживает масло, используя это (хотя и не для видимости) даже на телефонах xiaomi с низким уровнем цен. Ссылка: dev.opera.com/articles/css-will-change-property
@MichaelDeal Вот еще одна ссылка (из моего списка ссылок), которая может вам помочь. Это дает пример с display: none -> something. indiegamr.com/…
opacity: 0 следует использовать с осторожностью при работе с входами или кнопками, поскольку они все еще существуют и могут вызывать странные взаимодействия с пользователем.
visibility: collapse; также не выделяет место. developer.mozilla.org/en-US/docs/Web/CSS/visibility
@jayrobin display: none на самом деле немного лучше в использовании, чем visibility: hidden, с точки зрения производительности. Если вы имеете дело только с несколькими объектами, это не будет слишком очевидным, но я видел значительное увеличение производительности при использовании display: none вместо visibility: hidden для оптимизации игр с объектами 1k +.
@AgnelVishal - как описано в цитируемой вами ссылке, visibility: collapse делает то, что подразумевает название для элементов таблиц, гибких элементов и элементов XUL. «Для других элементов свертывание рассматривается как скрытое».
display: none полностью удаляет элемент со страницы, и страница строится так, как если бы элемента вообще не было.
Visibility: hidden оставляет пространство в потоке документов, даже если вы его больше не видите.
Это может иметь или не иметь большого значения в зависимости от того, что вы делаете.
Использование $ ('# element'). Remove () полностью удаляет элемент со страницы (DOM). Не отображать его или не использовать пробел не означает его удаление. Вы все еще можете изменить его статус с помощью простого $ ('# element'). Show (), поэтому он не будет «полностью удален».
Это не синонимы - display: none удаляет элемент из потока страницы, а остальная часть страницы течет так, как если бы его там не было.
visibility: hidden скрывает элемент от просмотра, но не поток страницы, оставляя для него место на странице.
С visibility:hidden объект по-прежнему занимает вертикальную высоту на странице. В display:none он полностью удален. Если у вас есть текст под изображением и вы используете display:none, этот текст сместится вверх, чтобы заполнить пространство, на котором было изображение. Если вы сделаете видимость: скрыто, текст останется в том же месте.
При скрытом сохраняемое пространство имеет только вертикальное измерение. А как насчет горизонтали?
Сохраняется и горизонтальный размер.
display:none скроет элемент и свернет занимаемое пространство, тогда как visibility:hidden скроет элемент и сохранит пространство элементов. display: none также влияет на некоторые свойства, доступные из javascript в более старых версиях IE и Safari.
Это не синонимы.
display:none удаляет элемент из обычного потока страницы, позволяя другим элементам заполнять его.
visibility:hidden оставляет элемент в обычном потоке страницы, так что он все еще занимает место.
Представьте, что вы стоите в очереди на прогулку в парке развлечений, а кто-то в очереди становится настолько шумным, что охрана срывает их с очереди. Затем все в очереди переместятся на одну позицию вперед, чтобы заполнить теперь пустой слот. Это как display:none.
Сравните это с аналогичной ситуацией, но когда кто-то перед вами надевает плащ-невидимку. При просмотре строки будет казаться, что есть пустое пространство, но люди не могут заполнить это пустое пространство, потому что кто-то все еще там. Это как visibility:hidden.
Между ними есть еще одно большое различие: по крайней мере, в Chrome видимость может использоваться с задержкой перехода, но дисплей ее игнорирует.
Забавный способ объяснить, но интересный. :)
Стоит добавить одну вещь, хотя об этом не спрашивали, - это то, что есть третий вариант сделать объект полностью прозрачным. Рассматривать:
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
@ Кип, странно - сейчас я не могу этого сделать (да и свой проект тоже поменял). Хорошо, мне лучше удалить свой предыдущий комментарий, и когда у меня будет надежный тестовый пример, я покажу его, извините за шум.
Если для свойства видимости установлено значение "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 одновременно
Еще одно отличие состоит в том, что visibility:hidden работает в действительно старых браузерах, а display:none - нет:
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 из-за известных неточностей на сайте.
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 захватывает события.
Без комментариев по поводу производительности того и другого? Мне любопытно, какой метод использовать, чтобы скрыть абсолютно позиционированные элементы, которые часто отображаются и скрываются.