将 css 变量导入主题的根选择器

Posted

技术标签:

【中文标题】将 css 变量导入主题的根选择器【英文标题】:Importing css variables into root selector for theme 【发布时间】:2021-09-29 16:18:33 【问题描述】:

我们有一个基于风格字典的主题引擎。引擎生成每个主题都有一个 :root 元素的 css 文件 - 例如:

:root 
  --color-100: #161616;
  --color-90: #1e1e1e;
// ...

每个主题在单独的文件中都有一组这些变量 - 所以“alpha”主题在一个单独的文件中,“beta”主题在一个单独的文件中,但每个文件结构都是相同的。

在生产版本中,开发人员只包含所需的 css 主题,但是,我们正在构建一个应该能够在所有这些主题之间切换的故事书实例。

我们计划在主题更改时简单地在 html 上设置一个数据属性:

addons.getChannel().on(CURRENT_THEME, theme => 
  document.documentElement.setAttribute('theme', theme);
);

这在 html 标记更改为以下内容的意义上是有效的:

<html lang="en" theme="alpha">

(其中主题名称为 alpha)。

在我们的样式中,我们的伪选择器是:

:root[theme='alpha'] 
 // not sure what to put in here

问题是如何将每个 css 文件包含到选择器中,以便我们将数据属性切换到新主题?

我们也用@import/@use 尝试了sass,但由于没有mixin,所以无法加载主题css。

我们也有 postcss 可用,但没有找到任何有用的插件。

【问题讨论】:

【参考方案1】:

不确定我是否正确地回答了您的问题,但是您也想切换应用程序的主题,例如它是否为“alpha”,假设它遵循红色和黑色主题,如果它的“beta”假设它遵循蓝色和黑色主题

所以根据我的说法,你可以在你的“alpha 主题”css 文件中提供

:root[theme='alpha'] 
  --color-100: #red;
  --color-90: #black;

在测试版中,您可以提供 -

:root[theme='beta'] 
      --color-100: #blue;
      --color-90: #black;
    

在您的一些主 css 文件中,该文件包含您的应用程序的元素选择器,您需要提供如下数据的类

p 
 color: var(--color-100);


button
color: var(--color-200);

.header 
color: var(--color-200);

我希望你能明白我想说的话。不要忘记导入所有的 CSS 模块。如果不是你想要的,请告诉我:)

【讨论】:

谢谢 - 但不幸的是没有。每个主题文件中都有:root ... ,而不是:root[theme='alpha']。我想通过将内容导入该选择器来在主css文件中编写:root[theme='alpha'] 所以你是说你有不同的主题 css 文件,你想要一个 css 文件?对于所有主题? 就像您拥有主题 alpha css、主题 beta css 并且您想拥有 alpha 和 beta 的单个主题文件?这就是你想要的 是的,我们有 alpha.theme.css / beta.theme.css 作为文件。在真实的产品中,永远不会有alphabeta 混合在一起(它们是完全分离的产品),所以主题文件只包含主题变量是有道理的,你不需要指定主题 - 只需包含您想要的 css 文件。对于文档,我们希望能够在每个主题之间切换 - 因此数据属性可以切换 css 并导入每个 css 文件。

以上是关于将 css 变量导入主题的根选择器的主要内容,如果未能解决你的问题,请参考以下文章

带有 React JS/Polymer 的主题 css 选择器

如何使用 CSS ::主题选择器

CSS3中结构伪类选择器——rootnotemptytarget选择器

根据选择器在 Sass 中设置变量

将变量作为 JQuery CSS 选择器传递不起作用

一些 Css 样式表选择器仅在我的响应式主题上对 Firefox 生效