【问题标题】:Is there a way to reproduce currentColor with var(--current-color)?有没有办法用 var(--current-color) 重现 currentColor?
【发布时间】:2016-07-15 11:41:04
【问题描述】:

我不经常使用currentColor,但当我使用时,它非常有用。

所以我对 CSS 变量的到来有点兴奋。

我们来看看红绿灯吧。

注意请相信我,日本红绿灯会从红色变为琥珀色到蓝色。我知道这很难相信。 我知道蓝光看起来有点像绿色。但它不是,它是蓝色的。

div {
float: left;
width: 200px;
}

div div {
float: none;
}

.top {
color: rgb(255,0,0);
}

.middle {
color: rgb(255,227,0);
}

.bottom {
color: rgb(63,255,63);
}

.jp .bottom {
color: rgb(0,255,191);
}

.light {
text-align: center;
}

.light::before {
content: '';
display: block;
margin: 6px auto 0;
width: 25px;
height: 25px;
border-radius: 15px;
background-color: currentColor;
}
<div class="uk">
<h2>UK Traffic Lights</h2>
<div class="top light">Red</div>
<div class="middle light">Amber</div>
<div class="bottom light">Green</div>
</div>

<div class="jp">
<h2>JP Traffic Lights</h2>
<div class="top light">Red</div>
<div class="middle light">Amber</div>
<div class="bottom light">Blue</div>
</div>

现在,关于

的聪明之处
background-color: currentColor;

它只是读取color 的当前值并使用它。

相比之下……

background-color: var(--current-color);

那不能引用另一个样式声明的当前值,可以吗?

所以,你需要设置 4 个变量(就像你需要在上面的样式中声明 color: 4 次):

.top {
--color-top: rgb(255,0,0);
}

.middle {
--color-middle: rgb(255,227,0);
}

.bottom {
--color-bottom: rgb(63,255,63);
}

.jp .bottom {
--color-bottom-jp: rgb(0,255,191);
}

然后然后...您需要稍后引用每个不同的变量。这意味着每个变量都有不同的background-color 声明:

.top::before {
color: var(--color-top);
background-color: var(--color-top);
}

.middle::before {
color: var(--color-middle);
background-color: var(--color-middle);
}

.bottom::before {
color: var(--color-bottom);
background-color: var(--color-bottom);
}

.jp .bottom::before {
color: var(--color-bottom-jp);
background-color: var(--color-bottom-jp);
}

真的吗?!

这不可能。我错过了什么吗?

有没有办法用var(--current-color)重现currentColor

有没有办法让 CSS 变量代表另一个样式声明的当前值?

【问题讨论】:

  • 问题是custom properties 不是真正的变量,分配的值不会像其他语言中发生的任何其他条件而改变。

标签: css css-variables


【解决方案1】:

其实你可以设置一个CSS自定义属性,而不是直接设置color属性,将其用于colorbackground-color

/* Set global variable inside the :root scop */
:root {
  --color-top: rgb(255,0,0);
}

div {
  float: left;
  width: 200px;
}

div div {
  float: none;
}

/* Set the local --color variable, according to your need */
.top {
  --color: var(--color-top);
}

.middle {
  --color: rgb(255,227,0);
}

.bottom {
  --color: rgb(63,255,63);
}

.jp .bottom {
 --color: rgb(0,255,191);
}

.light {
  color: var(--color);
  text-align: center;
}

.light::before {
  content: '';
  display: block;
  margin: 6px auto 0;
  width: 45px;
  height: 45px;
  border-radius: 15px;
  background-color: var(--color);
}
<div class="uk">
<h2>UK Traffic Lights</h2>
<div class="top light">Red</div>
<div class="middle light">Amber</div>
<div class="bottom light">Green</div>
</div>

<div class="jp">
<h2>JP Traffic Lights</h2>
<div class="top light">Red</div>
<div class="middle light">Amber</div>
<div class="bottom light">Blue</div>
</div>

我真的不明白您为什么不使用background-color: currentColor,因为它在您自己的示例中运行良好。

【讨论】:

  • 知道了!谢谢@tzi - 我明白我错过了什么。命名的 CSS 自定义属性可以保存 不同上下文中的不同值,而无需重写它在其他上下文中保存的值。因此,与其为每个上下文(.top.middle 等)创建单独的自定义属性(--color-top--color-middle 等),我只需要说明自定义属性--color 在每个特定的上下文。
【解决方案2】:

如果您使用的是 SASS(编译成 css),那么您可以使用 SASS 变量。代码如下所示:

$font-stack:    Helvetica;
$primary-color: #333;

body {
  font: 100% $font-stack;
  color: $primary-color;
}

更多信息请关注SASS official website

【讨论】:

  • 这是同一个问题,不是吗? SASS 中的 $primary-color: #333;color: $primary-color; 和 CSS 中的 --primary-color: #333;color: var(--primary-color); 有什么区别?我认为它们是一样的,不是吗?
  • 不,因为 SASS 会将其编译成没有颜色变量的 CSS。它会为你做所有的工作,但最终它仍然是 CSS 而没有 var。
  • @Rounin 你是对的。在 CSS 天真地支持它之前,CSS 预处理器有变量。 \Relisora 请检查caniuse.com/#feat=css-variables - 你的答案不准确。
  • 我对 CSS 不了解,它看起来很新,只适用于 63% 的用户端。看起来仍然是一个非常有用的工具,谢谢你把它带给我
猜你喜欢
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2015-11-09
  • 2019-02-25
  • 2021-08-22
  • 2017-08-19
  • 2020-08-22
  • 2014-11-16
相关资源
最近更新 更多