当前位置: 首页 > 科技观察

使用CSS动画实现颜色加深、减淡等混合操作

时间:2023-03-14 14:25:52 科技观察

上一篇文章CSS如何根据背景颜色自动切换黑白文字?,描述了一些文字自适应背景色的小技巧,但是还是有一些局限性,比如:背景是渐变色怎么办?很容易想到的思路就是取两种渐变色的过渡中间色,然后按照前面的方式进行转换。那么问题来了,有没有办法通过CSS获取中间色呢?下面我们一起来讨论一下这个问题,说说色彩合成的相关技巧。1、你可能不知道CSS动画技巧。CSS动画大家一定用过,比如@keyframescolor{from{color:yellow}to{color:deeppink}}.text{animation:color1slinearforwards;}把颜色从黄色动画到deeppink。对此无话可说。默认情况下,动画播放一次就结束,再设置forwards,会一直停留在最后一帧状态。那么,如果动画只进行到一半,不就在两种颜色的中间吗?其实播放次数也可以是小数,比如你可以设置播放次数为0.5次,像这样。.text{animation:color1s.5linearforwards;}效果如下:由于动画只播放了一半,所以中间的橙色停止了。值得一提的是,通过这种方式获取的颜色也可以用JS获取。然后,利用这个特性,可以实现各种颜色的合成效果。2.渐变背景下的文字适配回到上一个问题,如果是渐变背景,如何自动切换黑白文字?假设渐变的两种颜色是--c1和--c2。前端侦探

然后按照里面的方法上一节,动画可以重新设计成这样。@keyframescolor{from{color:var(--c1)}to{color:var(--c2)}}我们这里只需要获取颜色即可,不需要动画,所以可以设置动画时长是非常小的一个数字,比如0.001s。.txt{animation:color.001s.5linearforwards;}这样文字颜色会自动变成渐变色的中间值,如下:然后应用滤镜将文字转为黑色或白色。.txt{动画:颜色.001s.5线性向前;filter:grayscale(1)contrast(9999)invert(1);}效果如下:同样可以完美适配任何渐变色。完整代码可以在以下任意链接查看CSSauto-gradient-color(juejin.cn)[1]CSSauto-gradient-color(codepen.io)[2]CSSauto-gradient-color(runjs.work)[3]三、颜色加深和淡化我们来看一个更实际的例子,颜色加深和淡化。通常用于主题色的生成,比如给定一个主题色,生成一系列与其相匹配的相邻颜色。下面是颜色逐渐变白的色标图。根据以上原理,很容易实现这样的效果。假设HTML是这样的,每个方块被赋予不同的CSS变量--l。
然后创建一个从主题色到白色的动画,让动画根据这个变量执行不同的次数。.box{animation:lighterBackgroundColor.001svar(--l)linearforwards;}@keyframeslighterBackgroundColor{from{background-color:var(--primary-color)}to{background-color:#fff}}这个工作之后生成颜色相同但深浅不同的主题色,可能有同学会说sass和less也能实现?其实这些都是预处理器,生成后就不能再更改了。但是这个方法是实时绘制的,可以实时修改。完整代码可以查看以下任一链接:CSSlighten(juejin.cn)[4]CSSlighten(codepen.io)[5]CSSlighten(runjs.work)[6]如果这个技术也完美在实际项目中使用。下面是不同主题色下的预览效果。所选底色为80%亮化后的颜色。.item.current{border-color:var(--primary-color);animation:lighterBackgroundColor.001s.8linearforwards;}原理完全一样,这里就不详细介绍了,完整代码可以查看下面任意链接。CSScolor-mix(juejin.cn)[7]CSScolor-mix(codepen.io)[8]CSScolor-mix(runjs.work)[9]另外,根据需要,还可以通过colortransparency变化以生成特定透明度的强调色。@keyframesOpacityBackgroundColor{from{background-color:var(--primary-color)}to{background-color:rgba(0,0,0,0)}}第四,未来最值得期待的颜色处理函数也是官方看到这个需求,在CSSColorModuleLevel5[10]中草拟了几个关于颜色合成的函数,这里简单介绍一下。第一种是混色,将两种颜色按一定比例组合在一起。混色(srgb、白色、蓝色);也就是说白色和蓝色按照各自的50%混合,最终会得到紫色rgb(50%50%100%)。如果你想控制混合比例,你可以这样做。混色(srgb,白色20%,蓝色);还有一种相对颜色叫做relativecolor,其实是对原有颜色功能的补充。按照我的理解,这个特性可以想象成JS赋值中的解构。hsl(fromvar(--accent)hscalc(l-20%))例如,这表示颜色--accent被分解为三个变量h、s、l,然后是l,也就是亮度,减少了20%。也达到了加深颜色的目的。多么令人兴奋的功能!目前这两个功能仅在Safari15+实验性功能中支持(