CSS 颜色设置透明度的新姿势

news2024/12/22 23:22:22

在 CSS 中,我们有很多种方式为元素设置透明度,常见的是给元素设置透明度和给颜色设置透明度,不同的方式将会带来不一样的效果。那么今天,我们就一起来聊聊 CSS 中的不透明度。感兴趣的同学,请继续往下阅读。

设计中的透明度

我们先从设计中开始。就拿 Figma 这样的设计软件来举例。设计师在给一个对象设置透明度,往往会有以下几种方式:

865a60fcde3b090c80f2c7f287e6ff43.jpeg

这两种方式中,第一种就是给整个对象(或图层)设置 opacity ,即:

.element {
    background: #D9D9D9;
    opacity: 0.5;
}

第二种是给元素背景颜色设备透明度,例如:

.element {
    background: rgb(217  217 217 / 0.5);
}

它们不同之处是,opacity 属性会将整个元素设备透明度,包括它的所有 UI 样式,比如背景颜色(background-color)、文本颜色(color)和边框(border)等。而 rgb() 只是调整背景颜色的透明度。

从这一点而言,如果我们要给元素的 UI 颜色设置透明度时,不应该使用 opacity 属性,更应该使用带有透明度的颜色值。

给颜色设置透明度

在 CSS 中,可以用于设置颜色的函数有很多种,比如我们熟悉的 rgb() 、hsl() ,包括后面新出的颜色函数 hwb() 、lab() 、lch() 、oklab() 和 oklch() 等,都可以显式指定透明通道的值。例如:

:root {
    --opacity-in-rgb: rgb(0 0 0 / .5);
    --opacity-in-hsl: hsl(0deg 0% 0% / 50%);
    --opacity-in-hwb: hwb(0deg 0% 100% / 50%);
    --opacity-in-lab: lab(0 0 0 / 0.5);
    --opacity-in-lch: lch(0 0 0 / 0.5);
    --opacity-in-oklab: oklab(0 0 0 / 0.5);
    --opacity-in-oklch: oklch(0 0 0 / 0.5);
    --opacity-in-color: color(display-p3 0 0 0 / 0.5);
}

包括十六进制 HEX 的颜色,也可以用来描述带有透明度的颜色,例如:

:root {
    --opacity-in-hex: #00000080;
}

