Наконец-то пришло время, CSS собирается стать динамичным с введением переменных CSS. Хотя новая технология является экспериментальной, она очень интересна для меня, поскольку это может означать меньшее количество компиляций в моем текущем рабочем процессе CSS на основе Sass.

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

Переменные CSS по определению

Согласно MDN, «переменные CSS - это сущности, определенные авторами CSS, которые содержат определенные значения, которые могут быть повторно использованы в документе. Они задаются с помощью нотации (например, --main-color: black;) и доступны с помощью функции var() (например, color: var(--main-color;). "

Если вы знакомы с переменными в ваших документах на основе LESS и Sass, эта концепция не так уж и нова, но прелесть этой новой технологии заключается в том, что вам не нужно использовать какой-то компилятор (Grunt, Gulp, Codekit и т. Д. …), Чтобы ваш CSS работал правильно.

Зачем вообще переменные?

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

.content { 
  background-brown: brown; 
  color: white; 
  font-size: 1rem; 
} 
.sidebar { 
  background-color: brown; 
  color: white; 
  font-size: 1rem; 
} 
.hero { 
  background-color: blue; 
  color: white; 
  font-size: 2rem; 
}

Здесь я повторил несколько стилей. В этом коде нет ничего плохого. Просто это очень однообразно. Таким образом, вместо того, чтобы набирать что-то снова и снова, переменные здесь, чтобы помочь вам определить конкретные параметры, которые вы можете использовать во всей вашей таблице стилей. Это упрощает ввод и упрощает обновление позже.

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

Основы

Объявление переменной:

.header { --header-bg-color: blue; }

Используя переменную:

.header { background-color: var(--header-bg-color); }

Применяем это на практике в реальном мире

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

<!-- Home Page--> 
<html> 
  <body class="home"> 
    <header class="header"></header> ... 
  </body> 
</html>
<!-- Random Page with Body class of .page--> 
<html>
  <body class="page page-about"> 
    <header class="header"></header> ... 
  </body> 
</html>

HTML предназначен для двух страниц. Одна является домашней страницей, а другая - базовой повторяющейся страницей на веб-сайте.

В нашей таблице стилей мы используем переменные CSS следующим образом:

:root { 
  --header-home-bg-color: blue; 
  --header-pages-bg-color: white; 
} 
.home .header { 
  background-color: var(--header-home-bg-color); 
} 
.page .header { 
  background-color: var(--header-pages-bg-color); 
}

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

Каскадный эффект

При определении и использовании переменных для традиционного CSS применяются те же правила каскадирования.

:root { --color: black; } 
div { --color: green; } 
.notice { --color:red; }
<p>This paragraph will be black because of the root element.</p> 
<div>This div was set to green but only it was</div> 
<div class="notice"> This div is set to red directly. 
<p>This paragraph is also set to red</p> </div>

Использование каскадного характера означает, что вы можете пойти дальше создания настраиваемых свойств для адаптивного дизайна.

:root { 
  --main-margin: 10px; 
}
 
div { 
  margin: var(--main-margin); 
} 
@media(min-width: 767px) { 
 :root { 
    --main-margin: 5px; 
  } 
}

Современные препроцессоры CSS делают приведенный выше код невозможным. То, что показано выше, доступно только с использованием переменных CSS. Как видите, здесь есть большой потенциал.

Объяснение функции var ()

Для получения определенного вами настраиваемого свойства требуется использование функции var(). Он принимает два параметра, один из которых представляет собой массив из нескольких подпараметров.

var(--variable-name [, <declaration-value> ]? )

К настоящему времени я надеюсь, что свойство --_ 26_ имеет смысл, поскольку оно представляет собой саму переменную. <declaration-value> - это запасное значение, используемое, когда переменная недействительна. Эти значения могут быть, например, списком названий шрифтов, разделенных запятыми. Другой пример демонстрирует сокращенную серию определений заполнения: var(--containerpadding, 10px 15px 20px 30px). Обратите внимание, что эти сокращенные значения не разделяются запятыми.

Вот пример со шрифтами:

:root { 
  --font-stack: "Open Sans"; 
} 
body { 
  font-family: var(--font-stack, "Helvetica", "Arial"); 
}

И еще один с сокращенными свойствами:

:root { 
  --base-pad: 10px 20px 30px; 
} 
.article { 
  padding: var(--base-pad, 10px 10px 10px); 
}

Интеграция с JavaScript

Получить значение настраиваемого свойства можно с помощью метода getPropertyValue(), или вы можете установить свойства напрямую, как показано ниже.

<style> 
  /* CSS */
 :root { 
    --brand-primary: blue; 
    --brand-secondary: green; 
  }
  .logo { 
    color: var(--primary-color); 
  } 
</style> 
<!--HTML-->
<div class="header"> 
  <a class="logo">My Brand</a> 
</div> 
<!--JS--> 
<script> 
const logoColor = document.querySelector('logo').style.setProperty('--brand-primary', 'var(--brand-secondary)'); 
</script>

Поддержка браузера

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

Chrome 49, Firefox 42, Safari 9.1 и iOS Safari 9.3 поддерживают некоторые настраиваемые свойства.

Теперь, когда мы изучили, что такое переменные CSS, я надеюсь, вы немного повеселитесь с ними. Я сам пришел из Sass или Less, и я обнаружил, что эту технологию довольно быстро освоить, хотя есть некоторые новые функции, которые вы обычно не получаете из коробки с Sass или Less. В частности, следует разумно использовать эффекты наследования и каскадирования.

Если CSS-переменные вас интересуют, ознакомьтесь с прошлой статьей Расширенные селекторы CSS, о которых вы никогда не знали. Удачного взлома!

Первоначально опубликовано на сайте web-crunch.com 18 декабря 2016 г.