几个 IE 样式解决方案
这篇文章将会记录一些 IE 兼容性的解决方案。忙碌的时候,做个笔记。稍空的时候,记录下来。随着学习经验的积累,这就是财富。
###一,IE 背景穿透解决方案(空路径)
有时候,为了给页面的某一个元素设置一个空的背景,那么不去设置background
属性,恰巧这个元素有交互效果,要么是mouseover
, 要么是mouseout
。而在 IE 下,会导致该元素没有出发交互动作。或者说是穿透到了下一个元素中去。
这样的案例,经常发生在一些有小三角型的tips里面。于是,我通常的解决方法如下:
.sl-through { *background: url(about:blank); /* for IE 6-7 */ background: url(about:blank)\0; /* for IE 8 */ } :root .sl-through background:rgba(0,0,0,0); /* for IE 9 */
###二,Iframe 背景半透明解决方法
先说一下透明的通用解决方法,例如使用Opacity
来为一个div
层做半透明,其实不是很建议,因为这个元素的子元素会继承半透明的属性。解决了半透明问题,结果又得处理文字上的不透明问题。
通常的解决方法是通过ruba
(高级浏览器)和渐变滤镜
(IE浏览器)做一个层的透明解决方案:
/* * filter 中的 StartColorStr 和 EndColorStr: * #4c000000 是 30% 透明度的 #000000 的意思 * 组成: # + 透明度 + 颜色 * 算法: Math.floor(0.6 * 255).toString(16); */ .sl-rgba{ background:rgba(0, 0, 0, 0.3); /* 支持高级浏览器 */ filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#4c000000', EndColorStr='#4c000000'); /* for IE */ } :root .rgba{ filter:progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr='#00000000', EndColorStr='#00000000'); /* for IE9 */ }
以上解决的只是一个页面里面的半透明解决方案,解下来说为一个页面里的Iframe做半透明。
Iframe里面的样式控制:
html, body { background: none; }
父页面的Iframe需要添加一个属性:allowTransparency='true'
,这样就可以解决iframe的半透明问题。
###三,IE8 下使用滤镜效果与 a 标签兼容问题
如上文的半透明解决方案,使用了IE的滤镜来解决半透明问题。但IE滤镜的使用,在IE8下,有时候会导致子元素里面的 a 标签链接没有a:hover
效果。
举个例子,为一个div
层做个阴影,使用了滤镜。那么,需要对a标签增加一个属性position: relative
。
###四,投影问题
在 Aliceui 中,我们罗列出了一些解决方案,例如跨浏览器背景阴影,就很好地解决了阴影问题。现更新如下:
.sl-shadow { /* modern web browsers */ -moz-box-shadow:1px 3px 12px #bbb; -webkit-box-shadow:1px 3px 12px #bbb; box-shadow:1px 3px 12px #bbb; /* 一定要设置background, 不然 ie 会显示在字体上 */ background: #fff; /* gte=ie8 */ -ms-filter:"progid:DXImageTransform.Microsoft.Glow(color=#aaaaaa,strength=3) progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=0,strength=6) progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=90,strength=10) progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=180,strength=6) progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=270,strength=6)"; /* lte=ie7 */ *filter: progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=0,strength=7) progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=90,strength=10) progid:DXImageTransform.Microsoft.Shadow(color=#dddddd,direction=180,strength=10) progid:DXImageTransform.Microsoft.Shadow(color=#eeeeee,direction=270,strength=7); } :root .sl-shadow { filter:none\9; } /* IE9 不使用滤镜 */ .sl-shadow a { position: relative; } /* 解决上文所说的 a:hover 问题 */
###五,IE 下未安装 flash 引起页面的白屏等待状态
这里简单带过,在没有安装flash的机器上运行有object
的代码时,IE里面会导致页面停留在加载flash安装文件的进程上,直到浏览器下载完毕再渲染接下来的DOM结构。
经过排查,这样的情况会导致页面刷新白屏加载一段时间:
1, 机器未安装flash,页面有flash相关代码
2, object
代码与下一个DOM结构之间存在script
标签。
初步原因分析:没有安装flash的机器,渲染页面的时候,会请求flash网站,发送回来安装文件。这时候在IE下如果有script
标签,浏览器可能会误认为这段脚本即将使用flash,或者进行通讯。于是必须执行。这导致的结果就是必须得等安装文件加载好,才去渲染页面。就有白屏了。
解决方法:将script
标签包在div
里面,或者移到最底端。
##六、IE6 最小高度控制
我们在定义一个页面的时候,或许会给这个页面一个最小的高度,通常很简单min-height: 500px;
,这样就可以解决很多浏览器。但是 IE6 不认这个。好吧,简单把代码贴下,定一个高度为 520px 的容器:
.sl-minheight { height: auto !important; _height: 520px; min-height: 520px; _overflow: visible; }
##七、其他
a 链接的空路径,有时候在思考是使用 javascript:void(0);
,还是javascript:;
, 其实在有Iframe的页面,这两种写法在IE6下,触发事件都会阻塞页面的渲染进程的。所以使用#
会更好。
日后更多积累,再补充。(2012.06.12)