【发布时间】:2020-02-01 01:10:30
【问题描述】:
在 Stack Overflow 的 design system 中,我们使用 Less 来编译 CSS 颜色值。
我们有全局 Less 变量,例如 @orange-500,经常针对悬停状态、构建边框样式、背景颜色等进行修改。
在 Less 中,这写为 darken(@orange-500, 5%)。我正在尝试使用本机 CSS 变量来实现类似的功能。切换到 CSS 变量将使我们能够更快地交付依赖于主题(Stack Exchange Network、暗模式等)的功能,同时使用更少的 CSS 行,同时在媒体查询上启用交换变量(高对比度、暗模式等)。
这个在hsl 中覆盖我们颜色的亮度值的示例适用于将变量范围限定为 CSS 类的情况:
.card {
--orange: hsl(255, 72%, var(--lightness, 68%));
background: var(--orange);
}
.card:hover {
--lightness: 45%;
}
<div class="card">
Hello world
</div>
然而,我们需要在一个单一的、可交换的地方全局指定我们的颜色变量以支持全局主题化,但这并不像预期的那样工作:
:root {
--orange: hsl(255, 72%, var(--lightness, 68%));
}
.card {
background: var(--orange);
}
.card:hover {
--lightness: 45%;
}
<div class="card">
Hello world
</div>
我尝试从 :root 切换到 html 或 body 没有任何运气。有什么解决方法吗?
【问题讨论】:
-
一开始看起来很奇怪,但是当你真正开始理解它时,当一个东西悬停时,橙色在页面上变化是否有意义?
-
目的是在
.card:hover的上下文中获取全局橙色并通过x量修改其亮度。 -
是的,我明白了,我只是说一旦你意识到
:root中定义的--lightness是一个全局变量,而.card:hover中定义的--lightness是一个局部变量行为符合预期,因为--orange' references the global--lightness` 不是本地的--lightness -
简短回答:这是不可能的。如果在 :root 中使用了 var() 则结束,它已经针对所有 DOM 进行了评估
标签: css scope css-variables