我使用混色来获取按钮的背景色(通过自定义属性设置),并使其在悬停时变得更亮.我本以为不支持混色的浏览器会忽略悬停状态,使用非悬停背景色,但按钮在悬停时变成了透明.我在悬停状态样式中添加了明确的后备背景色,但这没有任何效果:

.button {
  background: var(--buttonColor);
  &:hover, &:focus {
    background-color: var(--buttonColor);
    background-color: color-mix(in srgb, var(--buttonColor) 80%, white);
  }
}

在try 了多种变种之后,问题似乎是在COLOR-MIX()中使用自定义属性会让不支持COLOR-MIX()的浏览器认为它们支持COLOR-MIX(),而他们解释它的失败try 会导致背景 colored颜色 变得透明(通过查看在开发工具中使用/丢弃了哪些规则来发现).正因为如此,我的后备在需要它的浏览器中被忽略了.

另外,同样的问题也发生在边框 colored颜色 上,尽管这是默认为白色而不是透明的.

在写下大部分内容后,我意识到我可以通过在@supports (background-color: color-mix(in srgb, black 50%, white))内包装我的混色来解决这个问题,但我还是决定把它贴出来,希望能:

  1. 它帮助了其他正在与同样的事情作斗争的人,而且
  2. 有人可以解释一下为什么会发生这种情况,这样我就能在future 了解根本问题

推荐答案

这不是关于color-mix(),而是使用了css变量.

任何包含var()的属性都被视为有效,即使它包含不受支持的功能

如果属性包含一个或多个var()函数,并且这些函数在语法上有效,则在分析时为the entire property’s grammar must be assumed to be valid.只有在替换了var()函数之后,才会在计算值时判断它的语法.ref

在您的情况下,属性将在计算值时间失败,并回退到初始(透明背景)

如上所述,如果声明包含的var()引用了具有保证无效的值的自定义属性,或者声明使用了有效的自定义属性,但在替换其var()函数后属性值无效,则声明在计算值时可能是无效的.发生这种情况时,根据属性的类型,计算值为以下值之一:

...

属性的继承值或其初始值分别取决于属性是否继承,就像属性的值已指定为unset关键字一样.ref

Css相关问答推荐

使用高图的背景大小渐变

如何使用混合混合模式更改动画背景上的文本 colored颜色

将鼠标悬停在具有效果的元素上

使用 CSS 关键帧动画更改内容

当前的 html 标签没有发生两列布局

CSS 字符串变量的正确null值是多少?

如何将 CSS 样式应用于 Quarto 输出

React Typescript 中的自动 typewriter 效果

CSS:菜单图标动画

如何使半圆的边框淡出?

仅针对直接子代而不是其他相同后代的 CSS Select 器

边框半径 + 背景 colored颜色 == 裁剪边框

Flexbox 列自底对齐

透明的空心或切出的圆圈

CSS 表格 td 宽度 - 固定,不灵活

如何在 Flexbox 中禁用等高列?

Angular 动画的目的是什么?

删除行内块元素中大文本上方和下方的空白

CSS显示:表格列应该如何工作?

CSS中伪元素前的&是什么意思?