但它们有一个共同的特性,那就需要知道各个颜色函数对应的颜色通道的值。这是一个极为不方便的地方。换句话说,如果有一种方式,可以将一个颜色直接转换成带有透明通道的颜色值,对于 Web 开发者是不是要方便的多。假设你的品牌色是一个十六进制的颜色(比如, #09face),现在你需要给该颜色添加 50% 的透明度。按照以往的方式,你需要知道 0% ~ 100% 之间对应的十六进制硬编码,或者将十六进制转换为其他描述颜色的函数,例如 rgb() 或 hsl() 等。

庆幸的是,CSS 新增的一些颜色函数功能,可以让事情变得简单地说。比如相对颜色、混合颜色等。

相对颜色

我个人更喜欢相对颜色的语法。使用此语法,你只需要在相应的颜色函数中使用 from 关键词,该关键词可以为你解构颜色模型,以便你可以在该颜色模型中调整颜色,比如设置颜色透明度:

:root {
    --brand-color: #09face;
}

.element {
    color: rgb(from var(--brand-color) r g b / 50%);
    color: hsl(from var(--brand-color) h s l / 50%);
    color: hwb(from var(--brand-color) h w b / 50%);
    color: lch(from var(--brand-color) l c h / 50%);
    color: lab(from var(--brand-color) l a b / 50%);
    color: oklab(from var(--brand-color) l a b / 50%);
    color: oklch(from var(--brand-color) l c h / 50%);
}

96690078db725f6be3421845f34a256c.jpeg

Demo 地址:https://codepen.io/airen/full/KKrPPYe (请使用 Safari 浏览器查看)

在上面的示例中,我使用了十六进制来描述品牌色,并应用了 50% 的透明度。在所有颜色模型中,结果都相同。我认为这看起来很好。

不幸的是,相对颜色语法到目前为止(写这篇文章时)也只得到了 Safari 浏览器的支持。

更为有意思的是,颜色相对语法还可以使用 calc() 函数,对颜色各个部分进行调整,例如:

.add-opacity {
    --original-collor: #09face;

    background: rgb(from var(--original-collor) r g b / 50%);
    background: hsl(from var(--original-collor) h s l / 50%);
    background: oklch(from var(--original-collor) l c h / 50%);
    background: hwb(from var(--original-collor) h w b / 50%);
    background: lab(from var(--original-collor) l a b / 50%);
    background: lch(from var(--original-collor) l c h / 50%);
}

26b598e3501ceaa0f99a8da0d6e634f2.jpeg

Demo 地址:https://codepen.io/airen/full/jOevEeB (请使用 Safari 浏览器查看)

CSS color-mix() 函数

有意思的是,CSS 的 color-mix() 也可以用来调整颜色的不透明度。假设你要创建品牌颜色的半透明版本,你可以使用 transparent 与品牌色混合,并起调整 transparent (透明颜色)的混合比例。它看起来有点像这样:

:root {
    --brand-color: #8832CC;
    
    --brand-color-a10: color-mix(in oklch, var(--brand-color), transparent 90%);
    --brand-color-a20: color-mix(in oklch, var(--brand-color), transparent 80%);
    --brand-color-a30: color-mix(in oklch, var(--brand-color), transparent 70%);
    --brand-color-a40: color-mix(in oklch, var(--brand-color), transparent 60%);
    --brand-color-a50: color-mix(in oklch, var(--brand-color), transparent 50%);
    --brand-color-a60: color-mix(in oklch, var(--brand-color), transparent 40%);
    --brand-color-a70: color-mix(in oklch, var(--brand-color), transparent 30%);
    --brand-color-a80: color-mix(in oklch, var(--brand-color), transparent 20%);
    --brand-color-a90: color-mix(in oklch, var(--brand-color), transparent 10%);
}

f86fbbb1411ad5171e00e5b4e10cf985.jpeg

Demo 地址:https://codepen.io/airen/full/eYPXPrZ

通过这种方式使用 color-mix 函数,你可以保留品牌颜色的同时还可以进行透明度的调整。同样,相对颜色语法确实是为此而设计的,但是使用 color-mix() 也很酷。

小结

CSS 的相对颜色和 color-mix() 都是 CSS 颜色的新特性,在这里我们利用这些新特性,帮助我们更好的给颜色设置透明度。

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

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

相关文章

尺度悖论:数据分析必须警惕的坑

I. 尺度悖论的概述 尺度悖论是指在某些系统或现象中,尺度的大小或范围会对其性质、行为或理解产生矛盾或困难的现象。尺度悖论常出现在自然科学、社会科学和哲学等领域中,引发了一系列有关尺度和尺度变化对系统行为的影响的研究。 II. 举3个简单的例子…

Qt编写视频监控系统78-视频推流到流媒体服务器

一、前言 视频推流作为独立的模块,目前并没有集成到视频监控系统中,目前是可以搭配监控系统一起使用,一般是将添加好的摄像头通道视频流地址打开后,读取视频流重新推到流媒体服务器,然后第三方可以从流媒体服务器拉取…

接口幂等性——防止并发重复插入数据

接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景: 有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。…

chatgpt赋能python:Python如何变为列表

Python如何变为列表 Python是一种高级编程语言,用于快速、轻松地编写软件。它的语法简洁、易于学习,可以用于各种领域,包括Web开发、机器学习和数据科学等。其中,列表是Python的一种基本数据类型,它用于存储一系列相关…

聚观早报 | 皮克斯十年来首次大规模裁员;OpenAI网站访问量大增

今日要闻:皮克斯十年来首次大规模裁员;OpenAI网站访问量大增;华为版ChatGPT将于7月初发布;苹果Siri或将迎来重大调整;罗斯柴尔德减持英伟达 皮克斯十年来首次大规模裁员 迪士尼公司旗下皮克斯动画工作室已裁员 75 人&…

西门子PLC与IO模块之间无线PROFINET通信

在实际系统中,一个车间内PLC与多个IO信号点需要建立通讯,从而提高工作效率,通常距离在几十米到上百米不等。在有通讯需求的时候,如果布线的话,工程量较大且不美观,这种情况下比较适合采用无线通信方式。本方…

百城巡展 | 人大金仓5月联合伙伴释放数字活力奏响发展强音

5月下旬,人大金仓“百城巡展”走过贵阳、苏州、南宁,吸引线上线下逾4400人参与,得到用户和伙伴的高度认可;并携手东软集团股份有限公司、云上比格(贵州)大数据有限公司、数字广西集团有限公司、用友网络科技…

推荐 5 个好玩儿的小项目

近期,每日的开源项目热榜都是 ChatGPT 相关、AI 相关的。说实话,老逛看的也头疼,本期推荐几个不一样的,好玩的小项目。 本期推荐开源项目目录: 1. 在你的 Windows 养小猫 2. 把你的图片生成 ASCII 3. 中国制霸生成器 4…

初始JavaScript

JavaScript 的作用 表单动态验证(密码强度检测)(js产生的最初的目的)网页特效服务端开发(Node.js)桌面程序(Electron)App (Cordova)控制硬件-物联网(Ruff)游戏开发(coco…

chatgpt赋能python:Python如何将字符串首字母大写

Python 如何将字符串首字母大写 在编程中,字符串操作是不可避免的,而往往需要将字符串的首字母大写,例如在处理用户名、标题等信息时,这样做可以提高可读性和美观性。Python作为一种高效、易学易用的编程语言,有很多内…

webpack零基础入门

一、什么是webpack Webpack 是一个现代的 JavaScript 应用程序静态模块打包器 (module bundler)。 它是一个开源的前端工具,可以将各种资源文件(JS、CSS、图片、字体等)打包成一个或多个包,并且能够通过配置选项来实现各种构建需…

基于SpringBoot+Vue的招聘信息管理系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

Final-v2

算法的定义和特征 什么是算法? 算法是求解某一特定问题的一组有穷规则的集合,它是由若干条指令组成的有穷符号串。 算法的五个重要特性: 确定性:每一条指令都必须有确切的含义。不存在二义性,只有一个入口和出口。可…

基于SpringBoot+Vue的考研资讯平台设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

2023智源大会议程公开丨视觉与多模态大模型论坛

6月9日,2023北京智源大会,将邀请AI领域的探索者、实践者、以及关心智能科学的每个人,共同拉开未来舞台的帷幕,你准备好了吗?与会知名嘉宾包括,图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主Ge…

元组的学习笔记

列表 [] 单身什么是字典 {} 二人世界 python内置的数据结构之一,与列表一样是一个可变序列(可以增删改操作的) 以键值对的方式存储数据,字典是一个无序的序列 -> hash(key) 通过哈希函数来计算存储位置,key一定是不可变的字典的创建 使用花…

国内免费的ChatGPT镜像网址(ChatGPT国内镜像网站大盘点)

ChatGPT 以其强大的信息整合和对话能力惊艳了全球,在自然语言处理上面表现出了惊人的能力。这么强大的工具我们都想体验一下,那么今天就分享几个ChatGPT国内的镜像网址,大家可以直接使用! 1.AiChat 网址入口 多角色多功能可玩性高…

IIC协议——OLED屏幕

1.IIC协议介绍 IIC全称Inter-Integrated Circuit (集成电路总线) 简称I2C 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式 特点 简单性和有效性 由于接口直接在组件之上,因此IIC总线占用的空…

超好用万能提示词框架,ChatGPT效率翻三倍!

前几天写了几篇自己的AI实践: 《程序员,如何借力ChatGPT?》 《普通人,如何借力ChatGPT?》 《我认为,最好用的AI工具是它》 《如何借力AI工具做PPT》 很多朋友在后台留言,问我应该如何写高质量的…

云原生Docker网络管理

Docker网络 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0), Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP, 同时Docker网桥是每个容器的默认网关。 …