使用 SCSS 生成默认值和 CSS 变量

use SCSS to generate both defaults and css variables

提问人:Plagiatus 提问时间:1/17/2023 最后编辑:Plagiatus 更新时间:1/17/2023 访问量:86

问:

我正在实现一种网站风格。
出于遗留支持的原因,我需要支持 IE11,至少在一段时间内是这样。出于工作流程和我的理智原因,我想尽可能使用 css 变量。
我已经研究了这个解决方案,它会生成一些有效的东西,但使用起来非常冗长。

我的目标是最终得到一个硬编码的值,该值立即被 CSS 变量覆盖。这样,我就可以为每个人添加一个默认主题,并为那些支持 css 变量的浏览器添加不同的主题(如 darkmode)。显然不需要自己写所有这些。

所以我的想法是我可以写这样的东西:

$foo {...?}

:root {
  --foo: red;
}

:root.dark {
  --foo: black;
}

p {
  color: $foo;
}

它被转译为

:root {
  --foo: red;
}

:root.dark {
  --foo: black;
}

p {
  color: red;
  color: var(--foo);
}

scss 可能吗?我不想在这个项目中添加一些随机的npm模块或其他第三方编译器和转译器来膨胀它。

我知道为 IE11 添加一个 polyfill 的可能性,它增加了对 CSS 变量的支持,但到目前为止,我发现的大多数都有某种形式的不幸限制(另外,它们是第三方代码,如果可以的话,我宁愿避免)。如果没有使用 SCSS 的好解决方案,那可能是我会选择的。

css internet-explorer sass css变量

评论

0赞 Pete 1/17/2023
微软停止支持IE11,那么为什么你需要支持它将是主要问题?blogs.windows.com/windowsexperience/2022/06/15/......
0赞 Plagiatus 1/17/2023
不幸的是,@Pete遗留原因。我们的一些客户仍在使用它,我们的一些接口程序仍在内部使用它。我们正在逐步淘汰所有系统(并说服客户),但不幸的是,这是一项艰巨的任务,仍在进行中。

答:

1赞 Amaury Hanser 1/17/2023 #1

以下是您可能想要改进的快速解决方案:

  1. 定义包含所有颜色的地图:
$colors: ("blue": #0000ff, "red": #ff0000, "green": #00ff00);
  1. 遍历地图以创建 css 自定义属性:
@each $color, $value in $colors {
    :root {
        --#{$color}: #{$value};
    }
}
  1. 创建一个 mixin 以输出回退和值。
    我决定创建一个 mixin,它需要 2 个参数、css 属性和您想要的颜色。
@mixin propertyPlusColorValue($property, $color) {
    #{$property}: map.get($colors, $color);
    #{$property}: var(--#{$color});
}
  1. 然后你可以像这样使用它:
.foobar {
    @include propertyPlusColorValue(color, "blue");
    @include propertyPlusColorValue(background-color, "red")
}

完整代码:

@use "sass:map";

$colors: ("blue": #0000ff, "red": #ff0000, "green": #00ff00);

@each $color, $value in $colors {
    :root {
        --#{$color}: #{$value};
    }
}

@mixin propertyPlusColorValue($property, $color) {
    #{$property}: map.get($colors, $color);
    #{$property}: var(--#{$color});
}

.foobar {
    @include propertyPlusColorValue(color, "blue");
    @include propertyPlusColorValue(background-color, "red")
}