Использование переменных CSS как аргументов функции Sass
Есть ли способ использовать переменные CSS с функциями Sass, например, lighten? Что-то вроде этого:
:root {
--color: #ff00ff;
}
.div {
background-color: lighten(var(--color), 32%);
}
Я получаю сообщение об ошибке, что " $color
аргумента Argument $color
lighten($color, $amount)
должен быть цветом".
Я использую переменные CSS (не Sass), потому что мне нужно использовать их в js.
Ответы
Ответ 1
ОБНОВИТЬ:
Я просто прочитал, что Sass 3.5.0 теперь должен поддерживать пользовательские свойства CSS с помощью собственных функций CSS. Я пробовал это с помощью node-sass, но пока libsass не поддерживает эту функцию Ruby Sass 3.5
Для собственных CSS-функций я думаю, что sass заменяет их своей собственной реализацией, поскольку мне пришлось использовать строчную интерполяцию в Sass для компиляции моего css:
--Primary: #{"hsl(var(--Ph), var(--Ps), var(--Pl))"};
Для функций Sass самая близкая вещь, которую я придумал с помощью чистого CSS для легкости (не будет работать с IE, очевидно), заключается в том, чтобы отделить значения цвета от оттенка, насыщенности и легкости для использования внутри hsl(). Это также можно использовать с rgba(), но hsl() можно использовать для более легкого управления оттенками для темы приложения:
:root {
--P-h: 203;
--P-s: 82%;
--P-l: 41%;
--Primary: hsl(var(--P-h), var(--P-s), var(--P-l));
}
Затем тени для активных, зависающих, акцентов и т.д. Могут использовать измененную легкость, используя calc для вычисления процента первоначальной легкости:
:root {
--Primary-20: hsl(var(--P-h), var(--P-s), calc(var(--P-l) * 0.8));
}
Это может пойти другим способом облегчить также, но это не будет работать для каждого сценария. Это также довольно грязно, и вы в конечном итоге с небольшим количеством загрязнения в переменной области.
Ответ 2
Вы можете использовать CSS Colorvars (csscolorvars.github.io), и вы получите функцию яркости и прозрачности, чтобы иметь возможность применять яркость, темноту и прозрачность в вашей переменной цвета.
:root {
--primary-color: #ff0c22;
--primary-HS: 355, 100%;
--primary-HSL: 355, 100%, 52%;
--secondary-color: #663399;
--secondary-HS: 270, 50%;
--secondary-HSL: 270, 50%, 40%;
}
.block{
background-color: hsl(var(--primary-HS), 60%);
/*
Is equivalent to what is desired:
background: lighten(var(--primary-color), 8%)
*/
}
Ссылка CSS Colorvars: https://csscolorvars.github.io/
Любые проблемы комментируйте в: https://github.com/CSSColorVars/csscolorvars/issues
Ответ 3
Переменные CSS не поддерживаются в IE.
Кроме того, lighten
является функцией предварительных процессоров CSS, поэтому, если вы добавите его в CSS в своей не скомпилированной форме, он просто сломает ваш код, поскольку CSS не будет знать, что это такое
Я предлагаю pseudo-elements
См. Этот пример
div>div {
height: 150px;
width: 150px;
margin: .5em auto;
display: inline-block;
}
.red {
background-color: red
}
.blue {
background-color: blue
}
.green {
background-color: green
}
.lighten,
.darken {
position: relative;
}
.lighten::after,
.darken:after {
content: "";
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.lighten::after {
background-color: rgba(255, 255, 255, .4);
}
.darken::after {
background-color: rgba(0, 0, 0, .4);
}
<div>
<div class="red lighten"></div>
<div class="red"></div>
<div class="red darken"></div>
</div>
<div>
<div class="blue lighten"></div>
<div class="blue"></div>
<div class="blue darken"></div>
</div>
<div>
<div class="green lighten"></div>
<div class="green"></div>
<div class="green darken"></div>
</div>