我每天都在写代码。
自诩搞过无数大项目,搭建过各种高大上的设计系统。
但就在前几天,我被现实狠狠扇了一巴掌。
原来这几年,我写颜色的方式全是错的。
不是说代码跑不通,它能跑,也没报错。但正是这种“温水煮青蛙”的心态,让我完全忽略了CSS已经发生了翻天覆地的进化。
那一刻,我在整理颜色变量,突然意识到:我的代码还活在石器时代,而那些我甚至闻所未闻的新特性,正被我狠狠拒之门外。
我那“老掉牙”的写法
如果你也是个写了几年CSS的老兵,下面这行代码你一定熟得不能再熟:
background: rgba(0, 123, 255, 0.8); color: hsla(0, 0%, 100%, 0.9);老教程、旧项目、Stack Overflow上的高赞回答……到处都是这种写法。
是的,它依然有效。
但“有效”和“现代”是两码事。诺基亚也能打电话,你现在还用吗?
现代CSS的进化,早已在悄无声息中完成了。
同样的颜色,现代人怎么写?
睁大眼睛看看,这才是2026年该有的代码:
background: lch(0 123 255 / 0.8); color: hsl(0 0% 100% / 0.9);发现了什么?三个颠覆性的变化:
逗号滚蛋了。
rgba()和hsla()被扔进了垃圾堆(废弃了)。透明度现在用
/来分隔。
第一眼看:这啥玩意?怪怪的。 第二眼看:真香!清爽,易读。
但这不仅仅是为了好看。
为什么这不是“面子工程”?
我平时对语法糖这种东西是无感的。但这次不一样,这是一张门票。
那种老的、用逗号分隔的格式,已经成了绊脚石。如果你想用下面这些黑科技,就必须抛弃旧语法:
相对颜色语法(Relative color syntax)
现代色彩空间(如
lch和lab)P3 和 Rec2020 广色域支持
如果你还在用逗号,对不起,这些功能你一个都用不了。
这时候我才明白,这不是什么“小技巧”,这是一场必须进行的习惯革命。
真的有那么神?看看实战!
光说不练假把式。来看看我在实际项目中遇到的场景,你就知道差距有多大了。
1. 搞定按钮状态,拒绝复制粘贴
以前,我有主品牌色:
:root { --brand: rgb(0 123 255); }为了搞定按钮的普通、悬停(Hover)、禁用(Disabled)状态,我得这么写(旧方法):
.button { background: rgba(0, 123, 255, 1); } .button:hover { background: rgba(0, 123, 255, 0.8); } .button:disabled { background: rgba(0, 123, 255, 0.4); }这是在犯罪!每次品牌色一变,我得改三个地方。万一漏了一个,UI就得找我拼命。
现在?看好了(现代相对颜色法):
:root { --brand: rgb(0 123 255); } .button { background: hsl(from var(--brand) h s l / 1); } .button:hover { background: hsl(from var(--brand) h s l / 0.85); } .button:disabled { background: hsl(from var(--brand) h s l / 0.4); }一个变量,统领全局。不需要重写颜色值,只需要调整透明度。这才是现代CSS该有的样子!
2. 卡片与微妙的背景色
我经常需要给卡片加一个淡淡的品牌色背景。
以前?全靠瞎猜,或者让设计师给色值。 现在?我直接用代码教做人:
.card { background: lch(from var(--brand) l c h / 0.08); }为什么要用lch?因为它能保证感知亮度一致。不管你的品牌色怎么变,背景色永远不会显得脏或者灰蒙蒙的。
我不再计算颜色,我是在“复用”颜色。
3. 完美适配系统的遮罩层
做模态框遮罩或者聚焦状态时:
.overlay { background: rgb(from var(--brand) r g b / 0.15); }不用去算十六进制,不用重复定义数值。清晰、无脑、零失误。
看看演示,你就懂了
我做了一个互动演示,你可以随意在这个Demo里修改品牌色,然后看着按钮、卡片、遮罩层自动跟着变。
去玩一下,感受一下这种“牵一发而动全身”的快感。
https://codepen.io/t-kanjariya/pen/qENBVgQ
我的思维模型彻底变了
以前,颜色在我脑子里就是一个个孤立的数值。我得记住它们,定义它们。
现在?颜色是关系,是转换。
有一个基准色,其他的透明度、悬停态、禁用态,全都是从这个源头衍生出来的。
这不仅仅是代码的重构,更是思维的重构。这种思维方式,才真正契合设计系统的本质。
真实案例:一次痛快淋漓的重构
这是我上个月亲手改的代码,对比一下你就知道差距了。
改写前(乱七八糟):
.alert { background: rgba(0, 123, 255, 0.1); border: 1px solid rgba(0, 123, 255, 0.3); color: #007bff; } .alert:hover { background: rgba(0, 123, 255, 0.15); }改写后(神清气爽):
:root { --alert-base: rgb(0 123 255); } .alert { background: rgb(from var(--alert-base) r g b / 0.1); border: 1px solid rgb(from var(--alert-base) r g b / 0.3); color: var(--alert-base); } .alert:hover { background: rgb(from var(--alert-base) r g b / 0.15); }视觉效果一模一样。但现在,只要我改动那个蓝色,所有地方瞬间自动更新。这种掌控感,谁用谁知道。
你该什么时候上车?
这是我的建议:
新项目→ 必须用新语法,没商量。
老项目→ 慢慢改,别激进。
设计系统→ 强制执行,这是底线。
你不需要把以前的代码全推翻,但求求你,别再写旧代码了。
最后
我换写法,不是因为旧的不能用了。
而是因为CSS在进化,我的项目在变大,而这些微小的改进,累积起来就是巨大的效率提升。
现代颜色语法不花哨,它不是什么新框架,也不能让你在GitHub上多骗几个Star。
但它让CSS里的颜色管理,终于变成了它本该有的样子:直观、可维护、强大。
一旦你尝到了甜头,就再也回不去了。
反正我是回不去了。
全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。
最后:
CSS终极指南
Vue 设计模式实战指南
20个前端开发者必备的响应式布局
深入React:从基础到最佳实践完整攻略
python 技巧精讲
React Hook 深入浅出
CSS技巧与案例详解
vue2与vue3技巧合集