css3实现透明度|CSS3实现透明边框方法实例教程

更新时间:2019-12-26    来源:css3教程    手机版     字体:

【www.bbyears.com--css3教程】

现在的网页中,经常性的会遇到弹出层的效果。类似截图如下

RGBA


就是半透明的边框。汗,前端的同事想到的方案是 做个10*10的png24的半透明图片,然后作为背景平铺(让外层盒子的内边距 = 弹出层边框的宽度)这样能模拟出透明边框的效果。但是万恶的IE6不支持PNG透明。。。。。抓狂!

今天找到一个比较优的解决方案,使用 RGBA.

先是说说 RGB, RGB色彩模式(也翻译为“红绿蓝”,比较少用)是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。

RGBA在RGB的基础上多了控制alpha透明度的参数。以上R、G、B三个参数,正整数值的取值范围为:0 ? 255。百分数值的取值范围为:0.0% ? 100.0%。超出范围的数值将被截至其最接近的取值极限。并非所有浏览器都支持使用百分数值。A参数,取值在0~1之间,不可为负值

RGBA语法:

 .div {background: rgba(0,0,0,0.5);}

RGBA和opacity的区别

opacity (filter: Alpha(Opacity=50) 或opacity:0.5)会使整个元素包括子元素透明,而RGBA仅仅是元素本身透明,子元素不透明。

下面具体讲讲怎样让IE浏览器支持RGBA颜色。

IE下RGBA写法

.div {
   filter:progid:dximagetransform.microsoft.gradient
   (startcolorstr="#66000000", endcolorstr="#66000000",gradienttype=0);}
   
   /*ie9已经支持rgba模式了*/
 :root .div{filter:none;}

RGBA兼容列表

 
DXImageTransform.Microsoft.gradient滤镜里的startColorstr参数值是#AARRGGBB形式的,其中的AA(startColorstr的前两位)是代表不透明度的十六进制,00表示完全透明,FF就是全不透明,化成十进制的范围就是0~255,剩下的RRGGBB就是颜色的十六进制代码。例子中background: rgba(125, 0, 0, .3);表示的是30%不透明度的红色背景。如何把30%的不透明度转换成十六制呢?很简单,先计算#AA的的十进制x,x/255 = 3/10,解得x=3*255/10,然后再把x换算成十六进制,约等于4B。

RGBA颜色还可以用于border,不过,不同的浏览器对于border的RGBa支持不太一样,不过唯一的不同是,Firefox在border的拐角处会出现叠加,比如透明度是0.4,那么在Firefox中,四个角的透明度会变成0.8,而支持RGBa的非FF浏览器不会出现这种情况。


 
css3的background-clip来制作半透明边框


弹出框的html代码如下:

    
      
    


弹出框的css代码如下:

    #lightbox {   
        position: absolute; top: 0px;left: 0px;  
        display:none;   
        width: 470px; height: 350px;  
        background-color: white;  
        text-align: center;  
        padding:8px;          
          
        /* 关键代码部分 */  
        -moz-background-clip: padding;     /* Firefox 3.6 */  
        -webkit-background-clip: padding;  /* Safari 4? Chrome 6? */  
        background-clip: padding-box;      /* Firefox 4, Safari 5, Opera 10, IE 9 */           
        border: 8px solid rgba(0,0,0,0.3);  
                      
        -webkit-border-radius: 15px;  
        -moz-border-radius: 15px;  
        border-radius: 15px;   
                  
    }
    


脚本部分不是这个教程的重点,明河就不贴出来了。css部分的代码看似很多,关键是里面的以下这几行代码:

    #lightbox {       
          
        /* 关键代码部分 */  
        -moz-background-clip: padding;     /* Firefox 3.6 */  
        -webkit-background-clip: padding;  /* Safari 4? Chrome 6? */  
        background-clip: padding-box;      /* Firefox 4, Safari 5, Opera 10, IE 9 */           
        border: 8px solid rgba(0,0,0,0.3);  
                  
    }

          

为什么利用background-clip可以产生半透明的边框效果呢?接下来明河来说说background-clip。

background-clip 与 background-origin 的一则运用


background-clip 和 background-origin 是 CSS3 中新加的 background module 属性,用来确定背景的定位。

background-clip 用来判断 background 是否包含 border 区域。而 background-origin 用来决定 background-position 计算的参考位置。

