我有一个现有的项目,其中包含一个使用语义变量的scss文件:
$background-color: white;
body {
background-color: $background-color;
}
字符串
当我向主体添加主题类时,我想将背景更改为黑色:
<body class="theme-dark">...</body>
型
如果我移除类(或切换到主题灯),则返回白色。
我还没有在scss中找到任何轻量级的方法来实现这一点(为每个主题参数化一个类似乎是一种很难维护的方法)。
我发现了一个混合的scss/css自定义属性解决方案:
原文:
.theme-light {
--background-color: white;
}
型
更新(基于Amar的回答):
:root {
--background-color: white;
}
.theme-dark {
--background-color: black;
}
$background-color: var(--background-color);
body {
background-color: $background-color;
}
型
将scss变量定义为具有css-variable扩展作为值,即(从上面开始):
$background-color: var(--background-color);
型
生成以下CSS:
:root { --background-color: white; }
.theme-dark { --background-color: black; }
body { background-color: var(--background-color); }
型
这似乎是我们想要的
我喜欢它,因为它只需要改变$background-color
的定义(不是在一个非常大的scss文件中的每一个用法),但我不确定这是否是一个合理的解决方案?我对scss很陌生,所以也许我错过了一些功能。
3条答案
按热度按时间y53ybaqx1#
使用SCSS可以做到这一点,但你必须为所有想要主题化的元素添加样式。这是因为SCSS是在构建时编译的,你不能用类切换变量。一个例子是:
字符串
目前最好的方法是使用CSS变量。你可以像这样定义默认变量:
型
然后,你可以像这样在元素中使用这些变量:
型
如果
body
元素有theme-dark
类,它将使用为该类定义的变量。否则,它将使用默认的根变量。0md85ypi2#
所有的功劳都要归功于德米特里·博罗迪
我推荐一种类似于this Medium article中提到的方法。使用这种方法,您可以指定需要主题化的类,而无需特别提及主题名称,因此可以同时应用多个主题。
首先,你建立一个包含你的主题的SASSMap。键可以是任何对你有意义的东西,只要确保每个主题都使用相同的名字来做同样的事情。
字符串
然后使用
mixin
和function
对添加主题支持。型
如果你要添加很多主题或者一个主题会涉及很多东西,您可能希望设置您的SCSS文件有点不同,以便所有的主题不会膨胀您的主CSS文件(就像上面的例子一样)。一种方法是创建一个
themes.scss
文件,复制需要主题化的任何选择器路径,并使用第二个构建脚本,themes.scss
文件。Mixin酒店
型
函数
型
pgpifvop3#
添加class=“theme-light”到任何根标签。例如,这里我们将切换当前主题,将class从“theme-light”替换为“theme-dark”。
字符串
当然,“light”和“dark”你可以用你的主题名称替换。
现在我们需要添加两个scss文件。首先,
themes.scss
型
其次,
themed-style.scss
型
最后,使用它
型