Властивості CSS: Дисплей проти видимості


98

У чому різниця між властивостями дисплей та видимість?



1
@KennyTM: це припущення, що ОП просить спеціально порівняти ці відповідні значення кожного властивості.
BoltClock

Відповіді:


111

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


1
.. не відображає щось спільне з DOM? наприклад ... якщо у вас є display: none;, то цей елемент видаляється з DOM? чи я зовсім заплутався?
Христо

3
@Hristo: Насправді це не так. Ніколи не можна впливати на позицію або присутність елемента в DOM лише за допомогою CSS.
BoltClock

@BoltClock ... так, ти маєш рацію. Я зрозумів , що ви не можете взяти елемент з DOM, але тільки впливає , як він відображається у ставленні до DOM. це звучить точніше?
Христо

Важливо зауважити, що, використовуючи метод skrive () jQuery, який внутрішньо встановлює показ дисплея жодним, ви не можете отримати позицію цього елемента. Хоча за допомогою видимості ви це можете зробити.
p0rsche

21

видимість: приховано;

  • елемент не буде пофарбований ТА НЕ отримує події клацання / дотику, але простір, який він займає, все ще зайнятий
  • оскільки він все ще є для цілей компонування, ви можете виміряти його, не видно
  • зміна вмісту все одно коштуватиме поновлення / компонування сторінки
  • видимість успадковується, тож це означає, що ви можете зробити підлеглих дітей видимими, надаючи їм видимість: видимі;

дисплей: немає;

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

додаткові примітки:

  • зображення із прихованим вмістом: у всіх популярних браузерах зображення все ще завантажуються, хоча вони знаходяться в будь-якому елементі з видимістю: приховано; або дисплей: немає;
  • шрифти в прихованому вмісті: браузери веб-кайтів (Chrome / Safari) можуть затримати завантаження користувацьких шрифтів, які використовуються лише у прихованих елементах, у тому числі через видимість або показ. Це може призвести до вимірювання елементів, які все ще використовують резервний шрифт, поки не буде завантажений спеціальний шрифт.

19

display: жоден елемент не видаляє елемент з потоку html, тоді як видимість: приховано не.


2

дисплей: немає; видалить з DOM елементи візуального стилю / фізичного простору, тоді як видимість: приховано; не видалить елемент, а просто приховає його. Таким чином, div, що займає 300px вертикального простору у вашому DOM, ВИНАГИ буде займати 300px вертикальної ширини при встановленні на видимість: приховано; але коли встановлено для відображення: немає; це візуальні стилі і простір, який він займає, приховано, і простір потім "звільняється" через відсутність кращого слова.

[РЕДАКТУВАННЯ] - Нещодавно я писав вище, і про те, чи я недостатньо обізнаний чи у мене поганий день, я не знаю, але реальність полягає в тому, що цей елемент НІКОЛИ не видаляється з ієрархії DOM. Усі стилі відображення на рівні блоку повністю "приховані" при використанні дисплея: немає, тоді як з видимістю: приховано; сам елемент прихований, але він все ще займає візуальний простір у DOM. Я сподіваюся, що це все прояснить


4
Ні, неdisplay: none буде видалено елемент з DOM. Елемент все ще є, він просто не відображається .
BoltClock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.