Использование CSS @Variables

Я пытаюсь использовать переменные CSS. Я ищу в Интернете учебные пособия, и все они пока работают.

Вот мой CSS:

@variables {
 defaultColor: #8E5050;
 defaultBackGround: #E1DBC3;
}
body {
 background: var(defaultBackGround);
}
a {
 color: var(defaultColor);
}

Я также пробовал:

body {
 background: @defaultBackGround;
}
a {
 color: @defaultColor;
}

Ни один из них не работает, что я делаю не так? Спасибо


person Tech4Wilco    schedule 28.09.2011    source источник
comment
Возможно, потому, что их поддержка очень ограничена, и на данном этапе они являются только предложением по прошествии 3+ лет. Есть причина, по которой вы не можете найти о них много информации. Посмотрите на предлагаемые препроцессоры CSS, о которых упоминал Петах.   -  person Doozer Blake    schedule 28.09.2011
comment
Вам просто не хватает префикса с двойным тире --, например. --defaultColor: #8E5050; и использовать эту переменную background: var(--defaultBackGround);   -  person Dave Everitt    schedule 03.02.2018
comment
@DaveEveritt, это был старый вопрос, переменные CSS и особые правила поведения тогда не применялись! Ниже есть ответ о собственных переменных.   -  person Salim Mahboubi    schedule 17.03.2018


Ответы (4)


Я бы использовал препроцессор CSS, такой как Sass или Less.

person Petah    schedule 28.09.2011
comment
Также вы можете взглянуть на CSS Variable Shim @ cssvariables.com - person Brandon.Staley; 21.01.2014
comment
оформить заказ в блоге toobler.com/blog/finally-css-variables-arhibited - person Hunter; 26.10.2016

Используемые вами переменные не входят в стандартную спецификацию CSS. Похоже, вы пишете в каком-то CSS-фреймворке.

Если вы действительно хотите использовать чистый CSS, вам придется каждый раз вручную устанавливать значения цветов / полей / отступов. Но в этом вам может помочь хорошая функция «Найти и заменить» в вашем любимом текстовом редакторе. :)

Если вы хотите использовать эти переменные, @Petah найдет для вас правильный ответ. :)

person fboes    schedule 28.09.2011

Используйте собственные переменные CSS3!

Переменные на самом деле являются встроенной функцией CSS3 - вы можете прочитать спецификацию на MDN. Однако это все еще относительно новая функция, поэтому вы можете ознакомиться с диаграммами поддержки браузера здесь перед их использованием.

При этом переменные CSS поддерживаются последними версиями Chrome, Firefox, Opera, Safari и Microsoft Edge.

В следующем коде показан пример использования переменных CSS:

:root {
    --name: #ff0000;
}
p {
    color: var(--name);
}

Как это работает?

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

