Автоматически сгенерированные sass карты
Я пытаюсь создать автоматизированную систему для определения цветов в SASS.
У меня есть карта цветов с именем $brand-colors, и я хотел бы, чтобы цвета этой карты использовались для создания оттенков и оттенков на второй карте, независимо от того, сколько цветов в $ brand-colors.
Это точка, где я прибыл:
$brand-colors: (
brand-color: (
primary-color: #0096d6,
secondary-color: #1a4760,
),
) !default;
@function generate-map($map) {
@each $item, $colors in $map {
@each $color-name, $value in $colors {
@return(
$color-name: (
light-30: mix(white, $value, 30%),
light-20: mix(white, $value, 20%),
light-10: mix(white, $value, 10%),
base: $value,
dark-10: mix(black, $value, 10%),
dark-20: mix(black, $value, 20%),
dark-30: mix(black, $value, 30%),
),
);
};
};
};
$brand-palette: (
brand-palette:(
generate-map($_new-brand-colors)
),
) !default;
С помощью приведенного выше кода я получаю этот результат из терминала:
brand-palette:(
primary-color:(
light-30: #4db6e2,
light-20: #33abde,
light-10: #1aa1da,
base: #0096d6,
dark-10: #0087c1,
dark-20: #0078ab,
dark-30: #006996
)
)
Короче говоря, берется только первая пара ключ-значение, и я не могу понять, почему. Может кто-нибудь дать мне ответ?
1 ответ
Функции и операторы возврата
@return
оператор сообщает функции, чтобы остановить все и вернуть значение.
@function myFunction() {
@each $item in [a, b, c, d] {
@return $item;
}
}
myFunction()
вернется только a
, Несмотря на то, что у нас есть цикл с четырьмя элементами, он будет запущен только один раз (в первый раз), потому что он сразу попадет в @return
заявление.
Лучшая практика, чтобы вернуться один раз в конце функции
Один из лучших методов работы с функциями - это иметь $result
переменная, и только вызов @return $result
один раз в конце функции
@function myFunctionFixed() {
$result;
@each $item in [a, b, c, d] {
$result: $result + a;
}
@return $result;
}
myFunctionFixed()
вернусь abcd
потому что мы позволяем циклу выполняться от начала до конца, не прерывая его @return
и мы возвращаемся только в конце функции после завершения цикла.
С помощью map-merge
постепенно строить карту
Применяя лучшие методы, описанные выше, мы можем переместить @return
заявление до конца вашей функции и использования map-merge
постепенно построить $result-map
переменная.
@function generate-map($map) {
$result-map: () !default;
@each $item, $colors in $map {
@each $color-name, $value in $colors {
$result-map: map-merge($result-map,
($color-name: (
light-30: mix(white, $value, 30%),
light-20: mix(white, $value, 20%),
light-10: mix(white, $value, 10%),
base: $value,
dark-10: mix(black, $value, 10%),
dark-20: mix(black, $value, 20%),
dark-30: mix(black, $value, 30%),
))
);
};
};
@return $result-map;
};