欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CSS3中使用RGBa来调节透明度的教程

程序员文章站 2023-11-15 11:45:58
这篇文章主要介绍了CSS3中使用RGBa来调节透明度的教程,RGBA是RGB色彩模型的一个扩展,这个缩写词代表红绿蓝三原色的首字母,Alpha值代表颜色的透明度或者说不透明度,需要的朋友可以参考... 16-05-09...

在 css3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity 已被主流的现代浏览器支持,但 opacity 会把被设置的元素及其子元素同时设置为同一个透明度,这样的透明规则相当不灵活,在实际开发中往往也是会遇到很多麻烦。其实,在 css3 中还有另外一套颜色透明解决方案 —— rgba 。相对于 opacity ,rgba 可以在单个元素上设置透明度,而不影响其子元素,只是 rgba 的浏览器支持度并没有 opacity 的广泛,因此相对较少引起开发者注意。

rgba(r,g,b,a)
取值:
r:红色值。正整数 | 百分数
g:绿色值。正整数 | 百分数
b:蓝色值。正整数 | 百分数
a:alpha透明度。取值0~1之间。
下面是用rgba() 设置50%透明度的白色.

css code复制内容到剪贴板
  1. p {   
  2. color: rgba(255, 255, 255, 0.5);   
  3. }  

rgba是rgb色彩模型的一个扩展。这个缩写词代表红绿蓝三原色的首字母,alpha值代表颜色的透明度/不透明度。

下面开始详细介绍 rgba 颜色。


一. rgba 颜色基础
rgba 在本质上看也是为设置的元素增加了一个 alpha 通道,即在红色、绿色、蓝色三种颜色通道之外增加一个代表透明度的通道,其中 rgb 值使用我们熟悉的用3个 0 到 255 的整数分别表示红色、绿色、蓝色,而 alpha 取值则为 0 到 1 (小数位一位)。下面例举一个例子说明其具体的使用方式:

在 css 2.1 中,支持使用 rgb 色彩声明(尽管开发者可能更加习惯使用如:#343434 的 16 进制表示方式),例如要为 id 为 example 的 div 元素设置背景色 #343434 ,可以这样写

css code复制内容到剪贴板
  1. /* rgb 表示方式 */  
  2. #example {backgroundrgb(52, 52, 52); }  

接下来再使用 rgba ,把例子中的背景颜色修改成带 0.5 透明度。

css code复制内容到剪贴板
  1. /* 设置 0.5 透明度 */  
  2. #example-a {background: rgba(52, 52, 52, 0.5); }   
  3. /* 也可以省略小数点前的 0 */  
  4. #example-a {background: rgba(52, 52, 52, .5); }  

增加透明度前后效果如下(为了更明显的反映透明度带来的效果,例子中的 body 增加了背景纹理):
CSS3中使用RGBa来调节透明度的教程

可以看出,rgba 只是在原有的 rgb 的基础上增加一个参数,这个改动虽小,却为开发者提供了很大的方便。

另外,rgba 除了可以用在 background 属性外,还可以用在 color 和 border 属性(注:border 属性使用 rgba 在 firefox 中会与在其他浏览器中的效果略有不同)。

二. 浏览器支持与渐进增强
尽管 rgba 已经在主流现代浏览器中获得了良好的支持,其中 webkit 对 rgba 的支持是最早的,chrome 至少在 0.415 版本便开始支持 rgba ,在这个方面 chrome 可以说是非常给力的,另外 gecko 和 presto 内核也逐步实现了对 rgba 的支持,ie 浏览器则从 ie9 开始才支持 rgba 。更具体的浏览器支持情况如下:

chrome 0.4.154.33+ , firefox 3.0+ , safari 3.2.1+ , opera 10.10+ , ie9+

更加详细的浏览器支持情况请参考这里。

对于不支持 rgba 的浏览器,这里可以采用渐进增强的方案解决,kayo 推荐的是指定一个保留色的解决方案。首先,开发者必须知道,不支持 rgba 的浏览器会把使用了 rgba 的 css 属性值视为语法错误,因此不理会该 css 属性设置。因此,开发者可以在设置 rgba 颜色之前首先设置一个不使用透明度的属性,避免当浏览器不支持 rgba 时出现完全没有颜色的情况。下面对上例进行扩展说明:

#example1 {background: rgb(52, 52, 52); background: rgba(52, 52, 52, .5); }
不支持 rgba 的浏览器会忽略第二个 background 属性设置,按照第一个属性值设置元素的背景色,这样虽然不能使浏览器之间的效果相同,但已经达到相似的效果了,并且体现了一种不错的渐进增强解决方案。

当然,对于 ie ,可以使用滤镜达到与支持 rgba 浏览器中相同的效果,例如:针对以上例子,你可以如下地编写代码

css code复制内容到剪贴板
  1. <style type="text/css">   
  2.     #example-a {background: rgba(52, 52, 52, .5); }   
  3. </style>   
  4. <!--[if ie]>   
  5.     <style type="text/css">   
  6.         #example-a {   
  7.             backgroundtransparent;   
  8.             filter: progid:dximagetransform.microsoft.gradient(startcolorstr='#34343432', endcolorstr='#34343432');   
  9.             zoom: 1;   
  10.         }    
  11.     </style>   
  12. <![endif]-->  

这里需要注意,滤镜中使用的是上例中相同的颜色和透明度,只是使用 16 进制表示。

ie 会忽略 rgba 颜色设置,并且根据 filter 滤镜设置颜色,这样的效果与 rgba 的效果相同。

三. 不影响子元素
在文章的开头已经介绍过,rgba 相对 opacity 的优势是不会影响其子元素,即可以单独为被设置的元素设置透明度,而子元素而不受该设置影响。下面再例举一个具体的例子,分别以 rgba 和 opacity 为元素设置透明度说明两者的区别。

完整代码:

css code复制内容到剪贴板
  1. <!doctype html>   
  2. <html lang="zh-cn">   
  3. <head>   
  4.     <meta charset="utf-8">   
  5.     <title>rgba 与 opacity 效果的区别</title>   
  6.     <style type="text/css">   
  7.         body {padding-top200pxbackgroundurl(bg.png); }   
  8.         #example, #example-a {width200pxheight100pxmargin: 0 auto; }   
  9.         #example {backgroundrgb(52, 52, 52); opacity: 0.5; }   
  10.         #example-a {margin-top20pxbackground: rgba(52, 52, 52, .5); }   
  11.         .inside {displayblockwidth50pxheight50pxmargin-left10pxbackgroundrgb(100, 140, 180); }   
  12.     </style>   
  13. </head>   
  14. <body>   
  15.     <div id="example">   
  16.     
  17.         <span class="inside"></span>   
  18.     
  19.     </div>   
  20.     
  21.     <div id="example-a">   
  22.     
  23.         <span class="inside"></span>   
  24.     
  25.     </div>   
  26. </body>   
  27. </html>  

具体效果
CSS3中使用RGBa来调节透明度的教程

可以看出,opacity 会使其中的子元素 span 同时变为半透明的效果,而 rgba 则只改变被设置的元素的透明度,而在大多数情况下,开发者只需要设置当前元素的透明度(如遮罩,半透明背景等),因此使用 rgba 会更加的灵活。

另外,在 ie9 中,直接使用 rgba 颜色与使用 opacity 设置透明的效果会有差异(读者可以在 ie9 下浏览 demo 查看具体的效果),开发者需要注意这一点差异。