搜索
首页web前端css教程CSS前景背景自动配色技术简介(代码实例)


本篇文章给大家带来的内容是关于CSS前景背景自动配色技术,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

一、颜色匹配效果预览

如下GIF示意,当我们按钮背景色逐渐变淡的时候,文字颜色也从原来的白色变成黑色了,同时边框也显示出来了,其中的配色转换是纯CSS实现的。

auto-color-button.gif

自动配色按钮示意

拖动R,G,B对应滑块,可以看到按钮文字颜色以及边框颜色,会自动根据背景色不同而发生变化。具体表现为:

深色背景下,文字白色,无边框。

浅色背景下,文字黑色,有加深边框,便于和周围环境区分开。

这种智能匹配是纯CSS实现的,主要是使用CSS3 calc()计算,以及CSS3原生var变量。

二、配色代码展示

HTML代码很简单,如下:

<button class="btn">我是按钮</button>

重点和难点在CSS部分:

:root {
/* 定义RGB变量 */
--red: 44;
--green: 135;
--blue: 255;
/* 文字颜色变色的临界值,建议0.5~0.6 */
--threshold: 0.5;
/* 深色边框出现的临界值,范围0~1,推荐0.8+*/
--border-threshold: 0.8;
}
.btn {
/* 按钮背景色就是基本背景色 */
background: rgb(var(--red), var(--green), var(--blue));
/**
* 使用sRGB Luma方法计算灰度(可以看成亮度)
* 算法为:
* lightness = (red * 0.2126 + green * 0.7152 + blue * 0.0722) / 255
*/
--r: calc(var(--red) * 0.2126);
--g: calc(var(--green) * 0.7152);
--b: calc(var(--blue) * 0.0722);
--sum: calc(var(--r) + var(--g) + var(--b));
--lightness: calc(var(--sum) / 255);
/* 设置颜色 */
color: hsl(0, 0%, calc((var(--lightness) - var(--threshold)) * -999999%));
/* 确定边框透明度 */
--border-alpha: calc((var(--lightness) - var(--border-threshold)) * 100);
/* 设置边框相关样式 */
border: .2em solid;
border-color: rgba(calc(var(--red) - 50), calc(var(--green) - 50), calc(var(--blue) - 50), var(--border-alpha));
}

乍一看,犹如鸭子听雷——不知所云,其实不复杂,且容我剖析下实现原理。

三、前景背景自动配色原理

1. CSS属性值范围溢出边界渲染特性

CSS这门语言有个很有意思的特性,就是CSS属性值超过正常的范围的时候,只要格式正确,也会渲染,而渲染的值就是合法边界值。

举两个板栗:

opacity透明度属性值合法范围是0-1,但是,你设置负数,或者极大值,浏览器也能解析,只是要么是0,要么是1而已,如下:

.example {
opacity: -2;    /* 解析为 0, 完全透明 */
opacity: -1;    /* 解析为 0, 完全透明 */
opacity: 2;     /* 解析为 1, 完全不透明 */
opacity: 100;   /* 解析为 1, 完全不透明 */
}

色值,如HSL,S和L的范围都是0%-100%,但是,你设置负数,或者极大值,浏览器也能解析,只是要么是0%,要么是100%而已,如下:

.example {
color: hsl(0, 0%, -100%);    /* 解析为 hsl(0, 0%, 0%), 黑色 */
color: hsl(0, 0%, 200%);     /* 解析为 hsl(0, 0%, 100%), 白色 */
}

本文的配色技术就活用了这种边界渲染特性。

2. var变量传递给calc实现复杂计算

我们对CSS代码从上往下逐个剖析下。

首先,在:root根选择器上定义几个全局CSS变量(语义上的全局):

:root {
--red: 44;
--green: 135;
--blue: 255;
--threshold: 0.5;
--border-threshold: 0.8;
}

其中:

–threshold

这个是color变色的临界值,用来和当前RGB颜色值的亮度对比。

–border-threshold

这个是边框颜色透明度的临界值,同样也是和当前RGB颜色值的亮度对比。

然后是。btn{}内部的CSS代码:

background: rgb(var(--red), var(--green), var(--blue));

这个很好理解,就是基本的RGB色值作为背景色。

--r: calc(var(--red) * 0.2126);
--g: calc(var(--green) * 0.7152);
--b: calc(var(--blue) * 0.0722);
--sum: calc(var(--r) + var(--g) + var(--b));
--lightness: calc(var(--sum) / 255);

这里5行5个CSS变量,需要的其实是最后一个--lightness,就是计算当前背景色的亮度。用的是使用sRGB Luma灰度算法①,为什么需要5行呢?因为计算公式就是如此:

lightness = (red * 0.2126 + green * 0.7152 + blue * 0.0722) / 255

其中,R,G,B色值相乘的系数就是固定的,不同灰度算法系数还不一样。--lightness表示亮度,范围是0-1,此时就可以和--threshold和--border-threshold这两个临界值比对,来确定按钮的文字颜色,边框透明度。

① 这里的灰度可以看成是亮度,实际上HSL的亮度计算方法应该是,R,G,B中的色值最大值和最小值之和的二分之一。

color: hsl(0, 0%, calc((var(--lightness) - var(--threshold)) * -999999%))

设置颜色的CSS代码。

