本文转载自 沧海难为水_前端之路 的百度空间。
http://hi.baidu.com/zhangqian04062/item/c5603400ecff4419cd34ea3c
相信做前端的童鞋都知道,在整个前端开发过程中,总是IE6问题多多,BUG多多,这点也最让布局者头疼。在这里,就之前工作中遇到的问题做了个总结,借此分享、希望对大家能有所帮助,对于不足之处,还望高手多多指点。
1、浮动元素的双倍margin
说明:这是IE6及其以下版本的一个经典的BUG,触发这个BUG产生的条件是给元素设置了浮动并且同一方向设置了margin值。来看以下代码:
<style type="css/text">
body,div { margin:0; padding:0; }
.wrap { width:300px; height:100px; background:#ccc; }
.float { float:left; width:30px; height:30px; background:#f00; margin:0 0 0 20px;}
</style>
<div class="wrap">
<div class="float"></div>
</div>
解决方案:改变浮动元素的显示类型,如.float {display:inline; }
2、浮动元素与非浮动元素相邻时的3像素BUG
说明:这个3像素BUG也是IE6下一个臭名昭著的BUG。一个大盒子中有两个小盒子,其中一个盒子浮动另外一个不浮动,这时在IE6下中间就会有3像素的间距。这里,我们借用问题1中的代码:
<style type="css/text">
body,div { margin:0; padding:0; }
.wrap { width:300px; height:100px; background:#ccc; }
.float { float:left; width:30px; height:30px; background:#f00; margin:0 0 0 20px;}
.floatNone { width:30px; height:30px; background:#f0f; }
</style>
<div class="wrap">
<div class="float"></div>
<div class="floatNone"></div>
</div>
运行以下代码,你会发现两个盒子中间会有3像素的间距,其实解决方法很简单,让另外一个盒子也浮动就可以了。
或者可以给左边的盒子利用IE6的HACK来设置_margin-right:-3px; ,以清除间距。
3、浮动与绝对定位混用产生的BUG
说明:一个盒子,里面包含了2个浮动的盒子和一个绝对定位的盒子。当设置某些属性值的时候,绝对定位的盒子会在IE6下消失。这种情况并不是每次用到了就会发生,只是当属性设置到一定程度时才会发生,具体的我们来看下面代码:
<style type="text/css">
body,div { margin:0; padding:0;}
.box { width:600px;}
.box1 { position:absolute; left:0; top:0; width:10px; height:10px; background:#f0f; }
.box2 { float:left; width:300px; height:30px; background:#f00; }
.box3 { float:left; width:300px; height:30px; background:#ff0; }
</style>
<div class="box">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
</div>
运行上而代码,你会发现在IE6中使用绝对定位的那个盒子竟然离奇地消失了,这让很多开必者甚是头疼。由问题2我们知道,浮动与非浮动元素相邻时候,会产生3像素间距,那么这个绝对定位元素的消失与这3像素间距有关吗?(留个疑问,感兴趣的可以自己测试哈)
下面我们来看个体的解决方案:
(1)、给父级盒子加上display:inline;
(2)、浮动元素宽度相加+2<父级宽度,此时可以给浮动元素设置_margin-left:-3px;或者_margin-right:-3px;
(3)、给任意浮动元素前面添加一个空盒子;
(4)、给绝对定位元素外面嵌套一个盒子;
4、鬼影或者克隆文本
说明:父元素的内部有多个浮动;最后一个浮动元素前有隐藏元素(包含注释与属性隐藏);子元素的宽度与父元素相同,或者父元素的宽度减去子元素宽度小于3像素;
这种现象算是随机产生的吧、有时候也看个人运气,所以目前尚无参考例子可寻哦。。。见谅!
解决方案:
1、去掉注释或者使用条件注释(<!--[if ie6]><![endif]-->);
2、给浮动的子元素加上display:inline;属性;
5、overflow:auto;与position:relative;的碰撞
这也BUG也称作“距出边界的BUG”,它只出现在IE6、7中。两个块元素,父元素设置了overflow:auto; 子元素设置了相对定位,当子元素的高度大于父元素的高度时,IE6、7下会产生一个很难看的BUG,怎么个难看法,这里我就不再损他们了,大家还是先来看看代码哈:
<div style="width:300px; height:200px; overflow:auto; background:#ccc; ">
<div style="width:80%; height:300px; position:relative; background:#f00;"></div>
</div>
运行代码,大家可以自己测试哈看看差异。^_^
解决方案:给父级元素设置属性position:relative;
6、LI的阶梯BUG
这是一个很有意思的BUG,存在于IE6、7中,当我们在使用UL LI来布局的时候,给LI里面的元素浮动(比如: a),就会出现这种情况;具体我们来看代码哈:
<style type="css/text">
body,ul { margin:0; padding:0; }
li { list-style:none; }
a { text-decoration:none; }
.list { width:300px; height:100px; background:#ccc; }
.list li a { float:left; width:100px; height:25px; line-height:25px; background:#f00;}
</style>
<ul class="list">
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >01</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >02</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >03</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >04</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >05</a></li>
</ul>
不信我说的现象,你可以试试哈。就复制上面代码然后运行瞧瞧
…………
……
怎么样,问题出来了吧?呵呵
遇到这种情况,我想大家也都有自己的解决方法。这里呢?我个人觉得是给LI加浮动比较稳妥,至于A如果要求设置宽高,可以转化为块级元素,这个仅是个人见解。这个实例呢,是在一个论坛中看到的、所以借过来与大家分享一下。
7、LI的空白间距
这出中关于LI的一个BUG,存在于IE6/7中。有时候会无端地在LI与LI间增加一个垂直间距。不多说,先来看看代码吧:
<style type="css/text">
body,ul { margin:0; padding:0; }
.list { width:300px; }
.list li { list-style:none; line-height:30px; }
.list li a { text-decoration:none; background:#f00; display:block}
</style>
<ul class="list">
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >01</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >02</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >03</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >04</a></li>
<li><a href="#" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >05</a></li>
</ul>
对于网站中一些比较宽松且设了相近背景色布局,或许你看不出这其中的间距差异问题。那么,现在我们针对这点来做一个demo。大家可以复制代码看看效果;
对了这种情况,解决方案也是多种的。大家见仁见智吧,,下面我列举一下自己平时常用的一些处理方法;
1、给A标签设置宽度(根据实际情况来);
2、给LI添加属性display:inline;
3、给LI设置1像素的底边线(颜色与背景色一致);这种方法一般不推荐使用吧,因为一旦背景色是渐变或者其他情况,他就暴露了。如果再用margin-bottom:-1px;来隐藏这条线,那就走远路了,何必舍本逐末呢。。。