Взаимодействие между Javascript и CSS с помощью CSS-переменных

Воскресенье, 21 Август 2016 10:41

На 2016 г. CSS-переменные полностью работоспособны в Chrome и Firefox, у IE тоже в планах реализовать их.

Как часто бывает с новинками JavaScript и CSS, не сразу удается представить себе, для чего CSS-переменные могут пригодиться. Для большинства из нас эти переменные — что-то новое и непривычное, так что не всегда очевидно, к чему их применить. Но мы нашли замечательный ответ — взаимодействие между Javascript и CSS.

Что такое CSS-переменные?

CSS-переменные (см. спецификацию) добавляют в CSS два новых понятия. Отныне можно определять собственные свойства, начинающиеся с двойного дефиса (--):

html {
 
--main-color:#06c
}

А затем использовать их с помощью var():

a {
  color
:var(--main-color)
}

Для всех, кто знаком с SASS или подобным языком, компилирующимся в CSS, преимущества этого очевидны, можно запросто менять цвета, размеры и т.п. всего в одном месте.

Что интересно, переменные подчиняются тем же правилам наследования, что другие CSS-свойства. Например, вдруг мы решили поэкспериментировать с основным цветом нашего блога:

.blog-post {
 
--main-color:#9b806b
}

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

CSS-переменные просто великолепно сочетаются с выражением calc():

html {
 
--header-height:40px
}

.page-content {
  top
: calc(var(--header-height)+10px)
}

CSS-переменные и JavaScript

Недавно мы натолкнулись на полифил для ползунка, который написала Лиа Веру, с интересным примером использования CSS-переменных для связи между JavaScript и CSS.

Исторически единственным способом управлять стилями переменной или функцией из JavaScript было, по сути, писать CSS в самом скрипте:

myElement.style.height = height +'px'

Не так уж редко случается отказываться от отдельного CSS вообще и просто писать стили в JS:

var newStyles = document.createElement('style')
document
.head.append(newStyles)
newStyles
.innerHTML =".my-element {"+
 
"height: "+ height +"px;"+
 
"width: 40px;"+
 
"color: #9b806b;"+
"}"

CSS-переменные позволяют делать намного лучше, возьмем тот же пример:

.my-element {
  height
:var(--element-height);
  width
:40px;
  color
:#9b806b;
}

Тогда в JavaScript можно прописать эту переменную именно для нашего элемента:

myElement.style.setProperty('--element-height', height +'px')

Если исхитриться, можно обойтись и без конкатенации:

.my-element {
  height
: calc(var(--element-height)*1px);
}
myElement.style.setProperty('--element-height', height)

Можно даже определить в CSS значение по умолчанию, которое потом переопределится скриптом:

html {
   
/* переопределится в JS */
 
--element-height:20px
}

Теперь можно аккуратно передавать информацию между JavaScript и стилями. Ну разве это не потрясающе?

Источник: http://css-live.ru/articles/vzaimodejstvie-mezhdu-javascript-i-css-s-pomoshhyu-css-peremennyx.html