inline-block間隙原因和解決方法(web前端問題)


申明: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種方法

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM