css - 如何使用 calc() 在颜色值之间切换?

标签 css css-variables css-calc

是否可以使用 calc() CSS 中的函数来操作十六进制颜色值?

在下面的 CSS 片段中,我想使用 --enablebackground-color 的两个十六进制颜色值之间切换的变量MyBtnStyle 的属性:--enable-color--disable-color .

在使用 rgb(r,g,b) 时可以做到这一点使用 calc() 计算每个颜色分量的颜色格式, 但我更愿意直接在十六进制颜色值之间切换。

    :root {
        --enable: 0;
        --disable-color: #ff0000;
        --disable-r: 255;
        --disable-g: 0;
        --disable-b: 0;
        --enable-color: #00ff00;
        --enable-r: 0;
        --enable-g: 255;
        --enable-b: 0;
    }

    .MyBtnStyle {
        width: 100%;
        height: 100%;
        text-align: center;
        border: 2px;
        margin: 1px 1px;
        color: black;
        padding: 1px 1px;
        background-color: calc(var(--enable-color)*var(--enable) + var(--disable-color)*(1 - var(--enable))); 
    }

/* this works */
    /* rgb( calc(var(--enable-r)*var(--enable) + var(--disable-r)*(1 - var(--enable)) ), 
            calc(var(--enable-g)*var(--enable) + var(--disable-g)*(1 - var(--enable)) ), 
            calc(var(--enable-b)*var(--enable) + var(--disable-b)*(1 - var(--enable)) )) */

最佳答案

您不能像您所做的那样乘以十六进制值。一个技巧是使用渐变并控制颜色的百分比。这适用于任何颜色格式:

:root {
  --enable: 0;
  --disable-color: red;
  --enable-color: #00ff00;
}

.MyBtnStyle {
  text-align: center;
  margin: 5px;
  color: black;
  padding:20px;
  background:
   linear-gradient(
     var(--enable-color)  calc(100% * var(--enable)),
     var(--disable-color) 0
   );
     
 }
<div class="MyBtnStyle" style="--enable:1">some text</div>

<div class="MyBtnStyle">some text</div>

这是另一种调整background-size的语法:

:root {
  --enable: 0;
  --disable-color: red;
  --enable-color: #00ff00;
}

.MyBtnStyle {
  text-align: center;
  margin: 5px;
  color: black;
  padding:20px;
  background:
   linear-gradient(var(--enable-color) 0 0),
   var(--disable-color);
  background-size:100% calc(100% * var(--enable))
}
<div class="MyBtnStyle" style="--enable:1">some text</div>

<div class="MyBtnStyle">some text</div>

这是另一个想法inspired from this answer您可以在其中将颜色应用于文本或任何其他属性,而不仅仅是背景。此技巧适用于 hsl() 着色。

:root {
  --enable: 0;
  --disable-color: red;
  --enable-color: #00ff00;
}

.MyBtnStyle {
  text-align: center;
  margin: 5px;
  color: hsl(0,100%, calc((1 - var(--enable))*100%));
  border:3px solid hsl(120,100%, calc((1 - var(--enable))*50%));
  padding:20px;
  background:
   linear-gradient(var(--enable-color),var(--enable-color)),
   var(--disable-color);
  background-size:100% calc(100% * var(--enable))
}
<div class="MyBtnStyle" style="--enable:1">some text</div>

<div class="MyBtnStyle">some text</div>

这对于完全控制对比度很有用。我们同时更改背景颜色和文本颜色。在黑色和白色(或相同颜色的两个版本)之间很容易,因为我们只需要控制亮度。

要表达两种颜色的任意组合,只需依赖我们定义 rgb() 颜色的问题中的代码


获得更多技巧的另一个相关问题:How to change the color of <div> Element depending on its height or width?

关于css - 如何使用 calc() 在颜色值之间切换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51063555/

相关文章:

具有算术运算的 CSS 变量在速记属性中不起作用?

css - 如何调试随机忽略 CSS 更改的 Safari?

javascript - 单击 jQuery 更改 Bootstrap 指示器

css - CSS 自定义属性和 CSS 变量之间有区别吗?

css - 反转 CSS 变量的像素值

css - 就效率而言,全局 CSS 变量与局部变量

使用 calc 的 CSS 转换属性

css - 将 calc 与 rem 和 px 一起使用时解析错误

css - CSS-Shapes 已经成为现实了吗?

html - 手机和平板电脑的居中图像