申明:IE7無法測試,所以下面說的IE6指IE6和IE7
1,遇到的問題
今天在查看w3c網站時,發現w3c推薦的導航方法,給li 添加 display:inline-bock; 達到li 平衡排列,當是意想不到的發生了,每個li之間出現了間隙。於是開始下面的不斷的測試。重要代碼如下:
<style type="text/css">
body,div,h1,ul,li{margin:0; padding:0;}
ul,li{list-style:none;}
.nav a{background: red;color:#fff;padding: 5px 10px;}
.nav ul li{display:inline;}
</style>
<div class="nav">
<ul>
<li><a href="#">首頁</a></li>
<li><a href="#">服裝城</a></li>
<li><a href="#">食品</a></li>
<li><a href="#">團購</a></li>
<li><a href="#">奪寶島</a></li>
<li><a href="#">閃購</a></li>
<li><a href="#">金融</a></li>
</ul>
</div>
總結:IE8及以上IE瀏覽器、火狐瀏覽器出現4px間隙,谷歌和IE6瀏覽器出現8px間隙
2,inline元素 inline-block 測試
<style type="text/css">
body,div,h1,ul,li{margin:0; padding:0;}
ul,li{list-style:none;}
.nav a{background: red;color:#fff;padding: 5px 10px;}
.nav ul li{display:inline;}
a{display: inline-block;width:150px;background: red;}
</style>
<a href="#" class="a1">inline元素1</a>
<a href="#" class="a2">inline元素2</a>
結果:除谷歌8px間隙外,其他都是如下效果

3,block元素 inline-block 測試
<style type="text/css">
body,div,h1,ul,li{margin:0; padding:0;}
ul,li{list-style:none;}
.nav a{background: red;color:#fff;padding: 5px 10px;}
.nav ul li{display:inline;}
a{display: inline-block;width:150px;background: red;}
div{display: inline-block;width:150px;background: red;}
</style>
<div class="div1">block元素1</div>
<div class="div2">block元素2</div>
以上測試瀏覽器大都顯示如下

總結:IE6下面 inline-block 表現和 現代瀏覽器 表現不一樣,也就是我們常說的兼容性
4,inline-block在IE6和現代瀏覽器兼容性
為什么會出現這種情況呢?經過查找發現一個 haslayout 的東西,他是在IE8以前存在的。下面是hasLayout 的一些知識,haslayout 是IE在渲染過程中執行,元素的屬性,它的值為true 和 false,跟許多的IE兼容性有關,不過在IE8之后就取消了這個屬性,鑒於現在很少考慮IE6,7,所以這個東西我也沒有再去深究,先解決目前問題。
也就是說,是IE獨有的haslayout屬性影響了 inline-block的表現, 解決辦法:設置 zoom:1; 觸發 haslayout 屬性,但是還不行,最終解決辦法如下:
先設置為 inline樣式,在觸發 haslayout屬性
div{display: inline-block;width:150px;background: red;*display:inline; *zoom:1;/*帶*的是IE6、IE7顯示的*/}
完美解決且無間隙
5,inline-block出現的原因
block元素下的inline-block樣式間隙解決了,inline-block之間的間隙該怎么去除呢?
測試發現,inline元素,之間本身就存在間隙,是不是這個間隙引起的呢?
最終原因:inline元素中間的空白符引起的,解決辦法:就是去掉空白符
第一種方法:除谷歌外的其他瀏覽器間隙是4px,使用margin:-4px; 唯獨谷歌是 雙倍的8px,需要給谷歌單獨設置 margin:-8px;
@media screen and (-webkit-min-device-pixel-ratio:0) { div { margin-right: -8px; } }/*谷歌 HACK 方法*/
第二種方法:刪除代碼間的空白,例如下面兩個a標簽緊挨着
<a href="#" class="a1">inline元素1</a><a href="#" class="a2">inline元素2</a>
可能有多種方法,我寫了個人認為兩種最可靠的
W3C推薦 導航方法(兼容IE6等)
<style type="text/css">
body,div,h1,ul,li{margin:0; padding:0;}
ul,li{list-style:none;}
a{text-decoration: none;}
.nav a{background: red;color:#fff;padding: 10px 20px;margin-right: -4px;line-height: 40px;*margin-right: -8px;/* ie 下面也是 -8px*/}
@media screen and (-webkit-min-device-pixel-ratio:0) { .nav a { margin-right: -8px; } }/*谷歌 HACK 方法*/
.nav ul li{display:inline;}
.nav a:hover{text-decoration: underline;}
</style>
<div class="nav">
<ul>
<li><a href="#">首頁</a></li>
<li><a href="#">服裝城</a></li>
<li><a href="#">食品</a></li>
<li><a href="#">團購</a></li>
<li><a href="#">奪寶島</a></li>
<li><a href="#">閃購</a></li>
<li><a href="#">金融</a></li>
</ul>
</div>
不使用hack方法的話,每個li緊挨着即可,不要留空格等間隙
后續的:
因為在使用中,經常會給導航一個1000px寬度,居中,這個時候就會出現一個padding 和 高度 不相同,一個兼容性,於是用了另一個方法
<style type="text/css">
body,div,ul,li{margin: 0; padding: 0; }
ul,li{list-style: none;}
a{text-decoration: none;}
h1{width: 1000px; margin:0 auto;}
.nav{width: 1000px; margin:0 auto; }
.nav a{display: inline-block; height:40px; padding: 0 25px; background: red;line-height: 40px;background: red;}
.nav li{display: inline;}
.nav a:hover{background: green;color:#fff;}
</style>
</head>
<body>
<!-- ul 設定寬度后,與a標簽的高度會有一個 4px或8px的間隙,造成兼容性-->
<h1>導航一</h1>
<ul class="nav">
<li><a href="#">首頁</a></li><li><a href="#">服裝城</a></li><li><a href="#">食品</a></li><li><a href="#">團購</a></li><li><a href="#">奪寶島</a></li><li><a href="#">閃購</a></li><li><a href="#">金融</a></li>
</ul>
參考文章:
什么是IE的haslayout
inline-block 前世今生
去除inline-block元素間間距的N種方法
