使用RGBa和Filter实现不影响子元素的CSS透明背景
点击查看原文
问题
如果我们想要一个元素拥有半透明的背景,我们有两个选择:
使用CSS和 opacity 做一张 24-bit PNG 背景图片
在CSS中使用opacity有两个问题,一是为了适应所有的浏览器,我们要对付opacity讨厌的语法;二是opacity不仅使目标元素的背 景变得半透明,而且使它所有的子元素的背景也变成了半透明。这意味着它里面所有的文本(译者注:图片也一样)都具有同样的透明度,我敢肯定没几个人想要这 样的效果。可以通过添加一些不必要的元素,使用CSS定位技巧类似的手段躲开这个问题,归根结底,乱就一个字。
使用PNG图片也有问题,除了不必要的HTTP请求之外,图片体积再小也比两行CSS代码大-特别是在IE里面,为了避免24-bitPNG图片严重的内存泄漏问题,这张图还必须额外大一点。
解决方案!
综上种种,我愿意很高兴的提供一种替代方案:RGBa颜色。这个方案的优点在于你可以设定正常的RGB颜色值,再加上你想要的透明度,OK,这就得到了半透明的背景色。用CSS写出来,再加上对不支持rgba浏览器的优雅降级,代码如下:
.alpha60 { /* Fallback for web browsers that doesn't support RGBa */ background: rgb(, , ); /* RGBa with 0.6 opacity */ background: rgba(, , , 0.6); }
半透明效果仅仅应用于背景-确实很妙,是不是?! :-)
提示
令人震惊的是,所有的IE(译者注:作者写这篇博客时还没有IE9,IE9在标准渲染模式下是支持RGBa的)都不支持RGBa色彩。幸运的 是,2000年疯狂的微软公司在IE中实现了许多过滤器。其中有一个倾斜度过滤器,我们需要做的就是把它的起始颜色和结束颜色定义成同样的值。“OK,可 我们要的是透明效果呀?”我知道你会这么想。答案是,我们使用16进制颜色值的一部分来声明起始颜色和结束颜色。使用css倾斜度过滤器达到同样效果的代 码如下:
.alpha60 { filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#, endColorstr=#); }
看到没。它的颜色值使用8位16进制值声明,其中第一第二位是16进制的alpha值 ,后面两位是R,再后面是G,再后面是B。和RGBa不同的是,它使用16进制数而不是0-255的颜色值。那我们怎样才能得到alpha0.6级别的16进制值?
我们现在需要做点算术题。我们需要alpha0.6级,将它乘上255--再把结果转换成16进制。一个简单方法是使用Google搜索功能,只需 要在关键词那儿写上 0.6 * 255 in hex 就可以了。不幸的是Google的计算器好象只支持整数,象 0.3 * 255 in hex这样的关键字根本得不到结果。
好在,还有一个也不算慢的手段,我们可以利用JavaScript。打开Firebug,然后在JavaScript控制台输入:
// Replace 0.6 with your desired alpha level Math.floor(0.6 * 255).toString(16);
我们得到结果 99,也就是alpha0.6级别对应的16进制数。这就是倾斜度过滤器所需要的起始和结束值。
总结
综合以上技术,我们写一份能在生产环境中使用的CSS:
.alpha60 { /* Fallback for web browsers that doesn't support RGBa */ background: rgb(, , ); /* RGBa with 0.6 opacity */ background: rgba(, , , 0.6); /* For IE 5.5 - 7*/ filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#, endColorstr=#); /* For IE 8*/ -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000, endColorstr=#99000000)"; }
注意!作为对本文的补充,你应该使用更可取的条件注释或类似方法为IE浏览器声明透明背景!
浏览器支持
以下浏览器支持 RGBa:
Firefox 3+ Safari 2+ Opera 10
从IE5.5开始,所有的IE浏览器都支持过滤器。
这意味着,我们实际上已经支持所有的浏览器!
使用RGBa和Filter实现不影响子元素的CSS透明背景的更多相关文章
- CSS 设置背景透明度,不影响子元素
由于 opacity 属性能被子元素继承,使用它设置父元素背景透明度时也会影响子元素. 解决方法: 1> 使用 RGBA Example .classname { /* RGBa, 透明度0.6 ...
- 改变父元素的透明度,不影响子元素的透明度—css
1.如果我们给父元素添加opacity:0.4后,子元素的red颜色也变成了0.4的透明度, 例子如下: <!DOCTYPE html> <html> <head> ...
- CSS中如何设置父元素透明度不影响子元素透明度
原因分析: 使用css的opcity属性改变某个元素的透明度,但是其元素下的子元素的透明度也会被改变,即便重定义也没有用,不过有个方法可以实现,大家可以看看. 可以使用一张透明的图片做背景可以达成效果 ...
- 当fixed元素相互嵌套时chrome下父元素会影响子元素的层叠关系
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. demo(http://jsbin.com/qumah/1): <!DOCTYPE ...
- 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. 解释:层叠关系是受层叠上下文影响的.文档中的层叠上下文由满足以下任意一个条件的元素形成: ...
- 父容器利用opacity设置透明后,子元素跟着变透明的解决方案
背景半透明,子元素不透明的效果经常需要用到.通常对父容器使用opacity属性时,子元素也跟着变透明,所以不妨设置父容器的 background-color:rgba(r,g,b,x); 其中x取值从 ...
- 解决子元素用css float浮动后父级元素高度自适应高度
1.在最后一个子元素后面清除浮动 2.父元素加over-flow:hidden;(副作用:子元素定位不能超出父元素的范围) 3.父元素也一样浮动(最笨的方法): 4.子元素使用inline-block ...
- BootStrap 实现导航栏nav透明,nav子元素文字不透明
在给nav 的属性赋值 opacity:0.0透明度时会导致nav内子元素会继承opacity属性.此时再对子元素赋值opacity:1.0 时会导致 子元素实际opacity值为0.0*1.0=0. ...
- 小工具:生成半透明背景色的 CSS 代码,不影响子元素透明度
工具:http://leegorous.net/tools/bg-alpha.html 工具介绍:http://leegorous.net/blog/2010/07/29/generate-css-c ...
随机推荐
- SCP测试服务器的上行/下行带宽
SCP测试服务器的上行/下行带宽,这个咋弄呢?有时间再研究一下.
- android 中ImageButton按下改变背景图片的效果
最近在做一个app的登陆界面,才发现原来认为很简单的UI效果,其实背后却蕴含的知识很多,积累一个算一个吧. 实现方法有两种:一种是添加代码,一种是配置xml文件. 方法一:代码添加 ImageButt ...
- HDU 4612 Warm up(双连通分量缩点+求树的直径)
思路:强连通分量缩点,建立一颗新的树,然后求树的最长直径,然后加上一条边能够去掉的桥数,就是直径的长度. 树的直径长度的求法:两次bfs可以求,第一次随便找一个点u,然后进行bfs搜到的最后一个点v, ...
- synchronized关键字以及实例锁 类锁
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
- ActiveMQ的配置与使用
1.什么是ActiveMQ MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来 ...
- Java 多态,重载,重写
1.多态(polymorphism): 多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象, ...
- Eclipse最有用的快捷键
编辑 Ctrl+1 快速修复(最经典的快捷键,就不用多说了,可以解决很多问题,比如import类.try catch包围等) Ctrl+Shift+F 格式化当前代码 Ctrl+Shift+M 添加类 ...
- 如何修改apache的默认web端口
在apache的安装文件夹里搜索 httpd.conf 文件,用记事本打开,搜索 Listen 80 ,把80(默认端口)改为你想用的端口,保存,重新启动apache服务即可!
- Cannot call sendRedirect() after the response has been committed
AJAX+JSP时,out.write('content')之后,如果后面还有代码,无法被执行到,会报 错,java.lang.IllegalStateException: Cannot call s ...
- Android Studio 修改主题
http://jingyan.baidu.com/article/6f2f55a18040aeb5b93e6cb4.html