Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

[素材] 几个针对IE6浏览器的hack-让ie6也表现的标准一些

[复制链接]
jianchang512 发表于 2013-4-13 16:57:29 | 显示全部楼层 |阅读模式
本帖最后由 jianchang512 于 2013-4-13 17:01 编辑

完整版阅读地址 http://www.wanglu123.com/several-hack-ie6-browser/


构建针对ie浏览器的特殊规则 hack

除了ie6 以及之前的ie浏览器,所有的浏览器都将  html  作为所有元素的祖先,也就是说 html 是最顶级的元素,是所有元素的祖先,而没有父元素,但 IE6 及之前版本的 IE 会将一个未命名的 * 作为 html 的父元素,因此可以利用这个特异性来锁住 ie6 浏览器,建立只针对ie6css规则,而对其他浏览器隐藏,从而让ie6也表现的像标准浏览器一样。



比如,在页面中引入这两条规则,


body { background: #fff; }* html body { background:#ff0000;}

那么在除 ie6 之外的浏览器会应用第一条,而将页面设为白色的背景色,他们不识别第二条规则,因而直接忽略。而ie6会识别第二条规则,而这条规则又因为排在后面,优先级高于上面的一条,因此ie6会将页面设置为红色(#ff0000为红色代码)。





holly hack 简易清除浮动

ie6中,如果一个元素包含一个浮动的子元素,那么这个元素本身的高度将变得不足以容纳下这个浮动子元素,也就是这个浮动子元素会超出父元素的高度,如图


<style type="text/css">.wai { border:1px solid #000;}  .nei { float: left; border: 1px solid #000; height: 300px; }  </style><div class="wai clearfix" > <div class="nei">浮动的子元素</div> <h2>在父元素之内没有浮动的h2</h2> </div>

当ie非浮动的父元素包含一个浮动的子元素时,子元素的高度将超出父元素

如何实现正常呢,让父元素正确的包含浮动子元素,方法很简单,如下


.clearfix:after { content:   ".";  // 在浮动元素之后生成一个内容 . display:  block;   // 将生成的内容置为块元素 height:  0; // 将生成的内容高度设置为0,从而让其消失 clear: both; // 清除浮动 visibility: hidden;  /*使生成的内容隐藏,从而只让这个生成的内容起到一个清除浮动而 本身却不显示的作用*/}

这样就实现了在除ie6之外的浏览器正确的包围浮动子元素了,但在ie6之下还不行,因此要针对ie6特别添加以下代码


* html .clearfix { height: 1%;  } //ie6将不会显示这个1%的高度,但必须要有

一切ok了,剩下的就是把.clearfix这个class值加在包含浮动子元素的父元素上,



给包含浮动子元素的父元素添加一个这个class值,就可实现在ie6下正确的包围浮动子元素

完整代码如下


<style type="text/css"> .wai { border:1px solid #000;} .nei { float: left; border: 1px solid #000; height: 300px; } .clearfix:after { content:   ".";   display:  block;   height:  0;  clear: both;  visibility: hidden;  } * html .clearfix { height: 1%;  }  </style>  <div class="wai clearfix" > <div class="nei">浮动的子元素</div> <h2>在父元素之内没有浮动的h2</h2> </div>



让IE6实现居中

在firefox、chrome、safari、opera等标准浏览器中实现居中很容易,只需要将需要居中的元素的左右外边距margin-leftmargin-right设置为auto,就会居中,但ie6无法实现,因此需要针对ie6的这个bug特别处理。代码也很简单


<body> <div id="waiceng"> .... </div> </body>

id=”waiceng”是最外层包围所有元素的容器,想让id=”waiceng” 居中,如下几行代码即可


body { text-align: center; // 页面中所有的元素都居中了,不仅仅是 id="waiceng"} #waiceng { margin: 0 auto; // ie6之外的浏览器因为这条规则而实现了居中 text-align: left; /* 因为上面作用到body的居中对齐也继承到了#waiceng的所有子元素上,这条规则重新将#waiceng的子元素设置为左对齐,这样就实现了只有#waiceng居中,而其内的元素左对齐,因为所有其他的元素都是#waiceng的子元素,所以也就实现了想要的效果*/ }



IE6浮动双边距

ie6中,当给一个浮动元素设置一个外边距时,怪异的ie6就会诡异的将其边距变成了双倍的,比如


div="float: left; margin-left:10px;"

ie6中实际的左外边距就会变成20px,这个bug的消除更简单,只需给这个浮动的元素添加一条声明 display:inline;就可以让ie6正确处理外边距了,因为浮动元素都是作为block来处理的,所以其他浏览器会忽略这条声明




IE6三像素偏移

ie6还有另一个诡异的bug,为任何紧挨在浮动元素旁的行内元素都加了3个像素,就算这个行内元素被包含在块级元素里也是如此。


比如


<div class="float">  浮动元素  </div>  <div class="no-float">非浮动元素文本</div>  .float{float:left;width:300px;height:200px;}  .no-float{margin-left:300px;}

在IE6中仔细观察,会发现,no-float向右移过去了3px,解决它也很容易。

在你只针对IE6的样式表中添加如下代码



.float{margin-right:-3px;}定义一个负的右外边距,将紧挨着的元素拉过来

.no-float{height:1%;margin-left:297px;}让紧挨着的这个元素左外边距减少3个像素,并设置一个会被忽略的高度。





IE的框模型

如果你给一个元素比如div设定width:100pxpx;border-width:2px;padding:8px;margin:5px;那么依照web标准,这个元素实际所占据的宽度应该是 5px+2px+8px+100px+8px+2px+5px=130px;



也就是设定的宽度,只是元素内容的宽度,不包括元素的内外边距和边框。



但IE浏览器在非标准状态也即Quirks状态下,会将内外边距和边框计算在宽度内,也就是说上面例子,内容宽度=总宽度设定的100px-5px-2px-8x-8px-2px-5px=70px



这样不同的框模型对于精确的布局来说是个巨大威胁,但好在这个问题非常容易解决,而且很少会遇到了,只要你在文档的最开头包含完整的DOCTYPE信息即可



比如


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

不要省略掉这个url。




IE6在相对容器中的绝对定位

如果父元素是  position:relative  定位的元素,同时对子元素进行   position:absolute   定位,特殊性在于这样一种条件,如果对   absolute  定位的元素进行   bottom:0   定位,而与此同时   relative   定位的父元素没有指定高度,那么子元素在  ie6  中将不会出现在它应该出现的位置,而是出现在边距边框处。

要解决也很简单,只需要在针对ie6的样式表中给父元素指定一个 height:1%的高度即可,ie6会忽略掉这个高度。



IE6的空格bug

这个应该都遇到过吧,在导航条里最常见,


<ul>  <li><a href="#">导航1</a></li>  <li><a href="#">导航2</a></li>  <li><a href="#">导航3</a></li>  </ul>

a 元素 display:block。显然上面换行的 li  标记之间有空格,这空格让代码更易读,浏览器也会忽略这个空格,但在诡异的ie6中,则会坚持显示这个空格,结果导致了 ie6下 页面 上导航  li  之间多了一点空间,这是不应该的,解决方法很简单,还是使用几乎万能的 height:1%,将这个1%的高度指定给 a 元素,即可解决这个问题,当然你要在针对ie6的样式表中指定,免得影响其他浏览器。



IE条件注释

最好的方法是不要加任何hack,将所有针对ie6css放在专门的样式表中,然后通过ie专有的条件注释来引入,而其他浏览器会直接忽略


<!--[if lte IE 6]> 中间放针对ie的注释 上面的lte也可以用下面替代 lt 小于 lte 小于等于  gt 大于 gte 大于等于 IE 6 IE 7 IE8 IE 9 <![endif]-->



马·化·腾 发表于 2013-4-13 17:16:47 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ny5678 发表于 2013-4-13 17:28:33 | 显示全部楼层
哦,IE6现在很让人纠结了
回复

使用道具 举报

可爱的轩轩 发表于 2013-4-14 06:15:48 | 显示全部楼层
兼容性确实很重要
回复

使用道具 举报

淘乐部 发表于 2013-4-14 15:13:42 | 显示全部楼层
这个不错~先支持一个~
回复

使用道具 举报

 楼主| jianchang512 发表于 2013-4-14 15:14:52 | 显示全部楼层
淘乐部 发表于 2013-4-14 15:13
这个不错~先支持一个~

真心希望再不用考虑IE6的兼容性了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-10-4 05:29 , Processed in 2.031316 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表