Создайте переменную в файле .CSS для использования в этом файле .CSS

Possible Duplicate:
Avoiding repeated constants in CSS

У нас есть несколько «цветов темы», которые повторно используются в нашем листе CSS.

Есть ли способ установить переменную, а затем повторно использовать ее?

Например.

.css
OurColor: Blue

H1 { 
 color:OurColor;
}

См. Этот вопрос: http://stackoverflow.com/questions/30170/avoiding-repeated-c‌ onstants-in-css # 3018‌ 9

Joel Coehoorn 06.09.2008 20:32

Это возможно с переменными css, которые теперь поддерживаются большинством современных браузеров, css будет выглядеть так: :root{--main-color: blue} H1{color:var(--main-color)} публикация в качестве комментария, потому что переменные css не указаны ниже, а вопрос помечен как дубликат (поэтому я не могу ответить), но это характерно для переменных, где отмеченный дубликат явно не относится к переменным.

Arthur Weborg 25.05.2016 16:29
Приемы 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 сценарий полностью изменился.
51
3
36 785
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

Поскольку в CSS этого нет (пока, я думаю, в следующей версии будет), следуйте совету Конрада Рудольфа по предварительной обработке. Вероятно, вы захотите использовать тот, который уже существует: m4

http://www.gnu.org/software/m4/m4.html

Вы не первый, кто задается вопросом, и ответ отрицательный. У Эллиотта есть хорошая напыщенная речь: http://cafe.elharo.com/web/css-repeats-itself/. Вы можете использовать JSP или его эквивалент для генерации CSS во время выполнения.

Действительно, единственный способ сделать это - заставить сервер сгенерировать ваш файл CSS, что можно сделать разными способами, в зависимости от того, какой язык вы используете. HttpHandler распространены в C#. Вы можете использовать jQuery или тому подобное, чтобы добавить стиль к каждому элементу с классом ourColur и параметризовать свой JS

Xian 06.09.2008 18:42

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

Например:

$blue: #3bbfce;
$margin: 16px;

.content-navigation {
  border-color: $blue;
  color:
    darken($blue, 9%);
}

.border {
  padding: $margin / 2;
  margin: $margin / 2;
  border-color: $blue;
}

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

table.hl {
  margin: 2em 0;
  td.ln {
    text-align: right;
  }
}

li {
  font: {
    family: serif;
    weight: bold;
    size: 1.2em;
  }
}

Более того: миксины, которые действуют как функции, и возможность наследовать один селектор от другого. Это очень умно и очень полезно.

Если вы пишете код на Ruby on Rails, он даже автоматически скомпилирует его в CSS, но есть также компилятор общего назначения, который может сделать это за вас по запросу.

Sass не зависит от рельсов. Ruby нужен только для запуска скрипта, который преобразует ваш исходный код sass в css. В противном случае ваш сайт может быть построен на любом выбранном вами языке.

Andrew Vit 30.04.2010 21:05

Выделенный URL-адрес Sass / SCSS - sass-lang.com

Andy Ford 21.01.2011 08:22
Ответ принят как подходящий

Нет требования, чтобы все стили для селектора находились в одном правиле, и одно правило может применяться к нескольким селекторам ... поэтому переверните это:

/* Theme color: text */
H1, P, TABLE, UL
{ color: blue; }

