Работа с CSS через Javascript

Получение всех CSS-свойств элемента ( метод window.getComputedStyle() )

Метод window.getComputedStyle() возвращает объект, содержащий значения всех CSS-свойств элемента после применения всех активных таблиц стилей и завершения базовых вычислений значений, которые они могут содержать. 

Синтаксис метода window.getComputedStyle():

где 

  • element - элемент (Element), CSS-свойства которого необходимо получить (вставка узлов, которые не являются элементами, например, #text, выдаст ошибку);
  • pseudoElt (необязательный) - строка указывающая на найденный псевдоэлемент (опускается или null - для не псевдоэлементов).

Возвращённый объект style - "живой" объект CSSStyleDeclaration, который обновляется автоматически при изменении стилей элемента, только для чтения и может быть использован для инспектирования стиля элемента (включая описание из <style> элемента или внешней таблицы стилей).

ВАЖНО! Для использования метода window.getComputedStyle() для какого-либо элемента необходимо дождаться загрузки этого элемента (страницы) (используйте window.load или расположите скрипт ниже необходимого элемента).

Пример:

Использование метода window.getComputedStyle() с псевдоэлементами

Метод getComputedStyle() может получить информацию о стилях из псевдоэлемента (например, ::after, ::before, ::marker, ::line-marker и т.д.):

Управление встроенными стилями элемента

Самый простой способ управления стилями CSS с помощью JS - это манипулирование атрибутом style отдельных элементов документа (подробнее об атрибуте элемента и свойстве элемента). При этом свойство style объекта Element имеет одну отличительную особенность: его значением является не строка, а объект CSSStyleDeclaration. Свойства этого объекта представляют CSS-свойства, определенные в HTML-атрибуте style.

Итак:

  • атрибут элемента – это код (строки) HTML;
  • свойство элемента – это поле DOM-объекта.

Для нестандартных атрибутов DOM свойство узла как объекта DOM не создаётся.

Например:

Свойства стиля объекта CSSStyleDeclaration имеют тип всех значений string.

Например:

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

Особенности именования свойств объекта CSSStyleDeclaration:

  1. Если имя CSS-атрибута содержит дефисы (например, font-size), имя свойства объекта CSSStyleDeclaration образуется путем удаления дефисов и использования записи формата CamelCase (например, CSS-атрибут border-left-width доступен через свойство borderLeftWidth).
  2. Если CSS-свойство имеет имя, совпадающее с зарезервированным словом языка JavaScript (например, float), к этому имени добавляется префикс «css». В результате получим свойство cssFloat объекта CSSStyleDeclaration.

Особенности использования свойств объекта CSSStyleDeclaration:

  • Атрибут <style> HTML-элемента - это его встроенный стиль, который в целом удобно использовать для начальной установки значений стиля. Однако сценарии JS могут читать свойства объекта CSSStyleDeclaration, только если эти свойства были ранее установлены сценарием на языке JavaScript или если HTML-элемент имеет встроенный атрибут style, установивший нужные свойства, например:

Чтение встроенного стиля элемента представляет особую сложность, когда выполняется чтение свойств стиля, имеющих единицы измерения, а также свойств сокращенной формы записи (сценарий должен включать реализацию синтаксического анализа строк с CSS-стилями, чтобы обеспечить возможность извлечения и дальнейшего использования значений). Иногда бывает проще прочитать или записать единственную строку во встроенный стиль элемента, чем обращаться к объекту CSSStyleDeclaration. Для этого можно использовать методы getAttribute() и setAttribute() объекта Element или свойство cssText объекта CSSStyleDeclaration (подробнее...).

Добавление элементам классов, атрибутов и CSS-стилей (их удаление и проверка наличия)

Class или style

Как правило, существует два способа задания стилей для элемента:

  1. cоздать класс в CSS и в HTML как <div class="..."> и использовать его;
  2. определять стили непосредственно в атрибуте style как <div style="...">.

JavaScript может менять и классы, и свойство style, однако определение и изменение классов – предпочтительный вариант по сравнению с изменением style.

Использование style является приемлемым, если мы вычисляем координаты элемента и хотим установить их из JavaScript, например:

В остальных случаях целесообразно описывать в CSS и добавлять в класс - это более гибкое и лёгкое в поддержке решение.

[свернуть]

Добавление классов 

Классы (class) применяют тогда, когда необходимо определить стиль для индивидуального элемента веб-страницы или задать разные стили для одного тега. При использовании совместно с тегами синтаксис для классов будет следующий:

где

  • tag -  тег, к которому применяется class;
  • className - пользовательское имя класса class (имена классов должны начинаться с латинского символа и могут содержать в себе символ дефиса (-) и подчеркивания (_), использование кириллицы в именах классов недопустимо).

Чтобы указать в коде HTML, что тег используется с определённым классом, к тегу добавляется атрибут class="className":

Добавление одного класса с помощью свойства className:

Присваивание какого-либо значения свойству className элемента полностью заменяет всю строку классов:

Добавление (удаление) выбранного класса из нескольких с помощью объекта (псевдомассива)  classList:

Методы объекта classList:

  • elem.classList.add("class") – добавить класс;
  • elem.classList.remove("class") – удалить класс;
  • elem.classList.toggle("class") – добавить класс, если его нет, иначе - удалить;
  • elem.classList.contains("class") – проверка наличия класса (возвращает true/false).

Объект classList является перебираемым, поэтому можно перечислить все классы элемента при помощи цикла for..of.

Добавление и удаление атрибутов

В CSS селекторы атрибутов позволяют установить стиль для конкретных элементов DOM по присутствию определённого атрибута тега или его значения.

У каждого элемента есть некоторый набор стандартных атрибутов (свойств), описанных в стандарте HTML именно для этого элемента (тега), например для <a> это будут href, name, а для <img> это будут src, alt, и т.д. Итак:

  • атрибуты – это код (строки) HTML;
  • свойство – это поле DOM-объекта.

Для нестандартных атрибутов DOM свойство узла как объекта DOM не создаётся.

Пример

[свернуть]

Доступ к атрибутам осуществляется при помощи методов:

  1. работающих со значением, которое находится в HTML:
    • elem.hasAttribute(nameAttr) – проверяет наличие атрибута;
    • elem.getAttribute(nameAttr) – получает значение атрибута;
    • elem.setAttribute(nameAttr, value) – устанавливает атрибут;
    • elem.removeAttribute(nameAttr) – удаляет атрибут;
  2. свойства elem.attributes, которое содержит объект NamedNodeMap{}.

В отличие от свойств, атрибуты:

  1. всегда являются строками;
  2. их имя нечувствительно к регистру (это HTML);
  3. видны в innerHTML.
Пример

[свернуть]

Методы getAttibute(), setAttribute() и removeAttribute() сразу же меняют HTML-атрибуты элемента (в отличие от DOM-свойств), что вызовет браузерную перерисовку (вы сможете увидеть все изменения, изучив элемент с помощью инструментов разработчика в браузере). Такие перерисовки не только требуют больше ресурсов, чем установка DOM-свойств, но и могут привести к непредвиденным ошибкам. Как правило, их используют для элементов, у которых нет соответствующих DOM-свойств, например, colspan, или для HTML-свойств при наследовании.

Добавление (удаление) CSS-стилей

Свойство элемента element.style – это объект, поля которого соответствуют тому, что написано в атрибуте style, например:

Для обращения к свойству из нескольких слов используется camelCase, например:

  • font-size => elem.style.fontSize;
  • background-color => elem.style.backgroundColor;
  • border-left-width => elem.style.borderLeftWidth.

Стили с браузерным префиксом, например, -moz-border-radius, -webkit-border-radius преобразуются по тому же принципу, при этом дефис обозначается через заглавную букву, например:

  • button.style.MozBorderRadius = '5px';
  • button.style.WebkitBorderRadius = '5px'.

Сброс стилей:

  •  element.style = "none" или
  • element.style = "".

Если установить в element.style пустую строку "", то браузер применит CSS-классы и встроенные стили, как если бы свойства element.style вообще не было.

Установка нескольких стилей в одной строке (свойство style.cssText и метод setAttribute() ):

Это свойство редко используется, потому что такое присваивание удаляет все существующие стили: оно не добавляет, а заменяет их. Его можно использовать, например, для новых элементов.

То же самое можно сделать установкой атрибута методом setAttribute():

 

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.