CSS中常用的颜色格式

news2024/9/27 19:20:44

本文翻译自 Color Formats in CSS,作者:Joshwcomeau。 略有删改

CSS 中的颜色格式可以采用不同的表示方式,包括常用的十六进制、RGB、RGBA、HSL 和 HSLA 等格式。十六进制是最常用的格式,使用 6 个十六进制数字来表示颜色,例如 #FF0000 表示红色;RGB 格式使用红、绿、蓝三个颜色通道的数值来表示颜色,例如 rgb(255,0,0) 也表示红色;RGBA 格式在 RGB 的基础上增加了一个透明度通道,用于控制颜色的不透明度;HSL 格式利用色相、饱和度和亮度三个参数来表示颜色,例如 hsl(0,100%,50%) 表示红色;而 HSLA 格式则在 HSL 的基础上增加了一个透明度通道。选择和使用这些不同的颜色格式时,需要考虑实际需求并进行决策。

对于不同的颜色格式,它们之间存在一些重要的区别。本文将带您深入了解这些选项,包括它们的工作原理、如何解析它们以及如何灵活应用,以下是原文翻译。


CSS有很多不同的颜色格式:hex codes,rgb(),hsl(),lch(),等等!

我们应该用哪一个?这似乎是一个无关紧要的决定,但它们之间却有一些非常重要的区别。而且,老实说我认为我们大多数人都在优先考虑使用错误的方式。

在本教程中,我将带您浏览不同的选项。我们将看到它们是如何工作的,以及我们如何利用它们为我们更好的服务。后面我将向您展示现代CSS如何让我们在选择正确的颜色格式时进行动态调整。

命名式颜色名

这并不是一个真正的颜色格式,但它是一个很好的开始!

HTML有140种命名颜色。这些是特殊的关键字值,如dodgerbluehotpinktomato

开发人员Anthony Lieuallen创建了这个简洁的演示,在一个圆圈中显示了所有140种命名的Web颜色:

由Anthony Lieuallen创作,MIT许可

当你需要一个占位符颜色时,命名式颜色名是很好的。例如,如果您正在构建原型并需要临时值,或者如果您正在编写教育内容。在可读性方面,没有什么比color: red更好。

这可能是不言而喻的,实际开发中140种颜色是不够的,通常不会使用命名的颜色在生产环境中。

看看这两种命名的颜色:

“darkgray”实际上是比“gray”更浅的颜色?
这是因为140种命名的Web颜色来自不同的地方,包括HTML4规范,X11 Unix窗口系统等。这是一个不同调色板的大杂烩,没有一个好的规范约束。

RGB

这是我们的第一个“真实的”颜色格式。以下是我们如何使用它:

color: rgb(255 0 0);

对应显示的样式如下:

像大多数颜色格式一样,rgb是一个缩写。它代表绿色蓝。

在我们今天要学习的所有颜色格式中,rgb是最不抽象的。你的电脑/手机显示屏实际上只是数百万个微小的红色、绿色和蓝色LED的集合,它们被组装成像素。因此,rgb颜色格式允许我们直接调整这些灯光的亮度。

每个值(红色、绿色、蓝色)被称为通道。每个通道从0到255。通过将这些通道以不同的量混合,我们可以创造超过1600万种不同的颜色。

RGB颜色的巧妙之处在于它是基于光的物理学。我们可以混合红色、绿色和蓝色光来创造任何颜色。把它们调到255,我们得到白色。把它们都设为0,剩下黑色。

rgb color格式还允许我们为alpha通道指定第四个可选值,以控制透明度:

background: rgb(255 0 0 / 0.5);

以上代码设置了红色50%的透明度,最终的样式的如下:

Alpha通道的范围从0(完全不可见)到1(完全不透明)。介于两者之间的任何东西都会产生半透明的颜色。

十六进制颜色

这可能是网络上最常用的颜色格式。它看起来像这样:

color: #FF0000;

它的工作原理如下:6位十六进制码包含三个2位值,每个通道一个值(红/绿色/蓝)。它不使用10位十进制系统,而是使用16位十六进制系统。

以下图示可以更加了解十六进制代码的工作原理(原文可拖动滑块实时更新颜色):

