Много DOM.Скрыто против отображения нет - PullRequest
16 голосов
/ 18 января 2011

Если у меня много DOM на странице, и я установил их все для отображения: нет, браузер все равно реагирует быстро (прокрутка быстрая, страница чувствует себя быстро).

Однако, если я вижу видимость: элементы скрыты, браузер работает так же медленно, как если бы они все рисовались на экране.

Может кто-нибудь подробно объяснить, почему это так?

Ответы [ 8 ]

21 голосов
/ 18 января 2011

Ну, в некотором смысле, они нарисованы (но не совсем): браузер оставляет место для них, поэтому он должен учитывать элементы при размещении видимых.

См. MDC visibility:hidden:

Ящик невидим (полностью прозрачен, ничего не рисуется), но все же влияет на макет .Потомки элемента будут видны, если они имеют видимость: видимый (это не работает в IE до версии 7).

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

В зависимости от вашего отношения видимого / невидимого и количества элементов, это может иметь значение.

11 голосов
/ 18 января 2011

Представьте себе картину.
У вас есть белый фон, и вы начинаете рисовать яблоко с большим количеством деталей в течение одного часа, а затем полностью покрываете его другим слоем белой краски.Это visibility.

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

Есть недостатки, когда вы используете display:none, однако: когда вы переключаете его обратно на block (или inline и т. Д.), Вам придется начать рисоватьрисуя, но используя видимость, браузер просто царапает последний слой краски, и он вернулся.Так что visibility в этом случае быстрее.

Но помните одну вещь, когда вы используете visibility:hidden, элемент сохраняет свою позицию в потоке, поэтому элементы вокруг него не сдвигаются .

Если вы хотите получить техническое объяснение, проверьте Доклад Дэвида Барона .

4 голосов
/ 23 июня 2011

Это довольно интересно. Так что по сути visibility: hidden технически совпадает с opacity: 0?

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

2 голосов
/ 18 января 2011

При visibility: hidden их размеры должны быть рассчитаны, чтобы для них было зарезервировано соответствующее количество места.По сути, они все еще нарисованы.

2 голосов
/ 18 января 2011

С visibility:hidden все они нарисованы на экране, но они не видны пользователю. Вместо этого с display:none они не нарисованы

0 голосов
/ 18 января 2011

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

http://wiw.org/~frb/css-docs/display/display.html

0 голосов
/ 18 января 2011

Потому что display: none фактически удаляет элементы из DOM.visibility: hidden просто делает их невидимыми, но они все еще там.

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

0 голосов
/ 18 января 2011

"браузер работает так медленно, как будто все они нарисованы на экране."

Я думаю, что это медленно, потому что тег все еще отображается, но не отображается на экране.

Проверить это

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