CSS背景颜⾊设置透明度的两种⽅法(8位hex和rgba)
⽬录
在写⼩程序的时候,有个需求是按背景颜⾊ background-color要设透明度0.85,让背景图⽚ background-image透⼀点出来,⽽且background-color的值是后端传过来的动态数据,背景颜⾊动态改变,UI同学给的数据全是6位HEX,需要我⾃⼰设置透明度。
设置透明度⾸先会想到⽤opacity,但 opacity 会把被设置的元素及其⼦元素同时设置为同⼀个透明度,我需要⼦元素不透明,opacity就不能⽤了。
接下来讲两个实际可⽤性⽐较⾼的⽅法,以下两种⽅法都在chrome和⼩程序上亲测可⽤:
⼀、 6位HEX转RGBA
rgba的alpha值可以设透明度⽽不影响⼦元素。但是UI同学给的⼏百个数据都是6位hex,所以需要我⾃⼰⼿动把6位hex格式转成rgb格式,再加上alpha值0.85写成rgba(x, x, x, 0.85)。
其实hex转rgb就是⼗进制转⼗六进制,最简单的办法就是⽤JS原⽣的parseInt() 函数帮我们做转换。以下是:
parseInt(string, radix) 将⼀个字符串 string 转换为 radix 进制的整数, radix 为介于2-36之间的数。
如果 radix 是 undefined、0或未指定的,JavaScript会假定以下情况:
1. 如果输⼊的 string以 "0x"或 “0x”(⼀个0,后⾯是⼩写或⼤写的X)开头,那么radix被假定为16,字符串的其余部分被解析为⼗六进制数。
2. 如果输⼊的 string以 “0”(0)开头, radix被假定为8(⼋进制)或10(⼗进制)。具体选择哪⼀个radix取决于实现。ECMAScript 5 澄清
了应该使⽤ 10 (⼗进制),但不是所有的浏览器都⽀持。因此,在使⽤ parseInt 时,⼀定要指定⼀个 radix。
3. 如果输⼊的 string 以任何其他值开头, radix 是 10 (⼗进制)。
根据说明,我们有两种⽅式hex转rgb,可以parseInt(hex.slice(x, x+2), 16); 也可以parseInt('0x'+hex.slice(x, x+2))。最后再设置0-1或者百分数的alpha值,就顺利转好rgba了,以下是完整代码:
// 颜⾊格式 hex 转 rgba
const hexToRgba = (bgColor) => {
let color = bgColor.slice(1);  // 去掉'#'号
let rgba = [
parseInt('0x'+color.slice(0, 2)),
parseInt('0x'+color.slice(2, 4)),
补水效果最好的面膜parseInt('0x'+color.slice(4, 6)),
0.85
];
return 'rgba(' + String() + ')';
};
最后的String() 函数不带参数指定分隔号,会默认⽤逗号分隔,正好是我们想要的。
⼆、8位HEX
要不是这个需求,我还不知道早在2014年就推出8位hex和4位hex来⽀持设置alpha值,以实现hex和rgba的互转。这个办法可⽐6位HEX 转RGBA简洁多了,先来简单解释⼀下:
8位hex是在6位hex基础上加后两位来表⽰alpha值,00表⽰完全透明,ff表⽰完全不透明。
8 digits
The first 6 digits are interpreted identically to the 6-digit notation.
The last pair of digits, interpreted as a hexadecimal number, specifies the alpha channel of the color, where ‘00’represents a fully transparent color and ‘ff’ represent a fully opaque color.
In other words, #0000ffcc represents the same color as rgb(0 0 100% / 80%) (a slightly-transparent blue).
同理,4位hex是在3位hex基础上加后⼀位来表⽰alpha值,0表⽰完全透明,f表⽰完全不透明。
nice什么意思
4 digits
This is a shorter variant of the 8-digit notation, “expanded” in the same way as the 3-digit notation is. The first digit, interpreted as a hexadecimal number, specifies the red channel of the color, where 0 represents the minimum value and f represents the maximum. The next three digits represent the green, blue, and alpha channels, respectively.
交九是几月几号2021年⽐如以下三种写法表⽰的是同个颜⾊:
.element {
background: rgba(0, 255, 0, 0.53);  // rgba
background: #0f08;      //4位hex
小小彬个人资料background: #00ff0088;    //8位hex
}
以下是摘⾃⽂章的alpha值的⼗进制和⼗六进制对照表:
Alpha %Hex Rgb 255
100%FF255
95%F2242
90%E6230
85%D9217
圣诞节祝福
80%CC204
75%BF191
70%B3179
65%A6166
60%99153
55%8C140
50%80128
45%73115
40%66102
35%5989
30%4D77
25%4064
20%3351
15%2638
10%1A26
汤灿被执行死刑原因5%0D13
0%000
根据以上表,我在6位HEX后⾯加上字符串D9就能轻松搞定背景颜⾊设置透明度85%的需求了~
觉得有⽤的请点个赞,谢谢⼤家的观看~转载请带本⽂链接,谢谢!