CSS十六进制RGBA是什么?

297

我知道你可以编写JavaScript代码来检测用户是否正在使用AdBlock,但是有没有一种方法可以通过CSS样式表来实现这一点?


我知道你可以写JavaScript来检测用户是否正在使用AdBlock,但能否通过CSS样式表来实现同样的功能呢?
background-color: #ff0000;

如果你想要某件红色的东西。

而且你可以编写...

background-color: rgba(255, 0, 0, 0.5);

如果你想要一种红色且半透明的颜色,可以使用以下方式简洁地编写十六进制代码:

有没有一种简洁的方式来编写部分透明的十六进制颜色?我希望得到这样的颜色:

background-color: #ff000088; <--- the 88 is the alpha

... 或者 ...

background-color: #ff0000 50%;

我得到的所有颜色都是十六进制的,将它们全部转换为0-255的十进制范围很烦人。


2
你可以尝试不同的符号表示法,但我没有成功。令人惊讶的是,八进制表示法似乎有点奏效。rgb(0100, 0200,0300)#4080C0 - yunzen
2
正如Slomojo所建议的,在LESS中,您可以使用background-color: #ff0000 + rgba(0, 0, 0, .8);来转换十六进制,并仍然应用透明度,但是这不能使用本机CSS完成。 - fl3x7
3
为了完整起见,正如Slomojo和fl3x7所讨论的那样,这在Sass中很容易实现:background-color: opacify(#ff0000, 0.5);background-color: transparentize(#ff0000, 0.5); 您也可以将Sass十六进制颜色变量提供给这些Sass函数。 - Adam Caviness
@fl3x7 我尝试使用LESS的 #ff0000 + rgba(0,0,0,0.8);,但是没有成功。结果仍然是十六进制。可能是浏览器的问题。不过,在LESS中有一个可以工作的淡入函数。请参考我的回答下方。 - Julian Mann
2
可能是带有Alpha通道的颜色的十六进制表示?的重复问题。 - thelem
显示剩余5条评论
15个回答

171

CSS Color Module Level 4可能支持4和8位十六进制RGBA表示法!

三周前(2014年12月18日),CSS Color Module Level 4编辑草案提交给CSS W3C工作组。尽管处于易受更改的状态,但当前版本的文档暗示着在不久的将来,CSS将支持4和8位十六进制RGBA表示法。

注:以下引用的内容已经剪去了无关的部分,并且在您阅读本文时,源文件可能已经被大量修改(如上所述,这是一份编辑草案而不是最终文件)。如果情况发生了很大变化,请留下评论让我知道,以便我更新这个答案!

§ 4.2. RGB十六进制表示法:#RRGGBB

<hex-color>的语法是一个<hash-token>标记,其值由3、4、6或8个十六进制数字组成。换句话说,十六进制颜色写成一个井号字符"# ",后跟一些数字0-9或字母a-f(字母的大小写不重要 - #00ff00#00FF00相同)。

8位

前6位与6位表示法完全相同。最后一对数字表示颜色的alpha通道,其中00表示完全透明的颜色,ff表示完全不透明的颜色,解释为十六进制数。

示例3
换句话说,#0000ffcc表示与rgba(0, 0, 100%,80%)相同的颜色(略带透明的蓝色)。

4位

这是8位表示法的缩写版本,以与3位表示法相同的方式“扩展”。第一个数字表示颜色的红色通道,其中0表示最小值,f表示最大值。接下来的三个数字分别表示绿色、蓝色和alpha通道。

这对CSS颜色的未来意味着什么?

这意味着,假设这不是完全从Level 4文档中删除的,我们很快就能在支持Color Module Level 4语法的浏览器中以十六进制格式定义RGBA颜色(或HSLA颜色,如果你是那些人之一)。

示例

elem {
    background: rgb(0, 0, 0);           /* RGB notation (no alpha). */
    background: #000;                   /* 3-digit hexadecimal notation (no alpha). */
    background: #000000;                /* 6-digit hexadecimal notation (no alpha). */
    background: rgba(0, 0, 0, 1.0);     /* RGBA notation. */

    /* The new 4 and 8-digit hexadecimal notation. */
    background: #0000;                  /* 4-digit hexadecimal notation. */
    background: #00000000;              /* 8-digit hexadecimal notation. */
}

这个功能什么时候可以在我的客户端产品中使用?

只有风滚草才是真正的回答......

开玩笑的:目前是2015年初,所以这些颜色标记在任何浏览器上都不会得到支持 - 即使您的产品只设计为在最新的浏览器上工作,您也很可能不会很快在生产浏览器中看到它们的效果。

查看#RRGGBBAA颜色标记的当前浏览器支持情况

然而,CSS的工作方式意味着我们实际上可以从今天开始使用这些!如果您真的想立即开始使用它们,只要添加一个回退,任何不支持的浏览器将简单地忽略新属性,直到它们被视为有效:

figure {
  margin: 0;
  padding: 4px;
  
  /* Fall back (...to browsers which don't support alpha transparency). */
  background: #FEFE7F;
  color: #3F3FFE;
  
  /* Current 'modern' browser support. */
  background: rgba(255, 255, 0, 0.5);
  color: rgba(0, 0, 255, 0.75);
  
  /* Fall... foward? */
  background: #ffff007F; /* Or, less accurately, #ff08 */
  color: #0000ffbe;      /* Or #00fc */
}
<figure>Hello, world!</figure>

只要您使用支持CSS中background和color属性的浏览器查看此答案,上面代码段中的
元素将非常类似于以下内容:Code Snippet Result Image。我们使用Windows上Chrome的最新版本(v39.0.2171)来检查
元素,我们将看到以下内容:Element Inspector Example。六位十六进制回退被rgba()值覆盖,并且我们的八位十六进制值被忽略,因为它们目前被Chrome的CSS解析器视为无效。一旦我们的浏览器支持这些八位十六进制值,它们将覆盖rgba()值。更新2018-07-04:Firefox、Chrome和Safari现在都支持这种表示法,Edge仍然缺失,但可能会跟随(https://caniuse.com/#feat=css-rrggbbaa)。

2
我记得最近一年左右在邮件列表中提到过这个问题(拥有4位/8位十六进制的想法并不新鲜)。很高兴看到它现在已经进入了Colors 4。 - BoltClock
@BoltClock 希望它也能留在这里! - James Donnelly
1
Firefox Nightly 刚刚实现了这个 :) - Nebula
这里出现的图片是什么?它已被“iStock”占位符替换了。 - Alex Reinking
@AlexReinking,由于某些愚蠢的原因,我的工作阻止了Stack Overflow的图像主机。我想,这应该是一张风滚草的图片。 - James Donnelly
显示剩余4条评论

110

在我发布增强问题后,我找到了答案。抱歉!

MS Excel 帮助解决了问题!

只需向十六进制颜色值添加 Hex 前缀即可添加等效不透明度的 alpha 值。

(在 rbga 中,百分比不透明度表示为小数,如上所述)

Opacity %   255 Step        2 digit HEX prefix
0%          0.00            00
5%          12.75           0C
10%         25.50           19
15%         38.25           26
20%         51.00           33
25%         63.75           3F
30%         76.50           4C
35%         89.25           59
40%         102.00          66
45%         114.75          72
50%         127.50          7F
55%         140.25          8C
60%         153.00          99
65%         165.75          A5
70%         178.50          B2
75%         191.25          BF
80%         204.00          CC
85%         216.75          D8
90%         229.50          E5
95%         242.25          F2
100%        255.00          FF

1
不太理解。您的意思是 #FF00000C 等同于 rgba(255,0,0,0.05) 吗? - yunzen
这是一个前缀而不是后缀。这意味着您需要将其添加到6位十六进制颜色值的前面,例如#000000变成#7F000000 - T9b
@PointedEars 两点都错了。OP没有特别提到CSS3,而且我认为这个问题可能更与IE特定的问题有关,我们都知道这些问题很难解决。尽管如此,IE在其CSS中使用CSS和十六进制透明度值。 - T9b
9
@T9b 无稽之谈。OP有一个有关RGBA值的CSS问题。在CSS3之前,CSS中没有RGBA支持。如果IE/MSHTML支持您的符号表示法,则这是专有的,不兼容且本质上不可靠的。而且您肯定不建议使用客户端脚本使该符号表示法起作用,对吗?因为那也不兼容且同样不可靠。 - PointedEars
3
仅供参考,自2022年8月1日起,RGBA现在已被大多数浏览器支持。 - ocodo
显示剩余2条评论

45

4
我很兴奋地看到这个,然后在Chrome 55的开发者工具上尝试了一下。但是不行,它报错说属性值无效... ¯\_(ツ)_/¯ - ericsoco
1
看起来它有各种问题,这里是该功能的状态页面。 - Billy
Chrome已经移除了支持,Safari和Firefox仍然支持,请勿使用。 - Case
10
截至2019年7月,全球84.5%的浏览器支持此功能。https://caniuse.com/#search=rrggbbaa - André Kuhlmann
2
我认为它在最新的Chrome版本中再次正常工作:版本95.0.4638.54(官方构建)(x86_64)。 - Zargold

27
RGB='#ffabcd';
A='0.5';
RGBA='('+parseInt(RGB.substring(1,3),16)+','+parseInt(RGB.substring(3,5),16)+','+parseInt(RGB.substring(5,7),16)+','+A+')';

var rgb = '#ffabcd'; var a = '0.5'; var matches = rgb.match(/#([\da-f]{2})([\da-f]{2})([\da-f]{2})/i); var rgba = 'rgba(' + matches.slice(1).map(function(m) { return parseInt(m, 16); }).concat(a) + ')'; - PointedEars
5
如果你来自 React 的世界: <div style={ { backgroundColor: `rgba(${ parseInt(color.substring(1,3),16) }, ${ parseInt(color.substring(3,5),16) }, ${ parseInt(color.substring(5,7),16) }, 0.5)` } }></div> 翻译为: 如果你之前的开发经验主要是 React: <div style={ { backgroundColor: `rgba(${ parseInt(color.substring(1,3),16) }, ${ parseInt(color.substring(3,5),16) }, ${ parseInt(color.substring(5,7),16) }, 0.5)` } }></div> 这行代码表示一个带有半透明背景色的 div 元素。 - Atul Yadav
你可以使用这个工具进行转换 - https://kilianvalkhof.com/2016/css-html/css-hexadecimal-colors-with-transparency-a-conversion-tool/ - Vadim Kotov

23

Sass有redgreenblue三个通道可以从十六进制颜色中提取:

background-color: rgba(red($hex_color), green($hex_color), blue($hex_color), 0.2);

Sass还具有rgba($hex_color, $alpha)


11
SASS 支持使用 rgba($color, .2) 设置背景色。 - djibe
23
这些不是有效的CSS方法 - 你应该提到。 - Piotr Karbownik

16

1
这是用于Sass的。 - Steven Vachon
1
缺点是,原始颜色 - #ff0000 - 被修改,结果被放置在最终的CSS文件中。这使得无法通过例如CSS3变量来控制alpha通道。 - Igor

14

28
#ffffff(六位十六进制数)实际上是一个24位的颜色值;0xFFFFFFFF实际上是2³²-1,可以表示为无符号32位整数。我认为#ffffffff(八位十六进制数)没有被指定的原因是CSS颜色基于sRGB颜色空间,并且八位十六进制数的表示法在支持32位颜色深度的显示设备中会产生歧义。请记住,仍然存在#fff,它在8位(256种颜色)和16位(65536或64K种颜色)颜色深度下都表示rgb(100%,100%,100%) - 白色。 - PointedEars
5
实际上,这正是32位整数所能容纳的。2个十六进制数字可以存储与8个二进制数字相同数量的值。或者……8个十六进制数字可以存储与32个二进制数字相同数量的值。 - Pijusn
虽然没有主要原因 CSS 函数不应该从一开始就这样设计(以及 rgba(0.0,0.5,1.0) 浮点数用于正常匹配其他颜色函数)。至于 32 位显示器颜色支持,这在 6 位 RGB 中本来就不存在,真的是一个特例。我对学习不同格式并没有问题,但有些情况下你可能会得到十六进制的动态颜色,并需要在运行时创建 CSS。这需要将其从十六进制转换为十进制,如果您想添加 alpha,则很麻烦。 - Beejor

8
抱歉,那是不可能的。你所了解的rgba格式是唯一的。

1
@mdmullinax:但是谁会在HSL符号中指定十六进制颜色呢? - BoltClock
1
我将生活中的一切都与HSLA符号关联起来,这是一种视觉通感的版本 :) - MikeM
@mdmullinax:哦,那真的很棒! - BoltClock
6
这可能会让你高兴,如果你还没有看到的话:http://mothereffinghsl.com - BoltClock
@BoltClock 我喜欢那个网站,Paul Irish很棒。 - MikeM
@BoltClock - 我使用HSL已经有一段时间了。不是在所有情况下都使用,但在一些情况下使用。比RGB更方便。 - Rob

7

如果您所有颜色都在HEX变量中,您可以使用以下SCSS代码:

首先,复制此映射,从rgba - 不透明度值到十六进制代码:

    $opacity-to-hex: (
    0: '00',
    0.05: '0C',
    0.1: '19',
    0.15: '26',
    0.2: '33',
    0.25: '3F',
    0.3: '4C',
    0.35: '59',
    0.4: '66',
    0.45: '72',
    0.5: '7F',
    0.55: '8C',
    0.6: '99',
    0.65: 'A5',
    0.7: 'B2',
    0.75: 'BF',
    0.8: 'CC',
    0.85: 'D8',
    0.9: 'E5',
    0.95: 'F2',
    1: 'FF'
)

接下来复制以下使用映射的mixin:

@mixin color-opacity($property, $color, $opacity) {
    #{$property}: unquote($color + map-get($opacity-to-hex, $opacity));
}

最后但并非不重要的是,您可以在所有颜色属性上使用这个mixin与映射的不透明度,例如像这样:
@include color-opacity('background-color', $your_hex_color, 0.8);
@include color-opacity('color', $your_hex_color, 0.5);

6
如果您可以使用LESS,那么有一个渐变功能。
@my-opaque-color: #a438ab;
@my-semitransparent-color: fade(@my-opaque-color, 50%);

background-color:linear-gradient(to right,@my-opaque-color, @my-semitransparent-color); 

// result: 
background-color: linear-gradient(to right, #a438ab, rgba(164, 56, 171, 0.5));

3
sass/scss有一个等效的函数:rgba(base-color, 0.5) - LocustHorde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接