Хабы: JavaScript, CSS
На днях столкнулся с интересным вопросом. Что быстрее element.style.setProperty(свойство, значение)
или element.setAttribute('style', 'свойство: значение')
? На первый взгляд ответ кажется очевидным. Логика говорит нам, что setProperty
должен устанавливать значение сразу в CSSOM, тогда как setAttribute
выставляет сначала атрибут style
и уже потом значение атрибута будет разобрано в CSSOM. Таким образом, setProperty
должен быть быстрее. Но действительно ли всё так однозначно? Давайте разбираться.
Начнем с того, что немного освежим мат. часть. Мы знаем, что стили описываются с помощью языка CSS. Получив строковое описание стилей на языке CSS, браузер разбирает его и составляет объект CSSOM. Интерфейс этого объекта представлен спецификацией https://www.w3.org/TR/cssom-1. Он следует принципам каскадности и наследования, изложенным в https://www.w3.org/TR/css-cascade-4.
Из выше указанных спецификаций мы знаем, что основной единицей CSS является "свойство". Свойству присваивается значение, характерное конкретно этому свойству. Если значение не задано явным образом, оно наследуется от выше стоящего стиля или, если нет вышестоящего, будет установлено initial value.
Набор свойств для элемента собирается в правила CSSRule. Правила бывают разных типов. Наиболее популярный тип - CSSStyleRule
, определяющий свойства элемента. Такое правило начинается с указания одного из валидных селекторов и последующих фигурных скобок с набором свойств и значений <selector>: { ... }
Имеются и другие типы правил, например CSSFontFaceRule, описывающий параметры подключаемого шрифта @font-face { ... }
, CSSMediaRule - @media { ... }
и др. Полный список в спецификации https://www.w3.org/TR/cssom-1/#css-rules.
Читать далее