SASS - Генерация переменных с помощью цикла - PullRequest
0 голосов
/ 07 июня 2018

TL; DR

Можно ли использовать функции SASS для генерации переменных SASS?Я собираюсь взять небольшой набор цветов и обработать их множеством оттенков и оттенков этих цветов.

Проблема:

NB Я использую https://github.com/at-import/color-schemer для цветовых функций.

У меня есть следующие переменные:

$root-color:    hsl(10, 85%, 45%);

$red:        $root-color;
$vermilion:  ryb-adjust-hue($red, 30);
$orange:     ryb-adjust-hue($red, 60);
$amber:      ryb-adjust-hue($red, 90);
$yellow:     ryb-adjust-hue($red, 120);
$chartreuse: ryb-adjust-hue($red, 150);
$green:      ryb-adjust-hue($red, 180);
$teal:       ryb-adjust-hue($red, 210);
$blue:       ryb-adjust-hue($red, 240);
$violet:     ryb-adjust-hue($red, 270);
$purple:     ryb-adjust-hue($red, 300);
$magenta:    ryb-adjust-hue($red, 330);

Для каждого цвета я пытаюсь создать следующий вывод ($red показано ниже):

$red-10: $red;

$red-01: shade($red-10, 90);
$red-02: shade($red-10, 80);
$red-03: shade($red-10, 70);
$red-04: shade($red-10, 60);
$red-05: shade($red-10, 50);
$red-06: shade($red-10, 40);
$red-07: shade($red-10, 30);
$red-08: shade($red-10, 20);
$red-09: shade($red-10, 10);

$red-11: tint($red-10, 10);
$red-12: tint($red-10, 20);
$red-13: tint($red-10, 30);
$red-14: tint($red-10, 40);
$red-15: tint($red-10, 50);
$red-16: tint($red-10, 60);
$red-17: tint($red-10, 70);
$red-18: tint($red-10, 80);
$red-19: tint($red-10, 90);

Я могу свести это к следующему:

Для каждого $color:

  • $red-10: $red;
  • Для 1 - 9 ($1): Создать переменную $#{$color}-0$1: shade($red-10, (100 - ($1 * 10)))

  • Для 1 - 9 ($1): Создать переменную $#{$color}-($1 * 10): tint($red-10, ($1 * 10))

Очевидно, я получаю сообщение об ошибке:

Error: Invalid CSS after "...m 1 through 9 {": expected 1 selector or at-rule, was "#{$color}-$1: shade"

Я изучил использование списков и @append, но, поскольку у меня есть x цветов, я думаю, мне придется создатьдинамические списки?Это вообще возможно?

Я знаю, что я использую переменную для создания переменной ($#{$color}) и пытаюсь вывести функцию внутри циклов, и я не уверен, что это дажевозможно с SASS.

Если нет, есть ли лучший рабочий процесс для такого рода вещей?

1 Ответ

0 голосов
/ 07 июня 2018

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

Примечание я изменил цветовые функции и значения только для целей тестирования (изменил shade на lighten и tint на darken; также в цикле tint я добавил - 100 кзначение, чтобы сохранить значение затемнения между 1 и 100).Вы должны заменить эти функции вашими.

// Colors to use
$colors:(
    red:  red,
    blue: blue
);

// Generated color lists
$generated: ();

// For each defined color
@each $name, $color in $colors {

    // Current color map
    $current : ();

    // Generates the colors transformations (shades)
    @for $i from 1 through 9 {
        $current: append($current, lighten($color, (100 - ($i * 10))));
    }

    // Adds the current color
    $current: append($current, $color);

    // Generates the colors transformations (tints)
    @for $i from 11 through 19 {
        $current: append($current, darken($color, ($i * 10) - 100));
    }

    // If the map has not been created
    @if map-has-key($generated, $name) == false {
        $generated: map-merge($generated, ($color : $current));
    }

}

// Create a function to get the desired color
@function get-color($color, $index: 10) { // Default to base color

    // Get the desired color map
    $list: map-get($generated, $color);

    // Return the color index
    @return nth($list, $index);

}

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

.foo {
    color: get-color(blue, 5);
}

Вы можете проверить рабочий пример здесь .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...