написать впереди
Прежде чем обсуждать переплавку и перерисовку, нам нужно знать:
- Браузер использует модель макета на основе потока.
- Браузер будет
HTMLанализируется вDOM,ПучокCSSанализируется вCSSOM,DOMиCSSOMобъединены для производстваRender Tree. - имеют
RenderTree, мы знаем стили всех узлов, затем вычисляем их размер и положение на странице и, наконец, рисуем узлы на странице. - Поскольку браузеры используют плавные макеты,
Render TreeВычисление , как правило, нужно пройти только один раз, ноtableза исключением их внутренних элементов, которые могут потребовать нескольких вычислений, обычно занимающих в 3 раза больше времени, чем эквивалентные элементы, поэтому вам следует избегать использованияtableОдна из причин макета.
Одним словом: перерисовка неизбежно вызовет перерисовку, а перерисовка не обязательно вызовет перерисовку.
Перекомпоновать
когдаRender TreeПроцесс, с помощью которого браузер повторно отображает часть или весь документ при изменении размера, структуры или определенных свойств некоторых или всех элементов в документе, называется перекомпоновкой.
Действия, вызывающие перекомпоновку:
- первый рендер страницы
- Изменился размер окна браузера
- Изменение размера или положения элемента
- Изменения содержимого элемента (количество текста или размер изображения и т. д.)
- Изменение размера шрифта элемента
- добавить или удалитьвидимыйиз
DOMэлемент - активация
CSSпсевдоклассы (например::hover) - запрашивать определенные свойства или вызывать определенные методы
Некоторые общие свойства и методы, которые могут вызвать перекомпоновку:
-
clientWidth,clientHeight,clientTop,clientLeft -
offsetWidth,offsetHeight,offsetTop,offsetLeft -
scrollWidth,scrollHeight,scrollTop,scrollLeft -
scrollIntoView(),scrollIntoViewIfNeeded() getComputedStyle()getBoundingClientRect()scrollTo()
Перекрасить
Когда изменение стиля элемента на странице не влияет на его положение в потоке документов (например:color,background-color,visibilityд.), браузер назначит элементу новый стиль и перерисует его, этот процесс называется перерисовкой.
влияние на производительность
Переплавка дороже, чем перекраска.
Иногда даже просто переформатирование одного элемента приводит к перекомпоновке его родителя и любых элементов, следующих за ним.
Современные браузеры оптимизированы для частых перекомпоновок или перерисовок:
Браузер будет поддерживать очередь и помещать в нее все операции, вызывающие перекомпоновку и перерисовку.Если количество задач в очереди или временной интервал достигает порогового значения, браузер очистит очередь и выполнит пакетный процесс, который может превратить несколько перекомпоновок и перерисовок в одну.
Браузер немедленно очищает очередь при доступе к следующим свойствам или методам:
-
clientWidth,clientHeight,clientTop,clientLeft -
offsetWidth,offsetHeight,offsetTop,offsetLeft -
scrollWidth,scrollHeight,scrollTop,scrollLeft -
width,height -
getComputedStyle() -
getBoundingClientRect()
Поскольку в очереди могут быть операции, которые влияют на возвращаемое значение этих свойств или методов, даже если информация, которую вы хотите получить, не имеет ничего общего с изменениями, вызванными операциями в очереди, браузер принудительно очистит очередь для убедитесь, что полученное значение является наиболее точным.
как избежать
CSS
- избегать использования
tableмакет. - насколько это возможно
DOMКонец дерева измененийclass. - Избегайте установки нескольких слоев встроенных стилей.
- Применение анимационных эффектов к
positionсобственностьabsoluteилиfixedна элементе. - избегать использования
CSSвыражения (например:calc()).
JavaScript
- Избегайте частых манипуляций со стилями, лучше всего переписать их все сразу
styleили определите список стилей какclassи поменять все сразуclassАтрибуты. - Избегайте частых операций
DOM,СоздаватьdocumentFragment, на него распространяются всеDOM操作и, наконец, добавьте его в документ. - Вы также можете сначала установить элемент
display: none, и отображать его после завершения операции. Так какdisplayсобственностьnoneвыполняется на элементахDOMОперации не вызывают перекомпоновки и перерисовки. - Избегайте частого чтения свойств, которые вызовут перекомпоновку/перерисовку, и если вам действительно нужно использовать их несколько раз, кэшируйте их в переменной.
- Используйте абсолютное позиционирование для элементов со сложной анимацией, чтобы они не попадали в поток документа, иначе это вызовет частые перекомпоновки родительского элемента и последующих элементов.