现代 CSS 解决方案:文字颜色自动适配背景色!
liuian 2025-01-02 17:47 43 浏览
在 23 年的 CSS 新特性中,有一个非常重要的功能更新 -- 相对颜色。
简单而言,相对颜色的功能,让我们在 CSS 中,对颜色有了更为强大的掌控能力。
其核心功能就是,让我们能够基于一个现有颜色 A,通过一定的转换规则,快速生成我们想要的颜色 B。
其功能能够涵盖:
- 精简
 - 调暗
 - 饱和度
 - 降低饱和度
 - 色度增强
 - 调整不透明度
 - 反转
 - 补充
 - 转换
 - 对比度
 - 调色板
 
当然,今天我们不会一个一个去过这些功能,更多的时候,我们只需要知道我们能够实现这些功能。
本文,我们将从实际实用角度出发,基于实际的案例,看看 CSS 相对颜色,能够如何解决我们的一些实际问题。
快速语法入门
首先,我们通过一张图,一个案例,快速入门 CSS 相对颜色语法:
相对颜色语法的目标是允许从另一种颜色派生颜色。
上图显示了将原始颜色 green 转换为新颜色的颜色空间后,该颜色会转换为以 r、g、b 和 alpha 变量表示的各个数字,这些数字随后会直接用作新的 rgb() 颜色的值。
举个例子:
<p> CSS Relative Color </p>
p {
    color: rgb(255, 0, 0);
}实现一个 color 为红色(rgb 值为 rgb(255, 0, 0))的字体:
基于上面的相对颜色语法,我如何通过一个红色生成绿色文字呢?示意如下:
p {
    --color: rgb(255, 0, 0);
    color: rgb(from var(--color) calc(r - 255) calc(g + 255) b);  /* result = rgb(0, 255, 0) */
}
效果如下,我们就得到绿色字体:
解释一下:
- 原本的红色颜色,我们把它设置为 CSS 变量 --color: rgb(255, 0, 0)
 - 想通过红色得到绿色,对于红色的 rgb 值 rgb(255, 0, 0) 而言,需要转换成 rgb(0, 255, 0)
 - 使用 CSS 相对颜色语法,就是 rgb(from var(--color) calc(r - 255) calc(g + 255) b)
 
通过这个 DEMO,我们把几个核心基础语法点学习一下:
- from 关键字
 
from 关键字,它是相对颜色的核心。它表示会将 from 关键字后的颜色定义转换为相对颜色!在 from 关键字后面,CSS 会期待一种颜色,即能够启发生成另一种颜色。
- from 关键字 后的颜色表示,支持不同颜色表示或者是 CSS 变量
 