/* Theme color: emphasis */
B, I, STRONG, EM
{ color: #00006F; }

/* ... */

/* Theme font: header */
H1, H2, H3, H4, H5, H6
{ font-family: Comic Sans MS; }

/* ... */

/* H1-specific styles */
H1
{ 
   font-size: 2em; 
   margin-bottom: 1em;
}

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

Обратите внимание на акцент на «концептуально» в последнем предложении ... Это только что появилось в комментариях, так что я собираюсь немного расширить его, так как я видел, как люди совершают одну и ту же ошибку снова и снова в течение многих лет - предшествовало даже существованию CSS: два атрибута с одинаковым значением не обязательно означают, что они представляют один и тот же концепция. Небо вечером может казаться красным, как и помидоры, но небо и помидор не красные по одной и той же причине, и их цвета буду меняются со временем независимо. Точно так же, просто потому, что у вас есть два элемента в вашей таблице стилей, которым присвоен один и тот же цвет, размер или расположение, не означает, что они будут использовать эти значения в всегда. Наивный дизайнер, использующий группировку (как описано здесь) или переменный процессор, такой как SASS или LESS, чтобы избежать повторения ценить, рискует внести в будущем изменения в стили, которые невероятно подвержены ошибкам; всегда сосредотачивайтесь на контекстное значение стилей, когда хотите уменьшить повторение, игнорируя их текущие значения.

+1 К сожалению, для меня все еще легко (для меня) стрелять одной (своей) ногой с приоритетом CSS в сложных случаях - и в таких случаях, просто добавление еще одного элемента в селектор может склонить чашу весов! (Поэтому очень важно сохранять аккуратный и хорошо организованный CSS и стараться избегать [чрезмерных] переопределений.)

user166390 31.10.2010 02:53

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

Adrian Maire 03.10.2014 21:53

Важно не путать ценить объекта с цель объекта, @Adrian. Если цвет первого элемента и фон второго не связаны между собой, то использование одной и той же переменной для обоих - даже если изначально они будет иметь одинаковую ценность - ставит вас в кошмар обслуживания в будущем: «Почему изменили цвет текста для основного? -страничные баннеры затемняют обязательные поля ввода в профилях? " Сортировать. Независимо от того, используете ли вы переменные или группировку селекторов, чтобы избежать повторения, вы всегда должны уделять внимание семантике, не ценности.

Shog9 03.10.2014 22:12

@ Shog9 Конечно, ты прав. Обычно некоторые параметры, особенно цвета, - это вращение нескольких цветов в скине: темный цвет на чистом фоне, а для кнопки мы используем обратное: ясно на темном. Так что их изменение актуально для всех случаев.

Adrian Maire 03.10.2014 23:06

Вы все усложняете. Это причина существования каскада. Просто укажите свои селекторы элементов и классифицируйте свой цвет:

h1 {
   color: #000;
}
.a-theme-color {
   color: #333;
}

Затем примените его к элементам в HTML, переопределив, когда вам нужно использовать цвета вашей темы.

<h1>This is my heading.</h1>
<h1 class = "a-theme-color">This is my theme heading.</h1>

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

buti-oxa 06.09.2008 19:02

Раздувает HTML и усложняет применение стилей. Например, <H1.PageTitle> Это заголовок страницы </H1> Я хочу иметь ВСЕ стили для PageTitle в CSS. С помощью предложенного метода мне нужно было бы обернуть указанный выше html в <span.a = theme-color>, что удваивает код CSS a

Clay Nichols 07.09.2008 00:33

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

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

jsfiddle.net/TfGgJ/1 Not working here, FF 16 under Linux Mint 13.
a coder 30.01.2013 02:28

См. Также Избегайте повторяющихся констант в CSS. Как сказал Фаринья, было сделано предложение по переменным CSS, но пока вы хотите использовать препроцессор.

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

.ourColor { color: blue; }
.ourBorder { border: 1px solid blue; }
.bigText { font-size: 1.5em; }

а затем объедините классы по мере необходимости:

<h1 class = "ourColor">Blue Header</h1>
<div class = "ourColor bigText">Some big blue text.</div>
<div class = "ourColor ourBorder">Some blue text with blue border.</div>

Это позволяет вам повторно использовать класс ourColor без необходимости многократно определять цвет в вашем CSS. Если вы измените тему, просто измените правило для нашего цвета.

Это может показаться безумием, но если вы используете NAnt (или Ant или другую автоматизированную систему сборки), вы можете использовать свойства NAnt в качестве переменных CSS хитрым способом. Начните с файла шаблона CSS (возможно, styles.css.template или что-то в этом роде), содержащего что-то вроде этого:

a {
    color: ${colors.blue};
}

    a:hover {
        color: ${colors.blue.light};
    }

p {
    padding: ${padding.normal};
}

А затем добавьте в свою сборку шаг, который присваивает всем значениям свойств (я использую внешние файлы сборки и <include> их) и использует фильтр <expandproperties> для генерации фактического CSS:

<property name = "colors.blue" value = "#0066FF" />
<property name = "colors.blue.light" value = "#0099FF" />
<property name = "padding.normal" value = "0.5em" />

<copy file = "styles.css.template" tofile = "styles.css" overwrite = "true">
    <filterchain>
        <expandproperties/>
    </filterchain>
</copy>

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

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

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

gavenkoa 02.11.2012 11:52

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

Вот два основных подхода к достижению более динамичной обработки стилей:

  • Серверные переменные во встроенном css
    Пример (с использованием PHP):

    <style> .myclass{color:<?php echo $color; ?>;} </style>

 

  • Манипуляции с DOM с помощью javascript для изменения css на стороне клиента Примеры (с использованием библиотеки jQuery):

    $('.myclass').css('color', 'blue');

    OR

    //The jsvarColor could be set with the original page response javascript
    // in the DOM or retrieved on demand (AJAX) based on user action. $('.myclass').css('color', jsvarColor);

Я написал макрос (в Visual Studio), который позволяет мне не только кодировать CSS для именованных цветов, но и легко вычислять оттенки или смеси этих цветов. Он также обрабатывает шрифты. Он запускается при сохранении и выводит отдельную версию файла CSS. Это соответствует Аргумент Берта Боса, что любая обработка символов в CSS происходит на этапе разработки, а не на этапе интерпретации.

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


Цели этого подхода заключаются в следующем:

  1. Разрешить центральное определение основных цветов, шрифтов и т. д., Чтобы можно было легко настроить всю палитру или типографское оформление без необходимости использовать поиск / замену

  2. Избегайте сопоставления расширения .CSS в IIS

  3. Создание разнообразных текстовых CSS-файлов, которые можно использовать, например, в режиме разработки VisualStudio.

  4. Создавайте эти файлы один раз во время разработки, а не пересчитывайте их каждый раз при запросе файла CSS.

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

При таком подходе цвета, оттенки цветов и семейства шрифтов представлены сокращенными лексемами, которые ссылаются на список значений в XML-файле.

XML-файл, содержащий определения цвета и шрифта, должен называться Constants.xml и должен находиться в той же папке, что и файлы CSS.

Метод ProcessCSS запускается EnvironmentEvents всякий раз, когда VisualStudio сохраняет файл CSS. Файл CSS раскрывается, и расширенная статическая версия файла сохраняется в папке / css / static /. (Все HTML-страницы должны ссылаться на / css / static / версии файлов CSS).

Файл Constants.xml может выглядеть примерно так:

<?xml version = "1.0" encoding = "utf-8" ?>
<cssconstants>
  <colors>
    <color name = "Red" value = "BE1E2D" />
    <color name = "Orange" value = "E36F1E" />
    ...
  </colors>
  <fonts>
    <font name = "Text" value = "'Segoe UI',Verdana,Arial,Helvetica,Geneva,sans-serif" />
    <font name = "Serif" value = "Georgia,'Times New Roman',Times,serif" />
    ...
  </fonts>
</cssconstants>

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

   font-family:[[f:Text]];
   background:[[c:Background]]; 
   border-top:1px solid [[c:Red+.5]]; /* 50% white tint of red */

Вы можете добиться этого и многого другого, используя Меньше CSS.

И даже больше с Sass =) sass-lang.com

Andy Ford 21.01.2011 08:23

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