世界快资讯:深入了解CSS颜色混合函数Color-mix
今天来介绍一下Chrome 111+正式推出的 CSS颜色混合函数:color-mix()[1]。
【资料图】
所谓颜色混合,顾名思义,就是将两种颜色按照一定的比例混合起来,和调色板比较像。到目前为止,可以说是最强大、最实用的 CSS 颜色处理函数了,有了它,再也不需要用LESS、SASS等预处理工具了,还可以实现颜色动态更新,一起了解一下吧。
一、color-mix语法首先来看语法,比较简单。
color-mix(in lch, plum, pink);color-mix(in lch, plum 40%, pink);color-mix(in srgb, #34c9eb 20%, white);color-mix(in hsl longer hue, hsl(120 100% 50%) 20%, white);
通用语法写作。
color-mix(method, color1[ p1], color2[ p2])
主要由 3 部分组成,分别是插值颜色法(method,这里只介绍颜色空间)、基础颜色(color1)和混合颜色(color2),示意如下:
颜色空间是一个很复杂的概念,这里不做介绍,只需要知道用法就行。
矩形颜色空间。srgb、srgb-linear、lab、oklab、xyz、xyz-d50、xyz-d65。极性颜色空间 。hsl、hwb、lch、oklch。以红色和白色混合为例。
color-mix(in srgb, red, white);
下面是实际混合效果:
可以看到,混合后的颜色介于红色和白色的中间,相当于把之前的颜色减淡了。
再比如,红色和黄色混合,可以得到橙色。
color-mix(in srgb, red, yellow);
效果如下:
这是如何混合的呢,很简单,以rgb为例,其实就是将对应的值取平均数。
R = (r1 + r2)/ 2G = (g1 + g2)/ 2B = (b1 + b2)/ 2
比如红色是rgb(255,0,0),黄色是rgb(255,255,0),计算如下:
R = (255 + 255)/ 2 = 255G = (0 + 255)/ 2 = 127.5B = (0 + 0)/ 2 = 0
所以混合的颜色就是rgb(255,127.5,0),也就是橙色。
你也可以在下面的 demo 中自行调整颜色体验。
CSS color-mix (codepen.io)[2]CSS color-mix (juejin.cn)[3]CSS color-mix (runjs.work)[4]这应该就是颜色混合最直观的认识了。
二、 color-mix 混合比例当然,这只是最简单的情况。在上面的语法中,还可以给颜色设置混合比例,也就是前面语法中的p1和p2。
color-mix(method, color1[ p1], color2[ p2])
由于 CSS 强大的“包容”性,对各种情况都做了兼容,主要分为以下几种情况。
如果 和p1都p2被省略,则p1 = p2 = 50%。如果p1省略,则p1 = 100% - p2。如果p2省略,则p2 = 100% - p1。如果p1 = p2 = 0%,则该函数无效。如果p1 + p2 ≠ 100%,则p1" = p1 / (p1 + p2)和p2" = p2 / (p1 + p2),其中p1"和p2"是归一化结果。前面 4 种情况都比较好理解,就是互相补全,另外注意,这两个值都位于0%~100%,超出范围者直接不合法。
下面来看最后一种情况,也就是两者相加不等于100%的情况。
这里其实也要分两种,首先是p1+p2>100%的情况,比如。
color-mix(in srgb, red 100%, white 100%);
这种混合应该怎么计算呢?
首先还是按照上面的计算规则,算出两者的比例关系
p1" = p1 / (p1 + p2) = 100% / (100% + 100%) = 0.5p2" = p1 / (p1 + p2) = 100% / (100% + 100%) = 0.5
也就是两者是1:1混合的,在超过100%的情况下,仍然按照100%进行分配,也就是等同于。
color-mix(in srgb, red 100%, white 100%);/* 等同于 */color-mix(in srgb, red 50%, white 50%);
效果如下:
同理,这种情况下也是等同的,因为都是4:1。
color-mix(in srgb, red 100%, white 25%);/* 等同于 */color-mix(in srgb, red 80%, white 20%);
效果如下:
所以,在两者相加大于100%的情况下,可以先计算两者的比例,然后再用100%按比例分配即可。
然后是p1+p2<100%的情况。
起初,我以为也是相同的处理方式,其实不然。以下面这个为例。
color-mix(in srgb, red 20%, white 20%);/* 等同于? */color-mix(in srgb, red 50%, white 50%);
混合比例其实都是1:1,最后这两者结果会相同吗?可以先看结果。
可以明显看到,下面的混合结果颜色跟淡一些。为什么呢,其实可以从最终的混合颜色看出原因,这里直接通过控制台来得到计算颜色,如下:
两个实色混合出来居然有了透明度!
这个透明度怎么来的呢?其实就是由于两者混合相加不足100%,刚才这个例子,两者相加20%+20%=40%,所以最终的混合出现了0.4的透明度。
我们再换个例子。
color-mix(in srgb, red 40%, white 10%);/*等同于*/color-mix(in srgb, red 80%, white 20%); /* 50%透明度 */
效果如下:
从控制台可以看到,刚好就是50%的透明度。
因此,在两者相加小于100%的情况下,可以先计算两者的比例,然后再按比例分配,最后再叠加上透明度。这样看来,其实大于100%的情况也可以理解为叠加了一个大于1的透明度,只不过最后解析成了1。
三、color-mix 实际应用使用color-mix可以很方便的根据主题色生成与之相对应的邻近色,例如:
:root{ --primary-color: #ffeb3b; --primary-secondary-1: color-mix(in srgb, var(--primary-color), #fff 20%); --primary-secondary-2: color-mix(in srgb, var(--primary-color), #fff 40%); --primary-secondary-3: color-mix(in srgb, var(--primary-color), #fff 60%); --primary-secondary-4: color-mix(in srgb, var(--primary-color), #fff 80%);}
效果如下:
这样在实现一些跟随主题色变化的按钮就非常方便了。
button{ color: var(--primary-color); background-color: var(--primary-secondary-4); outline: 4px solid var(--primary-secondary-4);}
效果如下:
这些技巧在之前这些文章中都有介绍,还提供了其他解决方案,如果不考虑兼容性,color-mix无疑是最方便的。
妙用 CSS 动画来实现颜色加深、减淡等混合操作[5]CSS 颜色混合的N种方式[6]四、兼容性和回退措施兼容性文章开头就有提到,完整兼容性如下:
现在主流浏览器已经全部兼容了,放心学习吧。
不过实际工作中,还需要做好回退措施,如果浏览器不兼容怎么办?有些同学可能会想到用 CSS 变量来做回退处理,如下:
div{ --bg: color-mix(in srgb, red, blue); background: var(--bg, var(--fallback-color));}
很可惜,这种方式并不可取。原因在于,CSS 变量只有在未定义时,才会走后面的回退值。这种情况下,仍然取前面的值,从而导致颜色失效。
正确的做法是使用CSS supports进行判断。
:root{ --bg: orange}@supports (color:color-mix(in srgb,red,blue)) { --bg: color-mix(in srgb, red, blue);}
这样,在不支持的浏览器中也能使用一个还能接受的回退值,只是不能动态去混合了。
五、总结一下以上就是本文的全部内容了,相信你会对颜色混合有更深刻的理解,下面总结一下。
color-mix其实就是将两种颜色按照一定的比例混合起来,和调色板比较像。语法很简单,只有3个参数,分别是插值颜色法(method)、基础颜色(color1)和混合颜色(color2)。插值颜色法可以先不用管,一般用来定义颜色空间,有 hsl、srgb。两种颜色混合可以设置混合比例,由于 CSS 强大的“包容”性,对各种情况都做了兼容。在混合比例在两者相加大于100%的情况下,需要先计算两者的比例,然后再用100%按比例分配。在混合比例在两者相加小于100%的情况下,会出现透明度。颜色混合最常见的用途是根据主题色生成与之相对应的邻近色。目前主流浏览器全兼容,在实际开发中,需要使用CSS supports进行回退处理。CSS 颜色处理函数真的是越来越强大了,后面还会介绍其他比较实用的颜色函数。
参考资料[1]color-mix():https://developer.mozilla.org/en-US/docs/Web/CSS/color_value/color-mix。
[2]CSS color-mix (codepen.io):https://codepen.io/xboxyan/pen/KKrzyBz。
[3]CSS color-mix (juejin.cn):https://code.juejin.cn/pen/7245647917632094263。
[4]CSS color-mix (runjs.work):https://runjs.work/projects/d8b793ca495346b2。
[5]妙用 CSS 动画来实现颜色加深、减淡等混合操作:https://juejin.cn/post/7184252342882009125。
[6]CSS 颜色混合的N种方式:https://juejin.cn/post/7207228091989557306。
关键词:
您可能也感兴趣:
为您推荐
高质量发展调研行|数字经济“扎根”海南 媒体人纷纷赞叹
深圳发布百富兴大厦后续情况通报
新产业:公司新产业生物研发大厦(三期)已于今年上半年投入使用 今日精选
排行
最近更新
- 世界快资讯:深入了解CSS颜色混合函数Color-mix
- 小试牛刀!李梦10中4拿下12分4板5助 正负值+28
- 具俊晔与队友合体获力挺 姜元来发文斥黄子佼造谣_全球热文
- 世界微动态丨45分狂胜!中国女篮开门红,单节狂轰22-2,李梦...
- 环球百事通!“济云物资”获批钢链宝合作银行交通银行500万元...
- 看点:寨上街道平阳里社区:杜绝“飞线”充电 建设平安社区
- 兰溪非遗双绝 藏在兰溪人记忆中的文化“密码”|焦点消息
- 速读:甘肃省宁县市场监管局开展燃气气瓶安全专项检查
- 热推荐:2023选秀大会总结(勇士篇):这次勇士选择了高即战...
- 2023潜江中考志愿填报时间是多少?_世界独家
- 2023年西博会消费优惠活动有哪些?_今日精选
- 他是大雅宝胡同甲二号的“孩子头儿”,赤子之心无法复制,追...
- 北京体育局发警示提醒,为孩子暑期校外体育培训支招
- 全球快资讯丨天津单位申请小汽车摇号指标有什么条件?
- 陈梦4-3险刘诗雯晋级四强,决胜局差点打出110,半决赛对阵伊...
- 陈梦3-1逆转战胜郑怡静,赢得很艰难,难度超乎想象
- 2023广东高考录取结果查询系统官方入口 焦点热闻
- ST花王(603007)6月26日主力资金净买入52.71万元
- 下好先手棋 啃下硬骨头 每日快报
- 惠州往来港澳通澳门商务签办理指南(条件+材料+逗留时间)
- 湘邮科技(600476)6月26日主力资金净卖出1140.69万元
- 疯狂7连胜!亚洲第1又赢了:轮换10人仍能大胜,国足隔空收大...
- 2023苏州高考志愿设置原则
- 淳中科技(603516)6月26日主力资金净卖出1535.93万元|全球热门
- 电魂网络(603258)6月26日主力资金净卖出7230.09万元
- 市场机会仍大于风险 关注三条主线_今日快讯
- 新进展!美国“泰坦”号内爆事故已确定5块残骸位置_头条
- 《消失的她》,救得回消失的悬疑吗?_简讯
- 6月26日国内丁苯橡胶市场行情平稳运行
- 天天快资讯丨8月15日拟成为全国生态日
今日要闻
- 小试牛刀!李梦10中4拿下12分4板5助 正负值+28
- 近3年诉讼案件年均降幅3.38%,甘肃陇南“民事直说+诉源治理”有何独特之处?
- 湘邮科技(600476)6月26日主力资金净卖出1140.69万元
- 白条鸡的做法白切鸡最正宗的做法? 天天精选
- 最全汇总!全国31个省份高考分数线公布_每日速讯
- 卫星新闻丨高空俯瞰“千万工程”20年蝶变
- 中国蜜瓜产业大会7月在“蜜瓜之乡”民勤县举办
- 三百斤荔枝拍出四万元高价!东莞大朗举办“荔王”品鉴拍卖会_当前视讯
- 世界看热讯:诺思格(301333):6月26日北向资金减持4100股
- 淳中科技(603516)6月26日主力资金净卖出1535.93万元|全球热门