在IE6下运行上面的代码,会出现大家经常会碰到的padding加倍的现象(鼠标移上去能更清楚地看到a元素底部有padding值)
经过一些测试,我个人看法是这个现象是由IE6下浮动元素有3px的bug引起。
大家都知道:IE6下,当子元素的宽度大于父元素的宽度时,父元素会被撑破,而IE7以及FF等不会
在测试例子中,我给父元素加了padding-top:10px的属性,当子元素a浮动之后,多出了3px,
而这3px宽度没有向右撑破,却是被挤得换行了,在视觉上,第二行就有了10px的高度(来自padding-top的值),形成一个padding加倍的假象
结论: padding加倍假象的根本原因是IE6的3px引起的,与a:hover无关
解决: 1. 在a标签后加"<br />"标签即可
2. 给a标签和a:hover 设置同样的背景色
-----------------------------------------我是分割线--------------------------------------------
另外在下面的代码中,给子元素a加上background-color属性,运行,发现第二行的padding-top消失了
而当a:hover的background-color值发生变化时第二行的padding-top又回来了
这样就会给人一种假象:即以为是a:hover引起“padding加倍”
(a:hover的其他属性改变时也paddint-top也会回来,如改变font-size)
为什么给a加上background-color,第二行的padding-top就消失了呢?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="author" content="colinivy" />
<title> Colinivy's world</title>
<style type="text/css">
* {
margin:0; padding:0; list-style:none;
}
body {
font:normal 12px/30px 宋体;
}
#test {
border: 1px solid #ddd;
padding-top:0px;
width:200px;
overflow:hidden;
}
#test a {
float:left;
width:200px;
/*background-color:#eee; */
}
#test a:hover {
background-color:#ddd;
}
</style>
</head>
<body>
<div id="test">
<a href="#" target="_blank">柯零艾薇</a>
</div>
</body>
</html>
关于IE6下line-height属性失效问题,以前也遇到过几次。不过由于时间关系,没有深究,就用padding解决了。今天又遇到了问题,最后发现IE6下line-height属性失效是由于文字中包含img、input、select、textarea、button、object造成的。
解决办法:
对和文字相连接的img、input、textarea、select、object等元素加以属性:
margin: (所属line-height-自身高度)/2px 0;
vertical-align:middle;
下面是实例演示代码,请在IE6中运行
当li的子元素中有浮动(float)时,IE6/IE7中li会产生3px空隙的bug的。
经过测试发现:li的子元素浮动只是这个bug产生的必要条件,这个bug产生的充要条件是li的子元素浮动并且li设置了以下CSS属性之一:width、height、zoom、padding-top、padding-bottom、margin-top、margin-bottom。
知道了这个bug的产生条件,所以解决方法也就有了:
- 方法1
- #list div设置clear:left|both,这时#list li不能设置width、height、zoom。
- 方法2
- #list li设置float:left,这时#list li可以设置width、height、zoom。
- #list li设置clear:left|both,这时#list li不能设置width、height、zoom。
- 方法3
特别感谢 meimei 的指教,IE6/IE7的这个Bug可以通过给li中的div设置vertical-align:top|middle|bottom解决。太怪异了,只要加上vertical-align的值是三者之一即可。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>IE6/IE7中li底部3px的Bug</title><style type="text/css">ul{margin:0;padding:0;list-style:none;}hr{clear:both;}.list li{width:420px;}.list div{float:left;width:400px;height:24px;background:red;}.v-top div{vertical-align:top;}.v-middle div{vertical-align:middle;}.v-bottom div{vertical-align:bottom;}</style></head><body><ul class="list"> <li><div>vapour</div></li> <li><div>百度</div></li> <li><div>淘宝</div></li> <li><div>迅雷</div></li> </ul><hr /><ul class="list v-top"> <li><div>vapour</div></li> <li><div>百度</div></li> <li><div>淘宝</div></li> <li><div>迅雷</div></li> </ul><hr /><ul class="list v-middle"> <li><div>vapour</div></li> <li><div>百度</div></li> <li><div>淘宝</div></li> <li><div>迅雷</div></li> </ul><hr /><ul class="list v-bottom"> <li><div>vapour</div></li> <li><div>百度</div></li> <li><div>淘宝</div></li> <li><div>迅雷</div></li> </ul></body></html>
测试页面兼容时,经常会遇到多余空白问题:IE6/IE7中li底部3px的Bug,img在IE6和IE7中导致父层DIV高度多了4px。
无论是IE6/IE7,还是IE8/FF/Opera/Chrome都存在这样的问题,只不过是产生的原因各不相同:IE6/IE7中的空隙是因为img前后的空格、换行、回车、缩进产生的;IE8/FF/Chrome/Opera则是line-height和font-size导致的。下面分别列举最常见的情况:
1、li-img
<li><img src="garden01.jpg" /></li>
<li><img src="garden01.jpg" /></li>
<li><img src="garden01.jpg" /></li>
</ul>
- li 的子元素包含图片元素(img),会导致li底部多余6px-7px的空隙
- 用vertical-align:top|middle|bottom都可以消除li底部多余的6px-7px空隙。兼容各个主流浏览器
- IE6/IE7以外的其它浏览器,还可以给img设置display:block来消除的多余6px-7px空隙,或者设置float:left|right来隐式将img设置成块状元素block
2、li-inline
<li><span>http://www.dovapour.com.cn/</span></li>
<li><span>http://www.baidu.com/</span></li>
<li><span>http://www.taobao.com/</span></li>
</ul>
li 的儿子元素是内联元素(inline),会导致li底部出现空隙。
解决办法1:将内联元素(inline)设置成display:inline-block。兼容各个浏览器。
解决办法2:将内联元素(inline)设置成display:block。另外再用zoom:1触发layout来兼容IE6。
3、li-block
<li><div>http://www.dovapour.com.cn/</div></li>
<li><div>http://www.baidu.com/</div></li>
<li><div>http://www.taobao.com/</div></li>
</ul>
<style type="text/css">
.list-float li{
width:300px;
}
.list-float div{
clear:left;
float:left;
background:#CCC;
}
</style>
当li设置了width,并且li的儿子元素设置了float:left|right和clear:both|left|right,会导致li底部出现3px-4px空隙。
解决办法:给li的儿子元素设置vertical-align:top|middle|bottom。
4、float-img
<ul>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
<li><img src="garden01.jpg"></li>
</ul>
</div>
<style type="text/css">
.float-img{
width:600px;
background:#F1F1F1;
}
.float-img ul{
padding:10px;
zoom:1;
}
.float-img li{
float:left;
background:red;
}
.float-img img{
border:2px solid orange;
vertical-align:middle;
}
</style>
给li设置float:left|right,ul设置padding-top:10px;会导致IE6/IE7中每个li都增加了10px的垂直空隙。
解决方法:通过设置width、height、zoom等方法触发ul 的layout。
另外:将上面的ul和li 都替换成div也存在这个问题,看来这个bug不是li 独有的。
总结:多余空白问题都可以通过设置vertical-align:top|middle|bottom来解决。第4种情况有点特殊需要触发layout
null




