王为仁 2015-06-09
IE兼容CSS3圆角border-radius,box-shadow,text-shadow的方法
1.下载ie-css3.htc
2.CSS
box { -moz-border-radius: 15px; /* Firefox */ -webkit-border-radius: 15px; /* Safari 和 Chrome */ border-radius: 15px; /* Opera 10.5+, 以及使用了IE-CSS3的IE浏览器 */ -moz-box-shadow: 10px 10px 20px #000; /* Firefox */ -webkit-box-shadow: 10px 10px 20px #000; /* Safari 和 Chrome */ box-shadow: 10px 10px 20px #000; /* Opera 10.5+, 以及使用了IE-CSS3的IE浏览器 */ behavior: url(ie-css3.htc); /* 通知IE浏览器调用脚本作用于'box'类 */ }
3.问题:
一、只能同时4角圆角,不能单独设置;
二、div上可以正常使用,测试text文本框,会出现异常;
三、CSS文件要和页面在同一目录下,否则无效
四、当前元素一定要有定位属性,像是position:relative或是position:absolute属性。
五、z-index值一定要比周围元素的要高,否则……只能说抱歉了~~
4.支持的样式及状态说明
参见下表:
border-radius | 为元素四个角设置圆角属性 元素边框 | 只设置一个角落的圆角属性 |
box-shadow | 模糊大小参数 偏移值 | 不支持除了黑色(#000)以外的其他颜色 |
text-shadow | 模糊大小参数 偏移值 颜色值 | IE下的表现与Firefox/Safari/Chrome有一点点的差异,原因不详 |
在这时碰到了一个圆角边框的问题,以前的代码是在每个页面写一个固定结构的div,使用背景图片来实现圆角边框。代码结构大致如下:
.top_border{background:url(topborder.png);} .left_border{background:url(leftborder.png);} .right_border{background:url(rightborder.png);} .bottom_border{background:url(bottomborder.png);}
<div> <div class="top_border"></div> <div class="left_border"></div> <div class="content"> ... </div> <div class="right_border"></div> <div class="bottom_border"></div> <div>
在重构时,我直接把这个结构修改为最简化的版本
<div class="content"></div>
这里就有点问题:使用boder-radius可以实现圆角边框,但是不支持IE7 、IE8。
当时我认为,我的这个规范是正确的,所以希望通过不修改HTML的代码结构来完成对IE7/IE8的兼容。
搜索了一下IE7/IE8的解决方案:http://www.cnblogs.com/binyong/archive/2009/11/30/1613376.html
就以此为基础,使用js来对IE7/IE8进行兼容。主要代码逻辑如下:
if( typeof (document.documentElement.style["border-radius"]) == "string")//判断是否支持 { $.fn.extend({//实现圆角 borderRadius : function (r) { var b = this.wrap("<div></div>").parent(); //以下代码 主要以逻辑为主 并非真实执行代码 ,为四角 border-radius = 5的实现 //调整margin 及 宽度 以符合旧div的布局 b.css( {margin : this.css("margin") , "width ": this.clientWidth}); this.css({margin:"0"}); var borderColor = this.css("border-color"); var background = this.css("background-color"); var borderStyle = this.css("borer-style"); //重设边框,只保留两侧边框 this.css({"border-top-width":"0","border-bottom-width":"0"});// //创建HTML结构,实现上下边框 var setting = { m: [1,2,3,5],bw : [1,1,2,0] }; var i = 0; for(; i < 3; i++) { var t = $("<b><b>").css({"height": 1 , "margin" : "0 " + setting.m[i] + "px", "border-left-width" : setting.bw[i] +"px","border-right-width" : setting.bw[i] +"px", "border-color":borderColor,"background-color":background}); b.append(t); b.prepend(t.clone(true)); } var t = $("<b><b>").css({"height": 1 , "margin" : "0 " + setting.m[i] + "px", "border-width" : "0", background-color":borderColor}); b.append(t); b.prepend(t.clone(true)); } }); $(".content").borderRadius(5);//设置圆角 $(".border1").borderRadius(5); }
虽然运行时的HTML结构变化了,但是编码时的HTML结构没有变化,也算是一种兼容方式吧。