Почему CSS не поддерживает константы? [закрытый]

CSS никогда не поддерживал константы или переменные напрямую. Всякий раз, когда я пишу такой код:

span.class1 {
  color: #377fb6;
}

div.class2 {
  border: solid 1px #377fb6; /* Repeated color */
}

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

$theme_color1: #377fb6;

span.class1 {
  color: $theme_color1;
}

div.class2 {
  border: solid 1px $theme_color1;
}

Я знаю, что есть обходные пути, такие как использование класса для каждого цвета или создание кода CSS из шаблонов, но мой вопрос is: учитывая, что CSS настолько богат и сложен, почему константы CSS никогда не вводились?

4 ответов


текущий статус [обновление в декабре 2015]

W3C выдал черновик о переменных CSS всего через месяц после того, как этот ответ был отредактирован в последний раз. И в этом месяце довел этот проект до рекомендации кандидата. Он будет оставаться в обзоре по крайней мере до июня 2016 года. А тесты доступно.

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

A свойства - любое свойство, имя которого начинается с двух тире (U + 002D дефис-минус), например --foo. The <custom-property-name> производство соответствует этому: он определяется как любой допустимый идентификатор, который начинается с двух дефисов. свойства предназначены исключительно для использования авторами и пользователями; CSS никогда не даст им смысла за пределами того, что представлено здесь.

пример 1

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

:root {
  --main-color: #06c;
  --accent-color: #006;
}
/* The rest of the CSS file */
#foo h1 {
  color: var(--main-color);
}

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

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

эта функция реализована только в Firefox и Chrome на данный момент, и это (вероятно) займет довольно много времени, пока он не будет реализован в текущих браузерах.

старый ответ от 2012

это оригинальный ответ с марта 2012 года. Он предваряет как" официальный " проект W3C, так и экспериментальные реализации браузера.

почему переменные CSS не находятся в CSS 1 или 2?

EDIT: этот вопрос уже был задан Хокону Вюму ли, отцу CSS (Opera Watchblog (Wayback машина)):

Берни Циммерман: Håkon, Почему CSS не поддерживает константы? Например, возможность присвоить константе значение RGB, смогл сделать обслуживание таблицы стилей очень более управляемым. Это была просто оплошность?

Хакон: нет, мы думали об этом. Правда, это сэкономило бы немного времени. Однако, есть и некоторые минусы. Во-первых, синтаксис CSS был бы более сложным и более похожим на Программирование. Во-вторых, какова будет область действия константы? Файл? Документ? Почему? В конце концов мы решили, что не стоит.

так это не в стандарте, потому что они думали ... --28-->не стоит.

решения

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

когда несколько селекторов используют одни и те же объявления, они могут быть сгруппированы в разделенные запятыми список.в CSS2:группировка

поэтому вместо использования цвета в десяти селекторах часто лучше собирать общие объявления и складывать их вместе. Вместо

.header{
    color: red;
}
.section:nth-of-type(2n) > .ridi.culous > .article:hover{
    color: red;
}
.footer{
    color: blue;
    border: 1px solid blue;
}

использовать

/* Color definitions */
.header,
.section:nth-of-type(2n) > .ridi.culous > .article:hover{
    color: red;
}

.footer{
    color: blue;
}

/* border definitions */
.footer{
    border: 1px solid;
}

использовать наследование, когда это возможно.

обратите внимание, что вы можете объявить почти какая-то переменная, если вы используете абстрактные/простые классы, такие как

.margin5em{
    margin: 5em;
}
.corporateIdentityBackgroundColor{
    background-color: #881200;
}
.corporateIdentityBackgroundImage{
    background-image: url(we/are/awesome/corporation);
}
.backgroundCenter{
    background-position: center center;
}
.backgroundNoRepeat{
    background-repeat: no-repeat;
}

это позволит вам использовать

<div class="corporateIdentityBackgroundImage backgroundCenter backgroundNoRepeat">Ridiculos long class names</div>
<div class="article">
  <p class="margin5em">Yesterday I found a new hobby: Creating class names that are longer then most common words.</p>
</div>

Читайте также:


ответ Дзеты отлично-он, конечно, получил мой upvote-но я хотел бы отметить, что рабочий проект для "переменных CSS" (констант с другим именем) был опубликован всего десять дней назад:

http://dev.w3.org/csswg/css-variables/

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


почему константы CSS никогда не вводились?

CSS не является языком программирования, вот почему. Для переменных можно использовать LESS или SCSS.


есть аргумент для цветовых констант (у нас уже есть несколько предопределенных цветовых констант). Однако переменные приводят к операторам If, если операторы приводят к функциям, функции приводят к Javascript (и doobies).

хотя в этой статье показывает, насколько на самом деле не нужна цветовая константа. Если вы планируете сделать цвет темы, поместите все объявления цвета темы в один оператор или, как уже упоминалось, сделайте класс только для вашего цвета темы. Первый требует разделения определения селектора, Однако, который не пахнет хорошо, а последний кажется посторонним, когда у вас уже есть класс, примененный к тегу.

Я не вижу необходимости в других константах в хорошо разработанном листе. Многочисленное габаритное повторение показывает плохие структуру / конструкцию.