Для всех, кто сталкивается с этим вопросом, вот как я в итоге решил свою проблему.
Вместо того, чтобы полагаться на атрибуты data-
, я просто использовал имена классов.Например, всякий раз, когда мне нужен элемент с определенным цветом фона, я использую имя класса, например .bg-amber
или .bg-purple
.Мои цвета определены так:
$colors: (
'black': #000000,
'white': #FFFFFF,
// ...
'amber': #FFBF00,
'purple': #800080,
// ...
);
Чтобы облегчить доступ к цвету, я определил функцию, которая вызывает любой цвет по имени:
@function c($key: 'black') {
@return map-get($colors, $key);
}
Затем я определяюmixin, который, учитывая название цвета, будет применять его в качестве цвета фона.Я также могу передать ему префикс, который используется в атрибуте CSS.
@mixin bg($color-name, $prefix: '') {
.#{$prefix}#{$color-name} {
background-color: c($color-name);
}
}
Если бы я хотел использовать его в одноразовой ситуации, я бы использовал его так:
@include bg('amber', 'bg-');
... что приведет к следующему:
.bg-amber {
background-color: #FFBF00;
}
Наконец, я использую цикл @each
, чтобы сделать это для всех моих цветов:
@each $color-name, $color-val in $colors {
@include bg($color-name, 'bg-');
}
Я также могу определить версию «переднего плана»:
@mixin fg($color-name, $prefix: '') {
.#{$prefix}#{$color-name} {
color: c($color-name);
}
}
И затем я могу использовать ее в цикле @each
прямо под bg()
использованием:
@each $color-name, $color-val in $colors {
@include bg($color-name, 'bg-');
@include fg($color-name, 'txt-');
}
Этотакже может быть расширен для таких вещей, как цвета рамок, тени ящиков и т. д.