我正在用electron设计一个应用程序,所以我可以访问CSS变量.我在vars.css中定义了一个 colored颜色 变量:

:root {
  --color: #f0f0f0;
}

我想在main.css中使用这种 colored颜色 ,但应用了一些不透明度:

#element {
  background: (somehow use var(--color) at some opacity);
}

我该怎么做呢?我没有使用任何预处理器,只有CSS.我更喜欢全CSS的答案,但我会接受JavaScript/jQuery.

我不能使用opacity,因为我使用的背景图像不应该是透明的.

推荐答案

不能采用现有 colored颜色 值并对其应用Alpha通道.也就是说,不能将现有的祸不单行值(如#f0f0f0%)赋予它一个Alpha分量,然后将结果值用于另一个属性.

但是,自定义属性允许您将祸不单行值转换为RGB三元组以便与rgba()一起使用,将该值存储在自定义属性中(包括逗号!),将使用var()的值替身转换为具有所需Alpha值的rgba()函数,这样就可以正常工作:

:root {
  /* #f0f0f0 in decimal RGB */
  --color: 240, 240, 240;
}

body {
  color: #000;
  background-color: #000;
}

#element {
  background-color: rgba(var(--color), 0.8);
}
<p id="element">If you can see this, your browser supports custom properties.</p>

这似乎太好了,简直令人难以置信.1它是如何工作的?

神奇之处在于,当替换属性值中的var()个引用(before)时,定制属性值被替换as is,该属性值被计算.这意味着,就自定义属性而言,示例中的值--color根本不是 colored颜色 值until出现在需要 colored颜色 值的某个位置(并且仅在该上下文中)的var(--color)表达式.从CSS-Variables规范的section 2.1%开始:

自定义属性允许的语法非常宽松.<;声明值&>产品匹配一个或多个内标识的任何序列,只要该序列不包含<;错误字符串-令牌&>,<;错误-url-令牌&>,不匹配<;)-令牌&>,<;]-令牌&>或<;}-令牌&>,或顶级<;分号-令牌&>

例如,以下是有效的自定义属性:

--foo: if(x > 5) this.width = 10;

虽然这个值作为变量显然没有用,因为它在任何普通属性中都是无效的,但是它可以由JavaScript读取和操作.

section 3:

如果一个属性包含一个或多个var()函数,且这些函数在语法上有效,则必须假定整个属性的语法在解析时有效.只有在替换了var()函数之后,才会在计算值时对其进行语法判断.

这意味着上面看到的240, 240, 240值被直接替换到rgba()函数before中,声明就是计算出来的.所以这就是:

#element {
  background-color: rgba(var(--color), 0.8);
}

它起初看起来不是有效的CSS,因为rgba()需要不少于四个逗号分隔的数值,它变成了这样:

#element {
  background-color: rgba(240, 240, 240, 0.8);
}

当然,这是完全有效的CSS.

更进一步,您可以将alpha组件存储在其自己的自定义属性中:

:root {
  --color: 240, 240, 240;
  --alpha: 0.8;
}

还有替身,结果是一样的:

#element {
  background-color: rgba(var(--color), var(--alpha));
}

这允许你有不同的alpha值,你可以随时交换.


1 Well, it is, if you're running the code snippet in a browser that doesn't support custom properties.

Css相关问答推荐

Css:有没有更快捷的方式来编写多媒体查询?

在NextJS/Reaction应用程序中显示更新问题

我的css是我的react 应用程序没有按预期工作

如果`line-Height:1`,则垂直字母所占的高度

为什么在RadixUi上应用Tailwincss和自定义css类不起作用?

如何缩小 Select 元素的背景图像?

CSS 内联 Flex 和段落换行

不明白为什么 div 不均匀并且不填满页面

Vuetify 抽屉标签溢出/z-index

使用 flexbox 使图像与内容高度相同

如何在悬停另一个部分的元素时使元素可见?

如何应用适当样式的元素加消息框?

Tailwind Box-shadow

JavaFX TreeTableView Css for unfocused selected line

具有自动调整大小的自动填充行的 CSS 网格

如何使单选按钮看起来像切换按钮

使用 float:left 后如何获得新行?

Angular 5 在某些类中添加了ng-star-inserted - 那是什么?

通过javascript删除或禁用浏览器的焦点边框

如何在 Visual Studio 2017+ 中编译 Less/Sass 文件