Есть ли какие-нибудь полезные методы для уменьшения повторения констант в файле CSS?
(Например, несколько разных селекторов, которые должны применять один и тот же цвет или один и тот же размер шрифта)?
Если вы все еще используете Stack Overflow, вы можете обновить принятый ответ, теперь в CSS есть переменные!






Вы можете использовать множественное наследование в своих элементах html (например, <div class = "one two">), но я не знаю, как иметь константы в самих файлах CSS.
Эта ссылка (первая найденная при поиске вашего вопроса в Google), кажется, довольно подробно рассматривает проблему:
Вы должны разделить запятыми каждый идентификатор или класс, например:
h1,h2 {
color: #fff;
}
это просто, но полезно
Насколько мне известно, без программного создания файла CSS невозможно, скажем, определить ваш любимый оттенок синего (# E0EAF1) в одном и только одном месте.
Вы можете довольно легко написать компьютерную программу для создания файла. Выполните простую операцию поиска и замены, а затем сохраните как файл .css.
Перейти с этого source.css…
h1,h2 {
color: %%YOURFAVORITECOLOR%%;
}
div.something {
border-color: %%YOURFAVORITECOLOR%%;
}
в этот target.css…
h1,h2 {
color: #E0EAF1;
}
div.something {
border-color: #E0EAF1;
}
с таким кодом… (VB.NET)
Dim CssText As String = System.IO.File.ReadAllText("C:\source.css")
CssText = CssText.Replace("%%YOURFAVORITECOLOR%%", "#E0EAF1")
System.IO.File.WriteAllText("C:\target.css", CssText)
Элементы могут принадлежать более чем к одному классу, поэтому вы можете сделать что-то вроде этого:
.DefaultBackColor
{
background-color: #123456;
}
.SomeOtherStyle
{
//other stuff here
}
.DefaultForeColor
{
color:#654321;
}
А затем где-нибудь в части содержимого:
<div class = "DefaultBackColor SomeOtherStyle DefaultForeColor">Your content</div>
Слабые стороны здесь в том, что он становится довольно многословным в теле, и вы вряд ли сможете свести его к перечислению цвета только один раз. Но вы могли бы сделать это только два или три раза, и вы можете сгруппировать эти цвета вместе, возможно, на их собственном листе. Теперь, когда вы хотите изменить цветовую схему, они все вместе, и изменение довольно простое.
Но да, моя самая большая жалоба на CSS - это невозможность определять ваши собственные константы.
> «Но да, моя самая большая проблема с CSS - это невозможность определять ваши собственные константы.». Я также не упускаю никаких основных арифметических вычислений и никаких условий if. Мне бы НРАВИТСЯ иметь возможность сказать "ширина: 100% - 10 пикселей"
@Hoffmann [некоторое время спустя] Бум, теперь (скоро) у нас есть calc(). :-)
@VictorZamanian Я буду очень рад, когда все основные браузеры будут поддерживать его. Для любопытных вот документация: developer.mozilla.org/en-US/docs/CSS/calc#Browser_compatibil ity
Ах, без некоторого безумия он никогда не мог бы быть частью спецификации CSS: "Примечание: операторы + и - всегда должны быть окружены пробелами. Например, операнд calc (50% -8px) будет проанализирован в процентах за которым следует отрицательная длина, недопустимое выражение, а операнд calc (50% - 8px) - это процент, за которым следует знак минус и длина ".
@Hoffmann Интересная причуда. В каком-то смысле вроде Octave / Matlab! Как ни странно, что такое поведение предпочитается до принятия аналогичного поведения, как в C, где a-(-b) - a - -b - a- -b. Можно подумать, что было бы лучше. Но, может быть, это не сработает, потому что можно смешивать и сочетать разные единицы? Или что-то? Для меня это хорошо, так как я люблю оставлять пробелы вокруг моих бинарных операторов, но можно подумать, что было бы неплохо, если бы синтаксис учитывал людей, которые также предпочитают a-b.
@VictorZamanian Полагаю, это дело парсинга. Вероятно, это потому, что «-10px» означает отрицательное значение, в то время как calc (30% - 10px) означает вычитание 10px. Но иметь такое ограничение - значит быть довольно ленивым в лексическом анализе этих выражений.
Да, я имел в виду именно это. Очевидно, это не проблема C, так что это должен быть просто «ленивый» синтаксический анализ, возможно, для повышения эффективности. Тогда клиенту не нужно будет определять, какой из унарных или бинарных операторов использовать. Это тоже мое предположение. Не уверен, сколько работы требуется для достижения того же обнаружения, что и в C, но, да ладно, думаю, я смогу с этим жить. :-)
@VictorZamanian Да, конечно, C выполняет такой синтаксический анализ во время компиляции, поэтому производительность не снижается. CSS нужно анализировать «на лету», так что я думаю, что это может быть сделано намеренно с их стороны. В любом случае я тоже доволен calc (), но мне интересно, сможем ли мы сказать: «width: calc (100% - border-right - border-left)», например, с веб-сайта Mozilla, похоже, мы не будем быть способным.
Лично я просто использую селектор с разделителями-запятыми, но есть какое-то решение для программного написания css. Возможно, это немного перебор для ваших более простых нужд, но взгляните на CleverCSS (Python)
Переменные CSS, если он когда-либо будет реализован во всех основных браузерах, может однажды решить эту проблему.
До тех пор вам придется либо копировать и вставлять, либо использовать препроцессор любого типа, как предлагали другие (обычно с использованием сценариев на стороне сервера).
Вы можете использовать динамические CSS-фреймворки, такие как меньше.
Вы можете использовать глобальные переменные, чтобы избежать дублирования.
p{
background-color: #ccc;
}
h1{
background-color: #ccc;
}
Здесь вы можете инициализировать глобальную переменную в селекторе псевдокласса :корень. :корень - это верхний уровень DOM.
:root{
--main--color: #ccc;
}
p{
background-color: var(--main-color);
}
h1{
background-color: var(--main-color);
}
NOTE: This is an experimental technology Because this technology's specification has not stabilized, check the compatibility table for the proper prefixes to use in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future versions of browsers as the spec changes. More Info here
Однако вы всегда можете использовать Syntactically Awesome Style Sheets, т.е.
В случае Sass вы должны использовать $ variable_name вверху для инициализации глобальной переменной.
$base : #ccc;
p{
background-color: $base;
}
h1{
background-color: $base;
}
Попробуйте глобальные переменные, чтобы избежать дублирования кода
h1 {
color: red;
}
p {
font-weight: bold;
}
Или вы можете создавать разные классы
.deflt-color {
color: green;
}
.dflt-nrml-font {
font-size: 12px;
}
.dflt-header-font {
font-size: 18px;
}
Недавно добавлены переменные к официальным спецификациям CSS.
Переменные позволяют сделать что-то вроде этого:
body, html {
margin: 0;
height: 100%;
}
.theme-default {
--page-background-color: #cec;
--page-color: #333;
--button-border-width: 1px;
--button-border-color: #333;
--button-background-color: #f55;
--button-color: #fff;
--gutter-width: 1em;
float: left;
height: 100%;
width: 100%;
background-color: var(--page-background-color);
color: var(--page-color);
}
button {
background-color: var(--button-background-color);
color: var(--button-color);
border-color: var(--button-border-color);
border-width: var(--button-border-width);
}
.pad-box {
padding: var(--gutter-width);
}<div class = "theme-default">
<div class = "pad-box">
<p>
This is a test
</p>
<button>
Themed button
</button>
</div>
</div>К сожалению, поддержка браузеров по-прежнему оставляет желать лучшего. Согласно CanIUse, единственными браузерами, поддерживающими эту функцию сегодня (9 марта 2016 г.), являются Firefox 43+, Chrome 49+, Safari 9.1+ и iOS Safari 9.3+:
Пока переменные CSS не будут широко поддерживаться, вы можете рассмотреть возможность использования языка препроцессора CSS, такого как Меньше или Sass.
Препроцессоры CSS не просто позволят вам использовать переменные, но в значительной степени позволят вам делать все, что вы можете делать с языком программирования.
Например, в Sass вы можете создать такую функцию:
@function exponent($base, $exponent) {
$value: $base;
@if $exponent > 1 {
@for $i from 2 through $exponent {
$value: $value * $base;
}
}
@if $exponent < 1 {
@for $i from 0 through -$exponent {
$value: $value / $base;
}
}
@return $value;
}
Рекомендуется поместить определение пользовательских свойств CSS (также называемых переменными) в селектор :root{}, чтобы не нарушать работу парсера, который не знает о переменных.
@VolkerE. Пользовательские свойства / переменные определяются как любое другое свойство. Их нужно поместить в селектор. Это может быть :root, если они будут применяться глобально, но это также может быть любой другой селектор. Браузеры, которые не поддерживают настраиваемые свойства / переменные (должны) просто игнорировать эти свойства, поскольку спецификации CSS указывают, что все неизвестные свойства должны игнорироваться!
:root {
--primary-color: red;
}
p {
color: var(--primary-color);
}
<p> some red text </p>
Вы можете изменить цвет с помощью JS
var styles = getComputedStyle(document.documentElement);
var value = String(styles.getPropertyValue('--primary-color')).trim();
document.documentElement.style.setProperty('--primary-color', 'blue');