基本上,十六进制代码与RGB值相同。在这两种情况下,我们都为红色、绿色和蓝色提供了一个值。
background: #FFFF0080;
在十进制系统中,一个两位数的值可以包含100个可能的值(10 × 10)。如果是十六进制,则总数为256(16 × 16)。因此,它实际上就像rgb()一样,我们为每个R/G/B通道指定一个介于0和255之间的值。

还有个有趣的事实如果我们想包含一个alpha通道,我们可以传递一个八位十六进制代码:

background: #FFFF0080;

代码效果图:

在本例中,我们指定80作为alpha通道,相当于十进制系统中的128。因此,这个盒子是50%不透明的。

8位十六进制代码在现代浏览器中得到了广泛应用,全球支持率达到96%,IE浏览器不支持。

HSL

到目前为止,我们看到的两种颜色格式都是基于相同基本思想的不同“包装器”:传递红/绿色/蓝通道的特定值。

但这并不是思考颜色的唯一方式!让我们来看看一个完全不同的颜色格式:HSL。

让我们从颜色选择器开始:

这个颜色选择器可能感觉更熟悉。它类似于图形设计软件中使用的图形设计软件,如Figma或Photoshop。

此颜色格式采用3种不同的值:

  • H 色相:这是我们要用的颜色,有效值的范围是0到360。我们以度为单位指定它,因为刻度是圆形的(0度和360度表示相同的红色色相)。

  • S 饱和度:有效值的范围为0%到100%。在0%时,颜色中没有色,完全是灰度级的。在100%,颜色尽可能鲜艳。

  • L 亮度:颜色有多浅/多深?有效值的范围为0%到100%。在0%时,颜色是漆黑的。在100%时,颜色为纯白色。

这往往是一个非常直观的方式来思考颜色。我们没有直接控制R/G/B光值,而是转向了更高层次的抽象,这与人类通常对颜色的看法更接近。

css中使用hsl:

background: hsl(0deg 100% 50% / 0.5);

现代色彩格式

所以,我们到目前为止看到的所有颜色格式都已经存在了很多很多年。HSL甚至早在Internet Explorer 9(2011年发布)中就支持了!

最近我们在CSS中得到了一些新的颜色格式。它们很有吸引力。让我们谈谈他们。

Display P3

这篇文章是关于颜色格式,我们用来指定颜色的语法。到目前为止,我们看到的所有真彩色格式 rgb()、十六进制代码和hsl() 都是由“标准RGB颜色空间”(通常缩写为sRGB)所约束的。

sRGB中有数百万种可能的颜色,但它并没有接近捕捉人眼能够看到的全部颜色范围。

请看下面两个红色方块:

左边的颜色是rgb(255 0 0)。它是sRGB颜色空间中最红的红色。然而,在右边,我使用的是P3颜色空间。更红了!(这两个方块看起来很有可能是一样的。如果是这样,这可能意味着您的显示器或浏览器不支持宽色域颜色格式)

P3扩展了标准的sRGB色彩空间,使我们能够获得更明亮,更鲜艳的色彩。如下图所示:

不幸的是,在CSS中,颜色空间与颜色格式相关联。如果我选择使用rgb()语法(或十六进制代码,或hsl()),我只能在sRGB颜色空间中指定颜色。

因此,如果我们想使用P3颜色,我们需要使用不同的颜色格式。语法如下:

.box {
  background: color(display-p3 1 0 0);
}

color()函数接受一个颜色空间,然后是一组R/G/B值。它使用0到1的十进制值,而不是从0到255。但目前只有主流的浏览器对color()函数支持。

LCH

我们使用HSL颜色格式创建以下两种颜色:

正如我们所看到的,这两种颜色都具有相同的50%的“亮度”值。但它们感觉不一样轻,黄色的感觉比蓝色的轻多了!

HSL颜色格式是在数学/物理之后建模的。它没有考虑到人类的感知。而且,事实证明,人类并不能非常准确地感知颜色!

LCH是一种颜色格式,旨在对人类感知一致。两种颜色具有同等的“亮度”值应该感觉同样轻!

例如,在LCH中,黄色和蓝色在55%亮度下的样子:

LCH代表“亮度 色度 色调”。“色度”或多或少是“饱和度”的同义词。它在概念上与HSL非常相似,但有两个很大的区别:

  • 如上所述,它优先考虑人类感知,因此具有相同“亮度”值的两种颜色将感觉同样亮。

  • 它不受任何特定颜色空间的约束。