第二个关键点,from 后面通常会接一个颜色值,这个颜色值可以是任意颜色表示法,或者是一个 CSS 变量,下面的写法都是合法的:
p {
    color: rgba(from #ff0000) r g b);
    color: rgb(from rgb(255, 0, 0) r g b);
    color: rgb(from hsl(0deg, 100%, 50%) r g b);
    color: rgb(from var(--hotpink) r g b);
}
- 对转换后的变量使用 calc() 或其他 CSS 函数
 
另外一个非常重要的基础概念就是,我们可以对 (from color r g b) 后的转换变量 r g b 使用 calc() 或其他 CSS 函数。
就是我们上面的例子:
p {
    --color: rgb(255, 0, 0);
    color: rgb(from var(--color) calc(r - 255) calc(g + 255) b);  /* result = rgb(0, 255, 0) */
}
- 相对颜色语法支持,各种颜色表示函数:
 
相对颜色的基础的使用规则就是这样,它不仅支持 rgb 颜色表示法,它支持所有的颜色表示法:
- sRGB 颜色空间:hsl()、hwb()、rgb();
 - CIELAB 颜色空间:lab()、lch();
 - Oklab 颜色空间:oklab()、oklch();
 
使用 CSS 相对颜色,实现统一按钮点击背景切换
通常页面上的按钮,都会有 hover/active 的颜色变化,以增强与用户的交互。
像是这样:
最常见的写法,就是我们需要在 Normal 状态、Hover 状态、Active 状态下写 3 种颜色:
p {
    color: #ffcc00;
    transition: .3s all;
}
/* Hover 伪类下为 B 颜色 */
p:hover {
    color: #ffd21f;
}
/** Active 伪类下为 C 颜色 **/
p:active {
    color: #ab8a05;
}
在之前,我们介绍过一种利用滤镜 filter: contrast() 或者 filter: brightness() 的统一解决方案,无需写多个颜色值,可以根据 Normal 状态下的色值,通过滤镜统一实现更亮、或者更暗的伪类颜色。
在今天,我们也可以利用 CSS 相对颜色来做这个事情:
div {
    --bg: #fc0;
    background: var(--bg);
    transition: .3s all;
}
div:hover {
    background: hsl(from var(--bg) h s calc(l * 1.2));
}
div:active {
    background: hsl(from var(--bg) h s calc(l * 0.8));
}
我们通过 hsl 色相、饱和度、亮度颜色表示法表示颜色。实现:
- 在 :hover 状态下,根据背景色,将背景亮度 l 调整为原背景色的 1.2 倍
 - 在 :avtive 状态下,根据背景色,将背景亮度 l 调整为原背景色的 0.8 倍
 
在实际业务中,这是一个非常有用的用法。
使用 CSS 相对颜色,实现文字颜色自适应背景
相对颜色,还有一个非常有意思的场景 -- 让文字颜色能够自适应背景颜色进行展示。
有这么一种场景,有的时候,无法确定文案的背景颜色的最终表现值(因为背景颜色的值可能是后台配置,通过接口传给前端),但是,我们又需要能够让文字在任何背景颜色下都正常展现(譬如当底色为黑色时文字应该是白色,当背景为白色时,文字应该为黑色)。
像是这样:
在不确定背景颜色的情况下,无论什么情况,文字颜色都能够适配背景的颜色。
在之前,纯 CSS 没有特别好的方案,可以利用 mix-blend-mode: difference 进行一定程度的适配:
div {
    // 不确定的背景色
}
p {
    color: #fff;
    mix-blend-mode: difference;
}
实操过这个方案的同学都会知道,在一定情况下,前景文字颜色还是会有一点瑕疵。并且,混合模式这个方案最大的问题是会影响清晰度。
有了 CSS 相对颜色后,我们有了更多的纯 CSS 方案。
利用 CSS 相对颜色,反转颜色
我们可以利用相对颜色的能力,基于背景色颜色进行反转,赋值给 color。
一种方法是将颜色转换为 RGB,然后从 1 中减去每个通道的值。
代码非常简单:
p {
    /** 任意背景色 **/
    --bg: #ffcc00;
    background: var(--bg);
    color: rgb(from var(--bg) calc(1 - r) calc(1 - g) calc(1 - b));  /** 基于背景反转颜色 **/
}
用 1 去减,而不是用 255 去,是因为此刻,会将 rgb() 表示法中的 0~255 映射到 0~1。
效果如下:
配个动图,我们利用背景色的反色当 Color 颜色,适配所有背景情况:
完整的 DEMO 和代码,你可以戳这里:CodePen Demo -- CSS Relatvie Color Adapt BG
当然,这个方案还有两个问题:
- 如果颜色恰好是在 #808080 灰色附近,它的反色,其实还是它自己!会导致在灰色背景下,前景文字不可见;
 - 绝大部分情况虽然可以正常展示,但是并不是非常美观好看
 
为了解决这两个问题,CSS 颜色规范在 CSS Color Module Level 6 又推出了一个新的规范 -- color-contrast()。
利用 color-contrast(),选择高对比度颜色
color-contrast() 函数标记接收一个 color 值,并将其与其他的 color 值比较,从列表中选择最高对比度的颜色。
利用这个 CSS 颜色函数,可以完美的解决上述的问题。
我们只需要提供 #fff 白色和 #000 黑色两种可选颜色,将这两种颜色和提供的背景色进行比较,系统会自动选取对比度更高的颜色。
改造一下,上面的代码,它就变成了:
p {
    /** 任意背景色 **/
    --bg: #ffcc00;
    background: var(--bg);
    color: color-contrast(var(--bg) vs #fff, #000);  /** 基于背景色,自动选择对比度更高的颜色 **/
}
这样,上面的 DEMO 最终效果就变成了:
此方案的优势在于:
- 可以限定前景 color 颜色为固定的几个色值,以保证 UI 层面的统一及美观
 - 满足任何情况下的背景色
 
当然,唯一限制这个方案的最大问题在于,当前,color-contrast 还只是一个实验室功能,未大规模被兼容。
总结一下
到今天,我们可以利用 CSS 提供的各类颜色函数,对颜色有了更为强大的掌控力。
很多交互效果,不借助 JavaScript 的运算,也能计算出我们想要的最终颜色值。本文简单的借助:
- 使用 CSS 相对颜色,实现统一按钮点击背景切换
 - 使用 CSS 相对颜色,实现文字颜色自适应背景
 
两个案例,介绍了 CSS 相对颜色的功能。
原文链接:https://juejin.cn/post/7321410822789742618
相关推荐
- MySQL慢查询优化:从explain到索引,DBA手把手教你提升10倍性能
 - 
        
数据库性能是应用系统的生命线,而慢查询就像隐藏在系统中的定时炸弹。某电商平台曾因一条未优化的SQL导致订单系统响应时间从200ms飙升至8秒,最终引发用户投诉和订单流失。今天我们就来系统学习MySQL...
 
- 一文读懂SQL五大操作类别(DDL/DML/DQL/DCL/TCL)的基础语法
 - 
        
在SQL中,DDL、DML、DQL、DCL、TCL是按操作类型划分的五大核心语言类别,缩写及简介如下:DDL(DataDefinitionLanguage,数据定义语言):用于定义和管理数据库结构...
 
- 闲来无事,学学Mysql增、删,改,查
 - 
        
Mysql增、删,改,查1“增”——添加数据1.1为表中所有字段添加数据1.1.1INSERT语句中指定所有字段名语法:INSERTINTO表名(字段名1,字段名2,…)VALUES(值1...
 
- 数据库:MySQL 高性能优化规范建议
 - 
        
数据库命令规范所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用MySQL保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名识意,...
 
- 下载工具合集_下载工具手机版
 - 
        
迅雷,在国内的下载地位还是很难撼动的,所需要用到的地方还挺多。缺点就是不开会员,软件会限速。EagleGet,全能下载管理器,支持HTTP(S)FTPMMSRTSP协议,也可以使用浏览器扩展检测...
 
- mediamtx v1.15.2 更新详解:功能优化与问题修复
 - 
        
mediamtxv1.15.2已于2025年10月14日发布,本次更新在功能、性能优化以及问题修复方面带来了多项改进,同时也更新了部分依赖库并提升了安全性。以下为本次更新的详细内容:...
 
- 声学成像仪:泄露监测 “雷达” 方案开启精准防控
 - 
        
声学成像仪背景将声像图与阵列上配装的摄像实所拍的视频图像以透明的方式叠合在一起,就形成了可直观分析被测物产生状态。这种利用声学、电子学和信息处理等技术,变换成人眼可见的图像的技术可以帮助人们直观地认识...
 
- 最稳存储方案:两种方法将摄像头接入威联通Qu405,录像不再丢失
 - 
        
今年我家至少被4位邻居敲门,就是为了查监控!!!原因是小区内部监控很早就停止维护了,半夜老有小黄毛掰车门偷东西,还有闲的没事划车的,车主损失不小,我家很早就配备监控了,人来亮灯有一定威慑力,不过监控设...
 
- 离岗检测算法_离岗检查内容
 - 
        
一、研发背景如今社会许多岗位是严禁随意脱离岗位的,如塔台、保安室、监狱狱警监控室等等,因为此类行为可能会引起重大事故,而此类岗位监督管理又有一定困难,因此促生了智能视频识别系统的出现。二、产品概述及工...
 
- 消防安全通道占用检测报警系统_消防安全通道占用检测报警系统的作用
 - 
        
一、产品概述科缔欧消防安全通道占用检测报警系统,是创新行业智能监督管理方式、完善监管部门动态监控及预警预报体系的信息化手段,是实现平台远程监控由“人为监控”向“智能监控”转变的必要手段。产品致力于设...
 
- 外出住酒店、民宿如何使用手机检测隐藏的监控摄像头
 - 
        
最近,一个家庭在他们的民宿收到了一个大惊喜:客厅里有一个伪装成烟雾探测器的隐藏摄像头,监视着他们的一举一动。隐藏摄像头的存在如果您住在酒店或民宿,隐藏摄像头不应再是您的担忧。对于民宿,房东应报告所有可...
 
- 基于Tilera众核平台的流媒体流量发生系统的设计
 - 
        
曾帅,高宗彬,赵国锋(重庆邮电大学通信与信息工程学院,重庆400065)摘要:设计了一种基于Tilera众核平台高强度的流媒体流量发生系统架构,其主要包括:系统界面管理模块、服务承载模块和流媒体...
 
- 使用ffmpeg将rtsp流转流实现h5端播放
 - 
        
1.主要实现rtsp转tcp协议视频流播放ffmpeg下载安装(公认业界视频处理大佬)a、官网地址:www.ffmpeg.org/b、gitHub:github.com/FFmpeg/FFmp…c、推...
 
- 将摄像头视频流从Rtsp协议转为websocket协议
 - 
        
写在前面很多通过摄像头拿到的视频流格式都是Rtsp协议的,比如:海康威视摄像头。在现代的浏览器中,已经不支持直接播放Rtsp视频流,而且,海康威视提供的本身的webSdk3.3.0视频插件有很多...
 
- 华芸科技推出安全监控中心2.1 Beta测试版
 - 
        
全球独家支持hdmi在线实时监看摄像机画面,具单一、循环或同时监看四频道视频影像,可透过华芸专用红外线遥控器、airemote或是键盘鼠标进行操作,提供摄像机频道增购服务,满足用户弹性扩增频道需...
 
- 一周热门
 
- 最近发表
 
- 标签列表
 - 
- python判断字典是否为空 (50)
 - crontab每周一执行 (48)
 - aes和des区别 (43)
 - bash脚本和shell脚本的区别 (35)
 - canvas库 (33)
 - dataframe筛选满足条件的行 (35)
 - gitlab日志 (33)
 - lua xpcall (36)
 - blob转json (33)
 - python判断是否在列表中 (34)
 - python html转pdf (36)
 - 安装指定版本npm (37)
 - idea搜索jar包内容 (33)
 - css鼠标悬停出现隐藏的文字 (34)
 - linux nacos启动命令 (33)
 - gitlab 日志 (36)
 - adb pull (37)
 - python判断元素在不在列表里 (34)
 - python 字典删除元素 (34)
 - vscode切换git分支 (35)
 - python bytes转16进制 (35)
 - grep前后几行 (34)
 - hashmap转list (35)
 - c++ 字符串查找 (35)
 - mysql刷新权限 (34)
 
 
