написать впереди
Прежде чем обсуждать переплавку и перерисовку, нам нужно знать:
- Браузер использует модель макета на основе потока.
- Браузер будет
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
Операции не вызывают перекомпоновки и перерисовки. - Избегайте частого чтения свойств, которые вызовут перекомпоновку/перерисовку, и если вам действительно нужно использовать их несколько раз, кэшируйте их в переменной.
- Используйте абсолютное позиционирование для элементов со сложной анимацией, чтобы они не попадали в поток документа, иначе это вызовет частые перекомпоновки родительского элемента и последующих элементов.