与我们看到的其他颜色格式不同,LCH不绑定到sRGB。它甚至没有绑定到P3!它通过不具有色度上限来实现这一点。

在HSL中,饱和度范围从0%(无饱和)到100%(完全饱和)。这是可能的,因为我们知道我们谈论的是sRGB颜色空间,一个有限的颜色调色板。

但是LCH并没有链接到特定的颜色空间,所以我们不知道饱和度上限在哪里。它不是静态的:随着显示技术的不断改进,我们可以预期显示器将达到越来越宽的色域。LCH将自动能够通过调高色度来参考这些扩展的颜色。

background: lch(50% 120 20);

浏览器支持情况:

选择正确的颜色格式

文章的主要内容已经结束了,我们看到了许多不同的颜色格式。那么应该在工作中真正使用哪一个呢?

我建议使用HSL。至少在LCH获得广泛的浏览器支持之前。

我知道很多开发者喜欢使用十六进制代码。它们简洁,易于在设计软件和我们的代码之间复制/粘贴,并且通用。但这些好处也伴随着一些相当大的权衡。

即使你对十六进制符号很熟悉,它仍然很难直观破译。问:#0F52B7是什么颜色?#F3E248怎么样?

HSL的奇妙之处在于它是直观的。它与我们对颜色的看法密切相关。通过一些练习,当您看到hsl()值时,您将能够立即描绘任何颜色。

这意味着我们可以很容易地调整值,在运行中。我甚至不需要打开一个颜色选择器。如果我希望我的颜色稍微暗一点,我可以减少亮度百分比。如果我想让它更生动和激烈,我可以调高饱和度。

当我们将HSL与现代CSS特性相结合时,它会变得更加强大。

最后

有兴趣的可以看看原文,可以在线体验不同颜色格式是如何工作的。看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

专注前端开发,分享前端相关技术干货,公众号:南城大前端(ID: nanchengfe)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695840.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

netwox网络工具的使用【网络工程】(保姆级图文)

目录 1. 打开工具功能菜单查看某方面的模块使用搜索功能得到要使用的模块功能编号 查询模块的帮助信息总结 欢迎关注 『网络工程专业』 系列,持续更新中 欢迎关注 『网络工程专业』 系列,持续更新中 温馨提示:对虚拟机做任何设置,…

世界人工智能大会与ICDAR有何不同?

从事人工智能领域的小伙伴对世界人工智能大会和ICDAR应该都不会陌生,它们似乎都是属于研究、讨论人工智能的一种会议,但其实它们的区别还是挺大的,具体来说,它们主要有以下的区别: 一、组织性质不同 ICDAR是Internati…

《计算机系统与网络安全》 第六章 密钥管理

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

viper读取etcd热更新

概述 项目启动肯定少不了配置文件,一般我们会放在单独的目录,例如config中,有yaml、ini、json等等格式,一般用开源的读取相应问的文件映射到结构体中。 但是当一个项目秒杀频繁控制库存和限流策略等、或者其他需要频繁的变更配置…

uniapp app端常见坑

文章目录 uniapp app端常见坑页面内容出现在状态栏数据持久化问题项目初始化跳转登录页闪屏的问题 总结 uniapp app端常见坑 本文主要记录在uniapp-vite-vue3项目app端出现的常见问题 页面内容出现在状态栏 当在page.json设置 “navigationStyle”:“custom” 取消原生导航栏…

Spring进阶学习(附面试快速答法)

文章目录 1、Bean线程安全问题小总结面试快速答法 2、AOP小总结面试快速答法 3、bean的生命周期小总结面试快速答法 4、循环引用小总结面试快速答法 5、SpringMVC的执行流程小总结面试快速答法 6、Springboot自动配置原理小总结面试快速答法 7、Spring框架常见注解面…

初步学习使用Mybatis框架

mybatis框架是一款半自动的ORM持久层框架,具有较高的SQL灵活性 所谓半自动的ORM持久层框架,是因为用mybatis进行开发,需要手动编写。而全自动的ORM框架,如hibernate,则不需要编写SQL语句。 对于mybatis,就…

五、云尚办公-菜单管理

云尚办公系统:菜单管理 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!&#x…

PLC选择指南:西门子还是三菱?

