Много DOM. Скрытый vs display none
Если у меня много DOM на странице, и я установил их для отображения: none, браузер по-прежнему реагирует быстро (прокрутка выполняется быстро, страница выглядит мгновенно).
Однако, если я видимость: скрытые элементы, браузер работает так же медленно, как если бы все они были нарисованы на экране.
Может кто-нибудь объяснить, почему это так?
Ответы
Ответ 1
Хорошо в каком-то смысле они нарисованы (но не совсем): браузер сохраняет место для них, поэтому он должен учитывать элементы при выделении видимых.
См. MDC visibility:hidden
:
Коробка невидимая (полностью прозрачная, ничего не нарисована), но все же влияет на макет. Потомки элемента будут видны, если они имеют видимость: видимые (это не работает в IE до версии 7).
Если вместо этого указать display: none
, браузер должен только заботиться о них и размещать их. Это не обязательно должно учитывать других.
В зависимости от вашего видимого/невидимого отношения и количества элементов это может иметь значение.
Ответ 2
Представьте себе картину.
У вас есть белый фон и начинайте рисовать яблоко с большим количеством деталей в течение одного часа, а затем вы полностью покрываете его другим слоем белой краски.
Это visibility
.
display:none
походит на то, чтобы не рисовать его с самого начала. Конечно, это быстрее при первой загрузке.
Есть недостатки, когда вы используете display:none
, хотя: когда вы переводите его обратно на block
(или inline
и т.д.), вам придется начать рисовать рисунок, но используя видимость, браузер просто царапает последний лак краски и обратно. Поэтому visibility
быстрее в этом случае.
Но помните одно, когда вы используете visibility:hidden
элемент сохраняет свое положение в потоке, поэтому элементы вокруг него не сдвинутся с места.
Если вы хотите, чтобы техническое объяснение проверялось беседа Дэвида Барона.
Ответ 3
Это довольно интересно. Таким образом, по существу visibility: hidden
технически совпадает с opacity: 0
?
Я не создатель браузеров, но разве это не было бы огромным усилением производительности, если бы элементы, которые скрывали видимость, не были визуализированы или не окрашены, а вместо этого окрашены как прозрачный квадрат с размерами элемента? По крайней мере, в тех случаях, когда размеры были известны.
Ответ 4
С visibility:hidden
все они отображаются на экране, но они не отображаются пользователем.
Вместо этого с display:none
они не рисуются
Ответ 5
С visibility: hidden
их размеры должны вычисляться, поэтому для них может быть зарезервировано соответствующее пространство. Они, фактически, все еще нарисованы.
Ответ 6
"браузер так же медленный, как если бы все они были нарисованы на экране."
Я думаю, что это медленно, потому что тег по-прежнему отображается, но не отображается на экране.
Отъезд this
Ответ 7
Потому что display: none
фактически удаляет элементы из DOM. visibility: hidden
просто делает их невидимыми, но они все еще там.
Вы можете заметить разницу, потому что поля ввода формы, которые имеют display: none
, просто не будут включены в форму при ее отправке; поля ввода, которые имеют только набор visibility: hidden
, будут по-прежнему присутствовать. По крайней мере, мой опыт - другие браузеры могут вести себя по-другому.
Ответ 8
Используя display:none
, браузер не инициализирует эти элементы и не отображает контент. Это не тот случай, когда используется visibility:hidden
, который инициализирует эти элементы, но просто скрывает их.
http://wiw.org/~frb/css-docs/display/display.html