Любой способ использовать переменные CSS в функциях SASS?

Я определил цвет в своем корне:

:root {
--purple: hsl(266, 35%, 70%);
}

И я пытаюсь использовать его в функции SASS, чтобы придать ему прозрачность:

.purple {
  background: transparentize(#{"var(--primary-color)"}, 0.7)
}

Кто-нибудь знает, как заставить это работать? Или это просто невозможно?

Прочтите: codepen.io/jakealbaugh/post/css4-variables-and-sass

Aravind S 17.08.2018 06:40

Хорошая ссылка! OP: невозможно в общем случае, потому что переменные CSS являются динамическими: их значения вычисляются каждый раз, когда они используются. Sass никак не может знать наверняка, какое значение они могут иметь во время компиляции. У переменных Sass есть значения, известные во время компиляции. Если вы определяете константы в Sass и используете их для определения переменных CSS в: root, а не играете с последними в дочернем узле, то вы можете использовать их в обоих.

FelipeAls 17.08.2018 15:55
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
19
2
18 079
2

Ответы 2

Глобальные переменные могут быть определены вне элемента в псевдоклассе: 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 22.01.2019 12:44

@orionrush нет, это не так. transparentize() ожидает шестнадцатеричный код. эта функция выводит недопустимую строку var().

RZKY 01.12.2019 04:53

это не отвечает на исходный вопрос

eballeste 23.03.2021 00:15

Это не работает с функцией, которая должна иметь допустимый цвет, поэтому это не может быть частью аргумента lighten.

Rommel Manalo 10.04.2021 18:22

Моим решением было преобразовать цвет 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, и моя функция интерполирует это число. Второй параметр - это процентное соотношение светлого или затемненного.

Надеюсь, я внес свой вклад :)

Другие вопросы по теме