Переменная может быть определена с помощью --name:content;, где name - это имя переменной, а содержимое - это содержимое переменной (это может быть цвет, например #ff0000, размер, например 1em, или одно из многих других возможных значений).

Затем просто используйте var(--name) вместо свойства в вашем коде CSS, где name - это снова имя, которое вы назвали переменной.

person Toastrackenigma    schedule 29.12.2013
comment
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки. В противном случае ваш ответ станет бесполезным, если ссылка умрет. Более того, связанный документ не дает матрицы совместимости. Есть ли ограничения при поддержке браузера? - person Izzy; 30.05.2014
comment
Отредактировано, чтобы включить пример кода, объяснение того, как их использовать, и поддержку браузера (для получения дополнительной информации о ситуации с поддержкой браузера посетите http://caniuse.com/#search=variables. - person Toastrackenigma; 31.05.2014
comment
Большое спасибо! Как я и боялся, в браузерах ничего не работает. Ваш пример похож на старый черновик, где префикс var- был заменен на --. Кроме того, некоторые ссылки имеют корневой элемент с именем :root, другие ::root. Некоторые говорят, что используйте var(name) (как в вашем примере) и сопоставьте этот кросс-браузер (из var-name, -webkit-var-name и т.д.), текущий черновик записывает var(--name) и не допускает различных (специфичных для браузера) объявлений. Я очень запутался. Ничего не готового для использования. - person Izzy; 31.05.2014
comment
Для справки о том, что я написал с различными обозначениями и черновиком, см. Создание глобальных переменных CSS: управление темами таблицы стилей: корневой элемент - ::root, переменные имеют префикс -- и должны передаваться в var() с использованием их полного имени. То, что там упоминается OP, соответствует проекту W3C. - person Izzy; 31.05.2014
comment
Да, спецификация довольно схематична, и я думаю, что W3C планирует изменить некоторые ее части, но когда они закончат, это будет очень круто. В любом случае, рад, что смог помочь :) - person Toastrackenigma; 08.06.2014
comment
оформить заказ в блоге toobler.com/blog/finally-css-variables-arhibited - person Hunter; 26.10.2016
comment
@Izzy: Я когда-либо видел, чтобы кто-то ссылался на: root как :: root только тогда, когда они ошибочно полагали, что это псевдоэлемент, а не псевдокласс. : root - это псевдокласс, и всегда им был - нет смысла быть псевдоэлементом, потому что корневой элемент - это всего лишь element. - person BoltClock; 29.07.2017
comment
Но Иззи прав в том, что никогда не было никаких доказательств того, что поставщики добавляли префиксы к настраиваемым свойствам (кроме, возможно, обсуждений в стиле www, посвященных тому, как их экспериментально реализовать) - к тому времени, когда поставщики начали внедряя их, все уже согласились никогда больше не использовать префиксы для экспериментальных стандартов. - person BoltClock; 29.07.2017
comment
@BoltClock В одна из первых статей об исходной спецификации, вся разметка был префикс поставщика, и я считаю, что исходные, помеченные реализации Chrome / Firefox действительно использовали префиксы ?? Следовательно, другой ответ на этой странице поставщика также добавляет им префиксы. С тех пор спецификации и реализации сильно изменились, и я пытался периодически редактировать этот ответ, чтобы поддерживать его в актуальном состоянии. Теперь спецификация окончательна (я полагаю) и реализована во всех основных браузерах, и мое последнее изменение отражает это - весь код в ней на данный момент действителен. - person Toastrackenigma; 29.07.2017
comment
Эта статья, кажется, просто размышляет о том, как будут использоваться экспериментальные реализации - очень похоже на эта статья (изначально с сайта html5rocks.com), в которой перечислены несколько префиксов для position: sticky, которых в большинстве случаев никогда не существовало, просто из предположение, что именно так это будет реализовано экспериментально. Никакая реализация какой-либо версии css-переменных фактически не использовала префиксы поставщиков. - person BoltClock; 29.07.2017

Насколько я понимаю, переменные еще не полностью поддерживаются, но вот как вы установите их, когда они есть:

/* declare in :root with the usual browser prefixes */
:root {
  var-myVariableColor: #f00;
  -webkit-var-myVariableColor: #f00;
  -moz-var-myVariableColor: #f00;
  -ie-var-myVariableColor: #f00;
}

/* to reference encase in var() */
body {
  background-color: var(myVariableColor);
}
person Dave Maison    schedule 03.03.2014
comment
Так что насчет совместимости? Ваш пример предполагает, что он работает как минимум с браузерами Firefox, Webkit и MSIE. Этот документ Mozilla предполагает иное (только FF29 +), и даже дает немного другой синтаксис. - person Izzy; 30.05.2014
comment
здесь неправильный синтаксис, см. этот ответ: stackoverflow.com/a/23983026/123033 - person Dave Everitt; 03.02.2018
comment
Правильно @DaveEveritt. Когда я писал этот пост 4 года назад, это был синтаксис старой спецификации (css3.bradshawenterprises .com / blog / css-variables) Сообщение toastrackenigma содержит правильный и актуальный ответ - person Dave Maison; 22.05.2018