Я определил цвет в своем корне:
:root {
--purple: hsl(266, 35%, 70%);
}
И я пытаюсь использовать его в функции SASS, чтобы придать ему прозрачность:
.purple {
background: transparentize(#{"var(--primary-color)"}, 0.7)
}
Кто-нибудь знает, как заставить это работать? Или это просто невозможно?
Хорошая ссылка! OP: невозможно в общем случае, потому что переменные CSS являются динамическими: их значения вычисляются каждый раз, когда они используются. Sass никак не может знать наверняка, какое значение они могут иметь во время компиляции. У переменных Sass есть значения, известные во время компиляции. Если вы определяете константы в Sass и используете их для определения переменных CSS в: root, а не играете с последними в дочернем узле, то вы можете использовать их в обоих.






Глобальные переменные могут быть определены вне элемента в псевдоклассе: root:
:root {
--color-background: #FFFFFF;
}
вы можете определить такую функцию:
@function color($color-name) {
@return var(--color-#{$color-name});
}
и назовите это своим нахальством:
body {
color: color(primary);
}
скомпилированный код sass:
body {
color: var(--color-primary);
}
Это должен быть принятый ответ, особенно если были добавлены ссылки на документацию или другие источники.
@orionrush нет, это не так. transparentize() ожидает шестнадцатеричный код. эта функция выводит недопустимую строку var().
это не отвечает на исходный вопрос
Это не работает с функцией, которая должна иметь допустимый цвет, поэтому это не может быть частью аргумента lighten.
Моим решением было преобразовать цвет HEX-кода в HSL. Сначала я создал функцию PHP.
function hexToHsl($hex) {
$hex = str_split(ltrim($hex, '#'), 2);
// convert the rgb values to the range 0-1
$rgb = array_map(function($part) {
return hexdec($part) / 255;
}, $hex);
// find the minimum and maximum values of r, g and b
$min = min($rgb);
$max = max($rgb);
// calculate the luminace value by adding the max and min values and divide by 2
$l = ($min + $max) / 2;
if ($max === $min) {
$h = $s = 0;
} else {
if ($l < 0.5) {
$s = ($max - $min) / ($max + $min);
} elseif ($l > 0.5) {
$s = ($max - $min) / (2 - $max - $min);
}
if ($max === $rgb[0]) {
$h = ($rgb[1]- $rgb[2]) / ($max -$min);
} elseif ($max === $rgb[1]) {
$h = 2 + ($rgb[2]- $rgb[0]) / ($max -$min);
} elseif ($max === $rgb[2]) {
$h = 4 + ($rgb[0]- $rgb[1]) / ($max -$min);
}
$h = $h * 60;
if ($h < 0) {
$h = $h + 360;
}
}
return array($h, $s*100, $l*100);
}
он получит шестнадцатеричный код цвета por example # cc66cc и вернет массив из 3 значений для H, S и L.
$color_main_hsl = hexToHsl($color_main);
$color_main_h = $color_main_hsl[0];
$color_main_s = $color_main_hsl[1] . '%';
$color_main_l = $color_main_hsl[2] . '%';
А затем присвоить переменной CSS.
<style>
:root {
--color_1: <?php echo $color_main; ?>;
--color_1_h: <?php echo $color_main_h; ?>;
--color_1_s: <?php echo $color_main_s; ?>;
--color_1_l: <?php echo $color_main_l; ?>;
}
</style>
Затем я создаю две функции в SASSS, одну для затемнения и другую для осветления:
// hsl css variable darken
@function hsl_d($color_num, $percentage) {
$color_h: var(--color_#{$color_num}_h);
$color_s: var(--color_#{$color_num}_s);
$color_l: var(--color_#{$color_num}_l);
@return hsl($color_h, $color_s, calc(#{$color_l} - #{$percentage}#{'%'}));
}
// hsl css variable lighten
@function hsl_l($color_num, $percentage) {
$color_h: var(--color_#{$color_num}_h);
$color_s: var(--color_#{$color_num}_s);
$color_l: var(--color_#{$color_num}_l);
@return hsl($color_h, $color_s, calc(#{$color_l} + #{$percentage}#{'%'}));
}
И, наконец, я использую свою функцию sass:
.element-to-dark {
background-color: hsl_d(1, 12);
}
.element-to-light {
background-color: hsl_d(1, 22);
}
Число «1» связано с тем, что мои переменные ara называются --color_1, --color_1_h, --color_1_s, --color_1_l, и моя функция интерполирует это число. Второй параметр - это процентное соотношение светлого или затемненного.
Надеюсь, я внес свой вклад :)
Прочтите: codepen.io/jakealbaugh/post/css4-variables-and-sass