Я использую Angular5 с sass v1.3.2.
Я хочу иметь возможность изменять цвет, который широко используется в файлах scss моего одностраничного приложения во время выполнения (не путем компиляции новых файлов).
В моем _variables.css цвет определяется глобально как:
$brand: #123123;
И, например, используется как:
h1 {
color: $brand;
}
Я узнал, что могу изменить цвет, если использую переменные CSS, такие как:
# CSS
:root {
--brand: #123123
}
#JS
document.documentElement.style.setProperty('--brand', '#456456');
# OR
document.querySelector(':root').style.setProperty('--brand', '#456456');
Однако, чтобы сделать это с помощью SCSS, мне нужно было использовать миксин css-vars как таковой:
$brand: #123123;
:root {
@include css-vars((
--brand: #{$brand},
));
}
И используйте его как:
h1 {
color: var(--brand);
}
Две проблемы:
--brand все еще не отображается в корневом каталоге.Кроме того, CSS, сгенерированный в <script type = "text/css"> с помощью angular-cli, нигде не содержит --brand, он фактически компилирует переменную CSS в #123123, поэтому вывод будет:
h1 { цвет: # 123123; }
Есть идеи о том, как я могу добиться изменения глобального цвета во время выполнения? Или как получить мой CSS в :root, а затем как заставить SASS не компилировать его?
ОБНОВИТЬ
Как показал @JonUleis, нет необходимости использовать css-var. Теперь переменная --brand отображается в DOM по адресу :root.
Однако теперь строка color: var(--brand); по-прежнему не отображается в CSS, а h1 вообще не имеет цветового стиля.
После обновления node-sass до последней версии 4.9.0 с 4.8.3 он отлично заработал.
«Однако, чтобы сделать это с помощью SCSS, мне нужно было использовать миксин css-vars как таковой» - вот где вы меня теряете. Зачем нужно использовать css-vars?
@jhpratt Я ожидаю, что $brand в :root будет скомпилирован, но я не ожидаю, что выходной css покажет h1 { color: #123123 }, а на самом деле покажет h1 { color: var(--brand); }, но проблема в том, что кажется, что SASS компилирует var(--brand) в #123123, как если бы это SASS var .
@JonUleis, поскольку вы не можете записать --brand: #123123; в файл SCSS, он недействителен.
@zed Похоже, вы используете устаревшую версию Sass. Прекрасно работает при экспериментировании с SassMesiter.
@JonUleis Я только что пробовал в SassMeister: --brand: #123123;, вывод: Invalid CSS after "--brand: #123123": expected "{", was ";"
Могу ли я узнать, почему этот вопрос был отклонен, хотя он полностью соответствует руководящим принципам? Предоставление всех этапов, версий, вопросов и выводов?
@zed Вот что я вижу: i.imgur.com/8ZXmhzE.png
@JonUleis обновлен
@JonUleis не стесняйтесь писать свой ответ, чтобы я мог принять его как правильный ответ.
@zed Готово - спасибо!






Если вы все еще используете
$brand, а неvar(--brand)в значениях свойств, почему бы его не скомпилировать?