Что связано с событием Chrome Recalculate Style?

TL;DR

Что вызывает перерасчет стиля в Chrome и что можно сделать, чтобы сократить время на этот шаг?

Фон

В приложении с большим количеством элементов (переменных, например, 10 000) я наблюдаю, как Пересчет стиля занимает много времени, при добавлении класса к родительскому элементу этих элементов. Существуют селекторы, которые будут влиять на элементы каждого поддерева, когда контейнер имеет этот класс.

В инструментах разработчика я смог отследить причину события Recalculate Style, щелкнув здесь (скриншот MCVE):

Инструменты Chrome dev: как отследить причину события

Исходя из названия, я предполагаю, что этот шаг включает в себя вычисление эффективного (конечного) стиля элемента. Я думаю, это происходит, когда

  1. измененный стиль элемента,
  2. измененный (псевдо) класс

    • of the element itself or
    • родительского или родственного элемента, связанного селектором или
  3. измененный селектор CSS (импорт нового CSS, создание <style>)

заставляет браузер пересчитывать атрибуты CSS элемента.

Попытка доказать мой тезис

Я создал MCVE с тем же количеством элементов, что и в статическом HTML, и переключил класс .change на .container с помощью обработчика click в документе — предельно простой код.

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

Затем я начал добавлять больше стилей ко всем селекторам, и среднее время увеличивалось с каждой новой кучей новых атрибутов CSS. Добавление дополнительных элементов к 10 000 поддеревьев не изменило среднее время.

Итак, я бы сказал, что на этот раз влияет количество атрибутов CSS, количество затронутых селекторов и количество затронутых элементов.


person try-catch-finally    schedule 09.01.2016    source источник


Ответы (1)


Пересчитать стиль

  1. Получить все правила стиля
  2. Оцените селекторы и сопоставьте их с DOM
  3. Рассчитать вычисляемый стиль для каждого элемента

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

Ссылки

person Tim Arney    schedule 10.01.2017
comment
Я проголосовал за этот ответ, потому что на самом деле он не вдается в подробности о том, что на самом деле связано с пересчетом стилей, а также не признает подразумеваемый вопрос ОП о том, как определить, что конкретно делает селекторы более дорогими для оценки, чем другие . - person Dai; 25.11.2020