有没有办法在SCSS中有条件地替换全局变量?

Kev*_*ost 4 css sass media-queries

我最近发现了“prefers-color-scheme”媒体查询,并发现大多数常见浏览器的新版本与其兼容。

我想编写一些 SCSS 代码,生成全局变量以根据“首选颜色方案”导出值,以避免重复“主题类”。

$schemeColor: #eeeeee !default;
$reverseColor: #333333 !default;
$textColor: #000000 !default;


@media (prefers-color-scheme: dark){
  $schemeColor: #333333 !global;
  $reverseColor: #eeeeee !global;
  $textColor: #FFFFFF !global;
}
@media (prefers-color-scheme: light) {
    $schemeColor: #eeeeee !global;
    $reverseColor: #333333 !global;
    $textColor: #000000 !global;
}

Run Code Online (Sandbox Code Playgroud)

当我在这段代码之后使用其中一个变量时,无论首选颜色方案是什么,存储在变量中的值将是最后写入的值

(此处:在 中设置的值@media (prefers-color-scheme: light))。

我尝试在媒体查询中创建类。
当我这样做时,媒体查询中声明的类会根据颜色方案正确应用,但变量会继续存储它们设置的最后一个值。

Ped*_*edo 8

据我所知,这不能通过简单的事实来完成,SCSS 是一个预处理器,因此,您在 SCSS 中生成的代码将被转换为 CSS,并且您使用的所有变量都将在值中进行转换。

如果你想要变量并按规则更改它们,你应该使用 CSS 变量,如下所示:

:root {
  --main-bg-color: coral; 
}

 @media (prefers-color-scheme: dark){
 :root {
  --main-bg-color: red; 
}
}

.element{
  background-color: var(--main-bg-color);
}
Run Code Online (Sandbox Code Playgroud)

  • 使用 SCSS 执行我想要的操作的正确方法是使用包含媒体查询且可导出的“@mixin”。由于媒体查询的结果被缓存,因此大量媒体查询不会导致性能问题。[此页面](https://css-tricks.com/conditional-media-query-mixins/)启发我找到了这个解决方案 (3认同)