使用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 ...
随机推荐
- sinaBlog中小知识总结
1.上拉刷新的时候记得移除老的数据(同样应用于其他地方) if (vc.currentPage == 1) { //上拉加载 记得移除新的 [vc.totalArr removeAllObjects] ...
- sql server 的约束的作用 于 理解 [转]
SQL Server中的约束用来确保系统的完整性.一般约束可以分为:主键约束外键约束检查约束默认约束唯一约束非空约束 但是一般我们需要特别注意前三种约束:主键约束,一就是说跟你系统的实体有很大的关系, ...
- FirstOrDefault()的重载方法
FirstOrDefault方法的使用总结: 现有一集合对象list, 其中集合对象调用FirstOrDefault()方法, list.FirstOrDefault()返回集合中第一个元素, 若集合 ...
- word2010无法打开文件时的一点对策
word2010无法打开文件时的一点对策 1. Word 安全模式启动,点击「开始」,在搜索栏中输入winword /safe并回车,测试问题是否依然存在? 2. 正常启动Word,点击“文件”—“选 ...
- 将所需要的图标排成一列组成一张图片,方便管理。li的妙用
我在做一个网站的header 但是视频教学里面将电话图标,微信图标,以及每一个英文字母右边的小点拼成一副图. (图片的名字是top_ioc.png)拼成的整个图片作为li的背景.通过移动就可以分别将每 ...
- lucene4.7 分页
转载自http://my.oschina.net/MrMichael/blog/220782 我 们先来看下下面的问题,现在我们的索引里有2亿多的数据,那么现在的需求是,把索引里的全部数据,读取然后写 ...
- 当使用System,out.println()打印一个对象是自动调用toString方法
在Java中,所有的对象都是继承自Object,自然继承了toString方法,在当使用System,out.println()里面为一个对象的引用时,自动调用toString方法讲对象打印出来.如果 ...
- IDL 实现PCA算法
在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析.简化数据集的技术.主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特 ...
- L2,breakfast or lunch
express: what a day多么糟糕的天气 I‘m coming to see you我将要来看你 what a lot of trouble he is causing他犯了多少错误啊 w ...
- 后台前台json传递数据的方式两种方式 $.get, $.getJSON
第一种getJSON方式: 前台调用: <td><input type="text" class="t" id="edutitle& ...