此处calc计算翻译成中文就是:(亮度值 – 临界值) * 比例系数。

其中亮度值在0-1之间游走,临界值是固定的0.5,于是:

如果亮度值小于0.5,亮度值减去临界值为负,由于我们的比例系数是很大很大的负数,负负得正,于是,会得到一个巨大的正数,按照边界渲染原理,会按照100%渲染,于是颜色是白色;

如果亮度值大于0.5,亮度值减去临界值为正,由于我们的比例系数是很大很大的负数,于是,会得到一个巨大的负数,按照边界渲染原理,会按照0%渲染,于是颜色是黑色;

以上就是按钮文字颜色变色背景下黑色,深色背景下白色的原理。

--border-alpha: calc((var(--lightness) - var(--border-threshold)) * 100);

边框透明度是类似的原理。此处calc计算翻译成中文就是:(亮度值 – 边框临界值) * 100。

其中亮度值在0-1之间游走,边框临界值是固定的0.8,于是:

如果亮度值小于0.8,亮度值减去边框临界值为负,在CSS中,负数透明度会按照边界0渲染,此时边框完全透明;

如果亮度值大于0.8,亮度值减去边框临界值为正,此时的透明度计算值会在0~20之间游走,当然,数值大于1的透明度值都会按照1渲染,此时,边框基本处于完全不透明状态,加深的边框显现;

border: .2em solid;
border-color: rgba(calc(var(--red) - 50), calc(var(--green) - 50), calc(var(--blue) - 50), var(--border-alpha));

设置边框样式,边框颜色比背景色深50个单位值(负数为按照0渲染),然后透明度就是基于亮度动态计算的。深色背景下,按钮边框透明度为0,不显示;浅色背景下,透明度在0~1之间游走,出现,北京颜色越浅,边框透明度越大,边框颜色越深,符合配色预期。

相信经过上面的一番剖析,大家就会明白其实现的原理了。

改变按钮的背景色

.btn类名下的CSS代码是固定的,让我们需要改变按钮的颜色的时候,不是改。btn下的CSS,而是修改:root中的下面3个变量值:

--red: 44;
--green: 135;
--blue: 255;

CSS设置直接改数值,如果是JS设置,借助setProperty()方法,若不了解,可以参考这篇文章:“如何HTML标签和JS中设置CSS3 var变量”。

四、最后结束语

由于var的兼容性限制,这个非常有意思的CSS技巧还不太适合在大型对外项目中使用。

小程序可以一试,因为内核环境相对固定。内部系统,实验项目可以玩一玩,会很有意思。

这种配色技巧其实不仅可以用在按钮上,一些大区域的布局也是可以用的,因为这些布局的背景色可能是动态的 ,此时,文字颜色的配色也可以借助CSS实现自动化。

另外,本文demo中按钮文字就黑白两色,实际上,我们的相乘系数小一点的话,可以有更多的色值出现,配色会更加精致。

以上就是对CSS前景背景自动配色技术的全部介绍,如果您想了解更多有关CSS3教程,请关注PHP中文网。



以上是CSS前景背景自动配色技术简介(代码实例)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:zhangxinxu。如有侵权,请联系admin@php.cn删除
@rules具有多少特异性,例如@keyframes和@media?@rules具有多少特异性,例如@keyframes和@media?Apr 18, 2025 am 11:34 AM

前几天我得到了这个问题。我的第一个想法是:奇怪的问题!特异性是关于选择者的,而在符号不是选择器,那么...无关紧要?

您可以嵌套@Media和@support查询吗?您可以嵌套@Media和@support查询吗?Apr 18, 2025 am 11:32 AM

是的,您可以,而且它并不重要。不需要CSS预处理器。它在常规CSS中起作用。

快速吞噬缓存破坏快速吞噬缓存破坏Apr 18, 2025 am 11:23 AM

您应该肯定会在CSS和JavaScript(以及图像和字体以及其他内容)等资产上设置遥远的高速缓存标头。告诉浏览器

寻找可以监视CSS质量和复杂性的堆栈寻找可以监视CSS质量和复杂性的堆栈Apr 18, 2025 am 11:22 AM

许多开发人员写了如何维护CSS代码库的文章,但并没有很多关于如何测量该代码库质量的文章。当然,我们有

数据学家用于建议不执行值的值数据学家用于建议不执行值的值Apr 18, 2025 am 11:08 AM

您是否曾经有一种需要接受简短而任意的文本的表格?喜欢名字或其他。那完全是用的。有很多

苏黎世的最初会议苏黎世的最初会议Apr 18, 2025 am 11:03 AM

我很高兴能前往瑞士苏黎世参加前界(Love the Name and URL!)。我以前从未去过瑞士,所以我很兴奋

使用CloudFlare工人建立全栈无服务器应用程序使用CloudFlare工人建立全栈无服务器应用程序Apr 18, 2025 am 10:58 AM

我在软件开发方面最喜欢的发展之一是无服务器的出现。作为一个倾向于陷入细节的开发人员

在NUXT应用程序中创建动态路由在NUXT应用程序中创建动态路由Apr 18, 2025 am 10:53 AM

在这篇文章中,我们将使用我构建和部署的电子商务商店演示来进行Netlify,以展示如何为传入数据制作动态路线。这是一个公平的

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前By尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。