Свойства CSS: отображение и видимость - PullRequest
96 голосов
/ 13 августа 2010

В чем разница между свойствами отображения и видимости?

Ответы [ 4 ]

105 голосов
/ 13 августа 2010

Свойство visibility только сообщает браузеру, показывать элемент или нет.Он либо видимый (visible - вы можете видеть его), либо невидимый (hidden - вы его не видите).

Свойство display сообщает браузеру как рисовать и показывать элемент, если он вообще есть - должен ли он отображаться как элемент inline (т. е. он течет вместе с текстом и другими встроенными элементами) или как элемент block -уровня (т. е. он имеет свойства высоты и ширины, которыеВы можете установить, он плавающий и т. д.), или inline-block (то есть он действует как блок-блок, но вместо этого встроен в строку) и некоторые другие (list-item, table, table-row, table-cell, flex и т. Д.).

Когда вы устанавливаете элемент на display: block, но также задаете visibility: hidden, браузер по-прежнему обрабатывает его как элемент блока, за исключением того, что вы просто невидеть это.Это похоже на то, как вы кладете красную коробку поверх невидимой коробки: красная коробка выглядит так, как будто она парит в воздухе, когда на самом деле она находится над физической коробкой, которую вы не видите.

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

21 голосов
/ 16 сентября 2013

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

  • элемент не будет окрашен и не получит события нажатия / касания, но занимаемое им пространство все еще занято
  • , поскольку он все еще существует для макета, вы можете измерить его, не видя его
  • Изменение содержимого все равно будет стоить время переформатирования / макета страницы
  • видимость наследуется, поэтому это означает, что вы можете сделать видимыми дочерние элементы, предоставив им видимость: visible;

дисплей: нет;

  • сделает элемент не участвующим в потоке / макете
  • может (в зависимости от используемого браузера) уничтожать Flash-фильмы и iframes (которые будут перезагружаться / перезагружаться при повторном показе), хотя вы можете предотвратить это с помощью iframes
  • элемент не займет места. для макета это как будто не существует
  • заставит некоторые браузеры / устройства (например, iPad) напрямую забирать память, используемую этим элементом, вызывая небольшие всплески, если вы переключаетесь между none и другим значением во время анимации

дополнительные примечания:

  • изображения в скрытом контенте: во всех популярных браузерах изображения по-прежнему загружаются, даже если они находятся внутри любого элемента с видимостью: hidden; или дисплей: нет;
  • шрифты в скрытом контенте: браузеры webkit (Chrome / Safari) могут задерживать загрузку пользовательских шрифтов, которые используются только в скрытых элементах, в том числе посредством видимости или отображения. Это может привести к тому, что вы будете измерять элементы, которые все еще используют резервный шрифт, пока не будет загружен пользовательский шрифт.
18 голосов
/ 13 августа 2010

display: none удаляет элемент из потока html, тогда как visibility: hidden не делает.

2 голосов
/ 13 августа 2010

дисплей: нет;удалит визуальный стиль / физическое пространство элементов DOM из DOM, тогда как visibility: hidden;не удалит элемент, а просто скроет его.Таким образом, div, занимающий 300 пикселей по вертикали в вашем DOM, будет по-прежнему занимать 300 пикселей по вертикали при установке на видимость: hidden;но когда установлено отображение: нет;это визуальные стили и занимаемое им пространство скрыто, а затем пространство «освобождается» из-за отсутствия лучшего слова.

[EDIT] - Некоторое время назад я писал выше, иЯ не знаю, был ли он недостаточно осведомлен или имел плохой день, но реальность такова, что элемент НИКОГДА не удаляется из иерархии DOM.Все «стили» отображения на уровне блоков полностью «скрыты» при использовании display: none, тогда как с видимостью: hidden;сам элемент скрыт, но он все еще занимает визуальное пространство в DOM.Я надеюсь, что это проясняет ситуацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...