Статьи

Работа с цветовой схемой в Sass

Многие сайты имеют конкретную цветовую схему для каждого раздела. Даже тот самый сайт, который вы читаете, делает это — вы находитесь в синем разделе AKA CSS . Это умная тенденция дизайна для создания четких различий между различными частями одного и того же объекта.

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

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

Как работают цветовые схемы?

Прежде чем перейти к коду, мы должны спросить, как на самом деле работает цветовая схема в CSS ? Что ж, если вы не планируете использовать какой-либо JavaScript (что звучит для меня хорошей идеей), возможно, самый простой способ — создать класс тем в вашем HTML и CSS, чтобы каждый элемент, который нужно стилизовать в соответствии с тема становится ребенком этого класса .

SitePoint следует этому методу. Если вы посмотрите на основную оболочку с идентификатором #primary , то увидите, что у нее также есть класс .category-css . Это облегчает стилизацию темы.

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

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

 .theme-banana .element { color: yellow; } .theme-blueberry .element { color: purple; } .theme-cherry .element { color: red; } 

Я использовал свойство color но оно также может быть background , border-color или даже box-shadow . Без разницы! Даже положение фона для спрайта или пути к изображению, если это необходимо.

Это работает как шарм, но, как вы видите, это требует, чтобы мы печатали одно и то же 3 раза подряд. И если нам нужно добавить еще одну тему, мы должны повторить ее еще раз. Тогда, если нам нужно сделать другие вещи условными для темы, нам нужно повторять эти правила снова и снова … Должен быть более легкий путь!

Sass на помощь

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

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

 @mixin theme($name, $color) { .#{$name} { .element { color: $color; } } } 

А вот как вы бы это использовали:

 @include theme(theme-banana, yellow); @include theme(theme-blueberry, purple); @include theme(theme-cherry, red); 

Абракадабра! А вот как будет выглядеть CSS при компиляции ( см. Код здесь ):

 .theme-banana .element { color: yellow; } .theme-blueberry .element { color: purple; } .theme-cherry .element { color: red; } 

Ну, это выглядит аккуратно, не так ли? Не имея ничего, кроме небольшого миксина и включения для каждой темы, нам удалось создать весь наш CSS, похожий на магию. Поэтому, когда нам нужно сделать что-то тематическое , нам просто нужно обновить ядро ​​mixin, чтобы добавить все, что нужно.

Допустим, мы хотим, чтобы .other-element имел тематический цвет фона ( см. Код здесь ):

 @mixin theme($name, $color) { .#{$name} { .element { color: $color; } .other-element { background: $color; } } } 

Это так просто! Как видите, Sass значительно упрощает цветовую схему.

Несколько цветов на тему

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

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

Если вы хотите попробовать второй вариант, вот как может выглядеть ваш миксин ( см. Код здесь ):

 @mixin theme($name, $color) { $primary: $color; $secondary: lighten(adjust-hue($color, 20), 10%); .#{$name} { .element { color: $primary; } .other-element { background: $secondary; } } } 

Автоматизация миксиновых включений

Возможно, вы заметили, что у нас все еще есть некоторое повторение кода, когда мы включаем миксин для каждой темы. Мы должны повторить @include theme(/* ... */) , и это отстой. Это не очень СУХОЙ .

Что если бы у нас был какой-то объект конфигурации, который мы могли бы использовать для динамического создания всех тем? Это похоже на идеальный вариант использования карты ( доступно в Sass 3.3 ):

 $themes: ( theme-banana: yellow, theme-blueberry: purple, theme-cherry: red ) !default; 

Примечание: если вам нужно более одного аргумента, не стесняйтесь использовать список в качестве значения (например, (banana: yellow orange) ); это поддерживается.

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

 @each $theme, $color in $themes { @include theme($theme, $color); } 

( Посмотреть код )

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

Примечание: если вы используете Sass 3.2, вы можете использовать вложенные списки вместо карты. Это работает точно так же.

Заключительные слова

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

Например, у вас может быть ваша карта конфигурации в файле конфигурации ( _config.scss ) и экземпляры вашей темы в файле темы ( _themes.scss ). Довольно удобно.

Сообщите нам в комментариях, если у вас есть какие-либо собственные предложения по использованию Sass при работе с цветовыми схемами CSS. И просто для удовольствия, ниже вы найдете демонстрацию CodePen, которая включает эти идеи в переключатель тем, запускаемый JavaScript.