选择适合自己的PLC涉及多个因素,包括项目要求、技术要求、可用性、支持和个人偏好。西门子和三菱是两个知名的PLC制造商,它们都有自己的优势和特点。以下是一些考虑因素: 我这里刚好有plc、嵌入式、单片机的资料需要的可以私我或在评论区扣6…

tp使用layui友好显示修改状态功能

之前找了很多次,然后经过自己的总结,这里记录一下 html部分 <a href"{:url(admin/merchant/make_merchant_erweima,[id>$vo[id]])}" class"layui-btn layui-btn-normal layui-btn-sm ajax-change">二维码</a> 重点是添加上ajax-change的…

别再用查询count,判断数据是否存在了

目录 一、目前多数人的写法 二、优化方案 三、总结 大家在实际的开发过程中&#xff0c;会根据某些条件&#xff0c;从数据库表中查询出是否存在符合该条件的数据。无论是刚入行的程序员小白&#xff0c;还是久经沙场多年的程序员老白&#xff0c;都是一如既往的SELECT count(*…

Faster Segment Anything: Towards Lightweight SAM for Mobile Applications

Faster Segment Anything: Towards Lightweight SAM for Mobile Applications SAM代码&#xff1a;https://github.com/ChaoningZhang/MobileSAM SAM论文&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 1 概述 Faster SAM的目标是通过用轻量级图像编码器取代笨重的图像编…

HTML点击显示、点击隐藏details 标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><details> <summary>Copyright 1999-2011.</summary> <p> - by Refsnes Da…

通过阿里云函数计算FC实现音视频转码

1.进入阿里云函数计算FC页面 2.创建音视频转码应用 可以看到代码&#xff0c;看到相关的传参 3.进行测试 编辑测试参数&#xff0c;使用账号的OSS中的资源 点击测试函数进行测试 可以在OSS中看到生成的mp4格式的视频了 测试后发现函数计算可以使用 4. 接下来就是在项目中通过代…

力姆泰克小型电动推杆LAM

小型电动推杆 高强度工程塑料的蜗轮或者粉末冶金齿轮 向下翻动查看更多 力姆泰克小型电动推杆LAM 系列大量采用铝合金壳体&#xff0c;伸缩管等零部件&#xff0c;和部分高强度工程塑料的蜗轮或者粉末冶金齿轮&#xff0c;设计开发出专门应用在医疗&#xff0c; 办公家具&am…

Linux操作系统通过实战理解CPU上下文切换

前言&#xff1a;Linux是一个多任务的操作系统&#xff0c;可以支持远大于CPU数量的任务同时运行&#xff0c;但是我们都知道这其实是一个错觉&#xff0c;真正是系统在很短的时间内将CPU轮流分配给各个进程&#xff0c;给用户造成多任务同时运行的错觉。所以这就是有一个问题&…

Redis实战案例3-缓存概念和添加Redis缓存

1. 缓存 缓存是数据交换的缓冲区&#xff0c;是贮存数据的临时地方&#xff0c;一般读写性能较高&#xff1b; 其中数据库缓存&#xff0c;例如&#xff1a;索引数据&#xff0c;MySQL会给id创建索引&#xff0c;从而查询时可以在内存中快速检索&#xff0c;提升速度&#xff1…

MDK指定.sct(分散加载描述文件)文件位置

文章目录 MDK指定.sct(分散加载描述文件)文件位置概述END MDK指定.sct(分散加载描述文件)文件位置 概述 用STM32CubeMX生成的工程, 默认的.sct位置在临时输出目录, 里面都是.o. 都是工程编译时生成的临时文件(中间文件) 当工程归档时, 这个临时目录肯定是要删除的(编译过程…

用ThinkJs框架快速搭建博客网站

ThinkJS是一个企业级的NodeJS应用框架&#xff0c;整合了各种常用SDK以及企业级常用的技术方案&#xff0c;为减少了开发人员的学习成本&#xff0c;提高团队的开发效率而生。框架底层基于Koa2实现&#xff0c;并且结合ThinkPHP的思想&#xff0c;使代码更加简洁实用。 ThinkVu…

Dependency ‘io.spring.platform:platform-bom:Cario-SR7‘ not found

刚看到这个错的时候&#xff0c;以为是maven中需要配置aliyun镜像的缘故&#xff0c;所以&#xff0c;在/conf/settings.xml中加入了aliyun镜像&#xff1a; <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al…