Видимость влияет на производительность манипулирования DOM?

IE7/Windows XP

У меня есть сторонний компонент на моей странице, который выполняет много манипуляций с DOM, чтобы настраивать себя каждый раз при изменении размера окна браузера.

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

В целом, позволяет ли настройка видимости контейнера невидимой во время изменения размера улучшить производительность рендеринга DOM?

Ответ 1

Предостережение: я специально не тестировал это с помощью IE7, но я достаточно уверен, основываясь на том, что я знаю о своей модели манипуляции DOM.

Изменение свойств CSS (будь то display: none или visibility: hidden или what-have-you) не повлияет на производительность DOM-манипуляции в любой версии любого браузера, с которым я работал. Основной способ улучшить скорость манипуляции с DOM - удалить node (ы), с которыми вы будете работать, из дерева документов, выполнить ваши манипуляции и добавить их обратно. Это включает в себя отслеживание их последующих узлов сестры, если они есть (для использования с insertBefore), что может стать сложным, если вы работаете с узлами, которые разбросаны по всему документу.

Один из методов, который я видел при выполнении большого количества манипуляций DOM, - это получить список дочерних элементов body, удалить их, выполнить ваши манипуляции (где бы они ни попадали в дерево документов), а затем повторно верните дочерние узлы тела. В зависимости от того, как долго выполняются ваши манипуляции с DOM (что частично зависит от скорости вашего компьютера-посетителя!), Это может вызвать заметное мерцание. Вот почему сайты, управляющие контентом через AJAX, обычно заменяют любой временно удаленный контент экраном "spinner" или загрузкой.

Ответ 2

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

Ответ 3

Я только что проверил это, используя ситуацию с диалоговым окном, который у меня есть. В принципе, я скопировал один длинный диалог много раз, пока у меня не будет 100-строчный файл.

HTML:

<div class="no-visible dialog">
    ....
</div>

CSS:

.no-visible {
    visibility: hidden;
    animation:....
    ....
}

вывод представляется:

Он значительно сократил компьютер со всеми JS и CSS, и все мои анимации css исчезли. Особенно, когда нажата кнопка, и JS должен найти соответствующий диалог для отображения, он отставал.

Решение:

Поместите диалоги в другой html (dialogs.html) и загрузите необходимые предметы, если это необходимо.