CSS半透明总结
opacity 属性
CSS 中的 opacity
属性用于给元素指定一个 0 (全透明) 至1 (不透明) 的透明度值,但是这个值会应用到覆盖在背景之上的元素。
兼容性如下:
Chrome | FireFox | Internet Explorer | Opera | Safari |
---|---|---|---|---|
1.0 | 1.0 | 9.0 | 9.0 | 1.2 |
IE中的半透明
在 IE8 及早期版本的 IE 中,需要使用 IE 系私有的 filter 属性处理,其中分别有三种方式:
filter: alpha(opacity=value);
[1]filter: "alpha(opacity=value)";
[2]-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)";
[3]filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
[1] 直到 IE9 才支持 opacity
属性,但是在之前的版本中都使用支持 filter
替代,并且在IE中使用 filter
属性实现透明的元素需要触发 hasLayout 使其具备 layout 特性。
[2] 据说在 IE8 标准模式中,filter
属性的值需要使用引号包裹起来。
[3] IE4-IE9 中支持的一种扩展形式的编写方式。
[4] IE 中介绍了 -ms-filter
,实质上只是 filter
属性的一个代名词。在 IE10 中不再存在。
前缀
FireFox 0.9 之前使用 -moz-opacity
实现,之后便重命名为 opacity
。 但之后 -moz-opacity
一直都作为 opacity
的别名存在。但是 FireFox 3.5 之后不再支持 -moz-opacity
属性,此时也移除了在 JavaScript 中支持的 MozOpacity
属性。据说在 FireFox 早期版本中 opacity
属性的实现取决于其 Gecko 的版本。
在早期发布的 Safari 1.2 中支持 -khtml-opacity
的方式实现半透明。
Konqueror 从不支持 -khtml-opacity
的形式,而是从 4.0 开始便支持 opacity
。
应用
在实际应用中,由于 opacity
/filter
的透明度会应用于子元素,因而常见的的做法是使用两个毗邻的元素,一个用于处理背景层,一个用于处理前景的内容层。其中背景层的要层叠在内容层底部,使用定位的方式便可以实现。示例:
1 | .bg { |
1 | <div class="content">内容</div> |
RGBA
CSS 2.1 中开始支持 RGB 色彩值,CSS3 中为 RGB 色彩添加了 Alpha 通道。可以用于处理 alpha 渲染和 alpha 合成[据说 alpha 与 RGBA 是有故事的]。RGBA 允许将元素设置为透明,但不影响子元素。
1 | .selector { |
RGBA兼容性
Chrome | FireFox | Internet Explorer | Opera | Safari | iOS(Safari) |
---|---|---|---|---|---|
All | 3.0 | 9.0 | 10.x+ | 3.x+ | All |
IE中的RGBA
IE9 之前的 IE 版本不支持 RGBA,可以使用一个私有的 CSS 滤镜实现 RGBA 的效果。[IE 中的 : ARGB 啦] 示例代码:
1 | .selector { |
DXImageTransform.Microsoft.gradient 滤镜中的 startColorstr 参数值是 #AARRGGBB 形式的,其中 AA 便是代表不透明度 (Alpha 通道值) 的十六进制表示,其中 00 表示全透明,FF 表示完全不透明,转化为十进制便是 0~255 范围之间的值,剩下的六位便是 RRGGBB 颜色的十六进制代码。
Alpha计算方式: x = value*255/10
-> 再转换为十六进制。
应用
RGBA 可应用于 background,border 属性中,在早期版本的 FireFox 中 border 的拐角处的 rgba 会叠加。[测试在 FireFox17 中不再出现叠加的现象]。
在 IE9 中,已经支持 RGBA 形式,但是同时也支持 filter 形式。因此需要使用 hack 的方式清除 filter 形式。
1 | :root .selector { |
转换函数
这里提供一个 RGBA 值转换为 ARGB 的函数:
1 | /* |