语法为:

    background-clip: [border | padding] [, [border | padding]]*
    background-origin: [border | padding | content] [, [border | padding | content]]*

盒模型示意图

对于 background-clip:

如果是 padding 值,则 background 忽略 padding边缘,border 是透明的。如果是 border 值,则background 包括 border 区域。如果 background-image 图片有多个,对应的 background-clip 值之间用逗号分隔。

对于 background-origin:

如果是 padding 值,则 position 相对于 padding 边缘(”0 0″ 为 padding 边缘的左上角,而 “100% 100%” 为右下角)。如果是 border 值,则意味着相对 border 边缘。而 border 值则相对于内容边缘。与 background-clip 相同,多个值也用逗号分隔。如果 background-clip 是 padding 值,background-origin 是 border 值,并且 background-position 是 “top left”(默认初始值),则背景图左上角将会被截取掉部分。

这两个属性仅从 CSS3 才出现,在未使用该属性 background module 中的默认表现又如何呢?

background-clip 默认类似于 background-clip:border。

background-origin 默认类似于 background-origin:padding。

但 IE 又是特例 (It sucks)。

在 IE6 、IE7 中,一般元素(button 等除外)的背景相当于:background-clip:border; background-origin:border;

而 hasLayout 的元素(加上 button 等)的背景则相当于:background-clip:padding; background-origin:padding;

这一对 CSS3 属性已在 Mozilla, Safari 3 和 Konqueror 等浏览器中实现,不过都是通过其私有属性的表达方式。

    基本非 IE 的浏览器的私有属性一般都会以 -xxx- 这样开始,-o-就是以 Presto 为引擎的 Opera 私有的、-icab- 是 iCab 私有的,-khtml- 是以 KHTML 为引擎的浏览器(如 Konqueror Safari)、-moz- 就是以 Mozilla 的 Gecko 为引擎的浏览器(如Firefox,Mozilla)、-webkit- 就是以 Webkit 渲染引擎(是 KHTML 的衍生产品)的浏览器(如 Safari、Swift)。

即支持的私有属性分别为:

    -moz-background-clip
    -webkit-background-clip
    -khtml-background-clip
    -moz-background-origin
    -webkit-background-origin
    -khtml-background-origin

下面举个运用 background-origin 属性的简单例子,效果如下图:
范例示意图

HTML 部分:


CSS 部分(详细见注释):

button {
        display:inline-block;/*触发hasLayout*/
        height:26px;
        padding:0 20px;
        cursor:pointer;
        *overflow:visible;/*消除IE按钮左右padding随字数长度变化的BUG*/
        border:3px double #95071b;/*用3px 双边来模拟设计图中的白线*/
        border-right-color:#650513;
        border-bottom-color:#650513;
        background-color:#95071b;
        /*设置背景裁切方式和参考线*/
        -moz-background-clip:padding;
        -webkit-background-clip:padding;
        -khtml-background-clip:padding;
        -moz-background-origin:padding;
        -webkit-background-origin:padding;
        -khtml-background-origin:padding;
        /*向前兼容*/
        background-clip:padding;
        background-origin:padding;
        color:#fff;
        font-size:12px;
        line-height:20px;
        /*修正IE6下高度问题*/
        _padding-top:2px;
        _line-height:14px;
}


不足之处:此效果在 Opera 下无法实现。

当然这只是一种对 HTML 代码有洁癖的解决方法(限于对 background-clip 和 background-origin 属性的学习和理解),当然也可尝试其他方法,也许会使 CSS 更简洁,至于各种方法的优缺点自己衡量。


background-clip用于设置背景显示模式,共有border、padding、content三种模式,用于控制背景覆盖容器的范围,而默认的显示模式是border(并不是所有的默认显示模式都是border,IE下有特例,可以看阅怿飞的那篇文章),即背景覆盖无法超出边框(有覆盖到边框);而当demo中将其值设置为padding时,也就是说背景只能覆盖内盒,边框是不存在背景的!

由于demo中将background-clip设置为padding,背景颜色(白色)不在存在于边框,当你的边框是带有透明度设置时(demo中是0.3),就会产生这种半透明的边框效果!留意不同浏览器的设置方法是有些差异的,而IE是不支持的!这是这种方案的唯一弊端。

background-clip密切相关的还有个background-origin属性,background-origin的用法留待日后再讲解。

本文来源:http://www.bbyears.com/css/83866.html