浏览器兼容之旅第四站:IE常见Bug总结及修复方法—part2

《浏览器兼容之旅第三站:IE常见Bug总结及修复方法—part1》中介绍了IE浏览器下十种经典的Bug产生的原因,以及如何在写代码中避免这些Bug的产生,或者说Bug发生后,又如何来解决这些Bug。这节我们接着来看IE下的相关Bug。尽量了解并掌握他们,只有知已知彼才能百战百胜。因为大家都尝过IE下的苦楚,有时为了一个Bug纠结一两天,或者更长的都有,以致于都想头撞南墙,不想活了,这都是IE给逼的呀。不过随着时间往后的推移,我也不觉得他有什么恐怖的,我认为写代码时,结构上多加注意,写样式时尽量避免。这样一来,也没有多少Bug会缠着你。别的不说了,我们继续下面的内容——IE的Bug处理。

一、IE6克隆文本的Bug


这个Bug在IE6下碰到代码的注释常发生,时常用朋友问到,怎么我的没有输入这个东西,怎么会生成呢?我们来看下面的一张图,展示的就是月IE6下无故多了一些文本:

在我们的Html代码为



复制代码代码如下:
<!-- IE6 does not like comments -- >
<div class="floating_div" >
<... some markup ... >
</div>
<!-- IE6 does not like comments really -- >

往往你的结构如上面的风格时,就会碰到IE6下多了一段文本,不过这样的Bug不会说,结构类似上面就会产生,这也要看你的运气了,你运气不好,你一直没机会看到这样的Bug,你要是运气好,常能看到。是不是对IE6更加无语了。那么针对这样的Bug要如何处理呢?也很简单

方法一


方法一是使用条件注释,这样可以轻松的避开这个Bug。有关于条件注释的使用,大家可以点击《浏览器兼容之旅的第一站:如何创建条件样式》查阅。我们来看代码:

复制代码代码如下:
<!--[if IE] >IE6 does not like comments <![endif]-->
<div class="floating_div" >
<... some markup ... >
</div>
<!--[if IE] >IE6 does not like comments <![endif]-->

方法二

:在注释前面的那个浮动元素加上“display:inline”

方法三

:最安全的解决方法,也是最简单的方法,把注释全部去掉。这样就永远不会有这个Bug发生。
个人更趋向于方法一和方法三,当然大家要是想了解更多有关天这个Bug话,还可以点击 Adam Hicks 写的《IE6 Ghost Text Bug 》一文。

二、IE下图片缩放Bug


这个你一定会喜欢,就是图片在IE下缩放时会影响其质量,你可以让他和别的浏览器对比一下,IE下看起图片质量极差:
 
解决办法:

复制代码代码如下:
img { -ms-interpolation-mode: bicubic; }

三、IE6下PNG图片透明Bug


大家都知道,有时需要使用透明图片,别然gif和png8都可以制作透明图片,但这两者对于要求强美感的你来说一定达不到你的要求,因为会有杂边,那么使用png24或png32图片,质量是没有问题了,可引发另一个头痛的问题,就是IE6下面显示图片会有一层淡兰色的背景,
 
这样一来我们需要起办法来解决掉这层淡兰色的背景色,方法很多,常用的有两种:

方法一:滤镜的方法



复制代码代码如下:
.img{
background:url(http://shenmo.wanmei.com/images/logo/sm_logo_202x104.png);
_background:0;
_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://shenmo.wanmei.com/images/logo/sm_logo_202x104.png,sizingMethod=scale);
}
或者:
img {
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src=http://shenmo.wanmei.com/images/logo/sm_logo_202x104.png,sizingMethod=scale);
}

<img src="test.png" _fcksavedurl=""test.png"" _fcksavedurl=""test.png"" _fcksavedurl=""test.png"" width="247" height="216" alt="" / >

方法二:DD_belatedPNG.js


可以使用DD_belatedPNG来产现,具体实如何实现,大家可以参考前面我所整理的《Drupal7中解决IE6的png透明问题》一文。或者在GG和度娘中直接搜索关键字fix PNG Transparency for ie6 将会有一大堆关于解决IE6下的PNG透明问题。

四、<IFrame>透明背景Bug


这个Bug是有关于<iframe>有背景透明问题——在Firefox和Safari中,你应该不会遇到这个问题,因为默认情况下,iframe的背景设置为透明,但在IE浏览器,它不会。你需要在iframe中设置[allowTransparency="true"],并在调入的页面中设置其body的“background-color”为“transparent”:

HTML Markup



复制代码代码如下:
<iframe src="content.html" allowTransparency="true" ></iframe>

而且需要在iframe中调入的content.html中设置其body的背景色:

复制代码代码如下:
body {background-color: transparent;}

五、禁用IE浏览器默认的垂直滚动条


默认情况下,IE显示垂直滚动条,即使内容很好地适合窗口。你可以使用overflow:auto来改变,设置他需要时显示出来

复制代码代码如下:
html {
overflow: auto;
}

六、IE6下:hover伪类Bug


在IE6下只支持a:hover的效果,对于其他元素的:hover状态都不支持的。对于这个bug最好的解决办法就是使用jQuery或js来解决,下面我们一起看一个jQuery的解决方案

HTML Markup



复制代码代码如下:
<ul id="list" >
<li>Item1</li>
<li>Item2</li>
<li>Item3</li>
</ul>

Css Code



复制代码代码如下:
.hover {
background: #f00;
}

jQuery Code



复制代码代码如下:
$(#list li).hover(function () {
$(this).addClass(hover);
},function() {
$(this).removeClass(hover);
});

