Избегайте повторяющихся констант в CSS

Есть ли какие-нибудь полезные методы для уменьшения повторения констант в файле CSS?

(Например, несколько разных селекторов, которые должны применять один и тот же цвет или один и тот же размер шрифта)?

w3.org/People/Bos/CSS-variables
gavenkoa 02.11.2012 15:31

Если вы все еще используете Stack Overflow, вы можете обновить принятый ответ, теперь в CSS есть переменные!

mikemaccana 29.05.2019 17:23
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
10
2
6 699
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

Вы можете использовать множественное наследование в своих элементах html (например, <div class = "one two">), но я не знаю, как иметь константы в самих файлах CSS.

Эта ссылка (первая найденная при поиске вашего вопроса в Google), кажется, довольно подробно рассматривает проблему:

http://icant.co.uk/articles/cssconstants/

Вы должны разделить запятыми каждый идентификатор или класс, например:

h1,h2 {
  color: #fff;
}

это просто, но полезно

Mudassir 09.04.2014 14:46

Насколько мне известно, без программного создания файла 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 26.09.2012 21:12

@Hoffmann [некоторое время спустя] Бум, теперь (скоро) у нас есть calc(). :-)

Victor Zamanian 22.04.2013 19:54

@VictorZamanian Я буду очень рад, когда все основные браузеры будут поддерживать его. Для любопытных вот документация: developer.mozilla.org/en-US/docs/CSS/calc#Browser_compatibil‌ ity

Hoffmann 23.04.2013 01:05

Ах, без некоторого безумия он никогда не мог бы быть частью спецификации CSS: "Примечание: операторы + и - всегда должны быть окружены пробелами. Например, операнд calc (50% -8px) будет проанализирован в процентах за которым следует отрицательная длина, недопустимое выражение, а операнд calc (50% - 8px) - это процент, за которым следует знак минус и длина ".

Hoffmann 23.04.2013 01:07

@Hoffmann Интересная причуда. В каком-то смысле вроде Octave / Matlab! Как ни странно, что такое поведение предпочитается до принятия аналогичного поведения, как в C, где a-(-b) - a - -b - a- -b. Можно подумать, что было бы лучше. Но, может быть, это не сработает, потому что можно смешивать и сочетать разные единицы? Или что-то? Для меня это хорошо, так как я люблю оставлять пробелы вокруг моих бинарных операторов, но можно подумать, что было бы неплохо, если бы синтаксис учитывал людей, которые также предпочитают a-b.

Victor Zamanian 23.04.2013 01:42

@VictorZamanian Полагаю, это дело парсинга. Вероятно, это потому, что «-10px» означает отрицательное значение, в то время как calc (30% - 10px) означает вычитание 10px. Но иметь такое ограничение - значит быть довольно ленивым в лексическом анализе этих выражений.

Hoffmann 23.04.2013 16:33

Да, я имел в виду именно это. Очевидно, это не проблема C, так что это должен быть просто «ленивый» синтаксический анализ, возможно, для повышения эффективности. Тогда клиенту не нужно будет определять, какой из унарных или бинарных операторов использовать. Это тоже мое предположение. Не уверен, сколько работы требуется для достижения того же обнаружения, что и в C, но, да ладно, думаю, я смогу с этим жить. :-)

Victor Zamanian 23.04.2013 17:40

@VictorZamanian Да, конечно, C выполняет такой синтаксический анализ во время компиляции, поэтому производительность не снижается. CSS нужно анализировать «на лету», так что я думаю, что это может быть сделано намеренно с их стороны. В любом случае я тоже доволен calc (), но мне интересно, сможем ли мы сказать: «width: calc (100% - border-right - border-left)», например, с веб-сайта Mozilla, похоже, мы не будем быть способным.

Hoffmann 23.04.2013 18:41

Лично я просто использую селектор с разделителями-запятыми, но есть какое-то решение для программного написания 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{}, чтобы не нарушать работу парсера, который не знает о переменных.

Volker E. 17.05.2016 02:59

@VolkerE. Пользовательские свойства / переменные определяются как любое другое свойство. Их нужно поместить в селектор. Это может быть :root, если они будут применяться глобально, но это также может быть любой другой селектор. Браузеры, которые не поддерживают настраиваемые свойства / переменные (должны) просто игнорировать эти свойства, поскольку спецификации CSS указывают, что все неизвестные свойства должны игнорироваться!

John Slegers 17.05.2016 14:08

    :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');

Другие вопросы по теме