上面的方法是通过jQuery中的.hover()以及.addClass()和.removeClass()几种方法共同实现。有关于.addClass()和.removeClass()也可以参阅《jQuery中.addClass()和.removeClass()》一文的相关介绍。

七、修复min-width/max-width和max-heigt/min-height的Bug


上一节《浏览器兼容之旅的第三站:IE常见Bug——part1》中,我们就得知:在IE6下,他是不识别min-height属性的,其实他不单单不识别min-height属性,而且他还不演识别max-height,min-width,max-width等属性。这是对于前端攻城师来说又是一个非常棘手的问题,因为许多布局方案中都时常会用到这些属性,才能更好的工作。在现代浏览器中,你可以轻松的像下面那样轻松的使用这些属性就能正常工作:

复制代码代码如下:
div.max-height {
max-height: 300px;
}
div.min-height {
min-height: 300px;
}
div.max-width {
max-width: 300px;
}
div.min-width {
min-width: 300px;
}

上面这些在IE6下是不识别的,换句话说是无法正常工作的,因为他们完全不明白这些基本的CSS属性。不过幸运的是,IE浏览器有一套其自己的专有属性,就是使用javaScript表达式来操纵(X)HTML的文档属性,比如说我们这里所说的min-width,max-width和min-height,max-height等属性。不过使用IE的专有属性有两个缺点:

表达式是基于javaScrpt脚本上运行,如果用户的浏览器不支持javaScript或禁用了javaScript时,那么在用户浏览器上将无法正常运行;
另外使用IE的专有属性表达式是非常耗费资源,同时也可能产生负面影响。
虽然使用IE专有属性那不良之处,但有时为了满足用户的完美追求,也只好牺牲一些性能上的条件,来完整的让这几个属性在IE6上正常运行。

1、max-width



复制代码代码如下:
/* max-width for IE6 */
* html div.max-width {
width: expression(document.body.clientWidth > 299 ? "300px" : "auto");
}
/* max-width for standards-compliant browsers */
div.max-width {
max-width: 300px;
}

2、min-width



复制代码代码如下:
/* min-width for IE6 */
* html div.min-width {
width: expression(document.body.clientWidth < 301 ? "300px" : "auto");
}
/* min-width for standards-compliant browsers */
div.min-width {
min-width: 300px;
}

3、max-height



复制代码代码如下:
/* max-height for IE6 */
* html div.max-height {
height: expression(this.scrollHeight > 299 ? "300px" : "auto");
}
/* max-height for standards-compliant browsers */
div.max-height {
max-height: 300px;
}

4、min-height


复制代码代码如下:
/* min-height for IE6 */
div.min-height {
min-height: 500px;
height: auto !important;
height: 500px;
}

八、修复position:relative的Bug


这个Bug并不常见,因为我们有里在元素中使用position:relative达到某种效果。在现代浏览器使用position:relative属性定位嵌套元素不会有任何问题,但在IE6下并不是那么的友好,常给会我们的布局带来一些意想不到的错误。不过解决这样的问题很轻松,我们只需要给使用了相对定位的元素用zoom:1属性触发IE6下的hasLayout就可以解决。

复制代码代码如下:
selector {
position: relative;
}
* html .selector {
zoom: 1;
}

:使用zoom:1时不应该应用在行内元素(inline)上,不然在IE6下将触发元素为块元素。

九、修复margin的负值


负边距在我们平时的Web制作中,为了达到一定的效果也时常用到,而在现代浏览器中使用负的边距并不会有任何问题,但是在IE6下对负的margin值并不友好,除非你在目标元素上使用“position:relative”属性:

复制代码代码如下:
.selector {
margin: -1.5em;
}
* html .selector {
position: relative;
zoom: 1;
}

十、修复overflow的问题


overflow是一个好东西呀,有时他可以帮我们把溢出的内容不在显示,有时也可以帮我们清除浮动(《Clear Float 》),用时还真离不开这个overflow。可是在IE6上使用overflow属性会给我们带来意想不到的、无法解释的显示问题。幸运的是我们配合hasLayout可以解决一下溢出问题,如下面的例子:

复制代码代码如下:
.selector {
overflow: hidden
}
* html .selector {
zoom: 1;
}

但当font-style:italic时,将有一个新的问题会发生——会扩大它的父元素的宽度。要解决这个细微的差别,只需要在元素的父元素加上一个:

复制代码代码如下:
* html .selector {
overflow-x: hidden;
}

这里我们又一起见证了IE下的另外十个Bug以及其避免和解决的方法,虽然没有《浏览器兼容之旅第三站:IE常见Bug总结及修复方法—part1》中介绍的那十个Bug经典,但也是IE的Bug。没有碰到或许你认为不是问题,但当你碰到了,又有时会抓破了头皮了都不知是何故,所以还是那句话,以备急需。那么到现在,我们总共见证了IE下的二十种不同的Bug,以及其处理方法,其中有很多大家见识了,也处理过了,但我相信其中有很多肯定是没有遇到过,对于没有遇到过的,就了解一下吧,说不定哪一天你就碰到了。哈。。。。:)。

浏览器兼容之旅第四站:IE常见Bug总结及修复方法—part2