前言
在重新學習css,做自己的學習demo時,設置一堆div在一行顯示,呈現對比。
結果如圖,設置了display:inline-block之後,出現了部分下沉現象。
改爲float之後,又恢復正常對齊。
不過,很快就得到了解決。於是,就寫了這篇關於inline-block問題的文章,包含了以前分享過的間距問題,在這裏與大家分享。
一、下沉問題
原因
1. 行內元素有一個基線,所有在這一行中的元素都以這條基線爲準對齊。
如文字:
而行內塊元素,如圖片等,會以底部爲準對齊:
2. 文本在容器中默認是上對齊的,且不能設置其他垂直對齊方式
要設置垂直居中之類的,只能用p標籤或者其他標籤包含之後,設置這些標籤的對齊方式
3. 文本是老大,它不遷就別人,只有容器靠下來遷就它。
這是個很奇怪的現象,行內塊元素的基線原本是底部,在有文本之後,該元素的基線就變成了文本的基線,爲了與其他元素對齊,才導致下沉。
解決方案
1. 設置vertical-align
元素的默認vertical-align爲baseline,也就是基線。把它的值設置爲其他值,就能實現其他方式的對齊,如top、bottom、text-bottom、text-top、middle等,同高度下,效果相同。
display: inline-block;
verticla-align: top;
2. 使用float
等其他方法替換inline-block
當然,在這裏說到用其他方法還有很多,已經與inline-block
無關了,所以也不多說。
二、間距問題
原因
行內塊元素或者設置成inline-block的元素之間,會自動存在間距。
這種表現是符合規範的應該有的表現。但是,在某些情況卻會對我們的佈局造成影響。
解決方法
1. 使用margin負值
.space a {
display: inline-block;
margin-right: -3px;
}
margin負值的大小與上下文的字體和文字大小相關,其中,間距對應大小值可以參見“基於display:inline-block的列表佈局”一文part 6的統計表格:
例如,對於12像素大小的上下文,Arial字體的margin
負值爲-3
像素,Tahoma和Verdana就是-4
像素,而Geneva爲-6
像素。
由於外部環境的不確定性,以及最後一個元素多出的父margin值等問題,這個方法不適合大規模使用。
2. 使用font-size:0
類似下面的代碼:
.space {
font-size: 0;
}
.space a {
font-size: 12px;
}
這個方法,基本上可以解決大部分瀏覽器下inline-block元素之間的間距(IE7等瀏覽器有時候會有1像素的間距)。不過有個瀏覽器,就是Chrome, 其默認有最小字體大小限制,因爲,考慮到兼容性,我們還需要添加:類似下面的代碼:
.space {
font-size: 0;
-webkit-text-size-adjust:none;
}
點擊這裏查看示例:font-size:0清除換行符間隙demo
補充:目前Chrome瀏覽器已經取消了最小字體限制。因此,上面的-webkit-text-size-adjust:none;代碼估計時日不多了。
3. 使用letter-spacing
類似下面的代碼:
.space {
letter-spacing: -3px;
}
.space a {
letter-spacing: 0;
}
該方法可以搞定基本上所有瀏覽器,不過Opera瀏覽器下有蛋疼的問題:最小間距1像素,然後,letter-spacing
再小就還原了。
4. 使用word-spacing
類似下面代碼:
.space {
word-spacing: -6px;
}
.space a {
word-spacing: 0;
}
一個是字符間距letter-spacing
,一個是單詞間距word-spacing
,大同小異。據我測試,word-spacing
的負值只要大到一定程度,其兼容性上的差異就可以被忽略。因爲,貌似,word-spacing即使負值很大,也不會發生重疊。
點擊這裏查看示例:word-spacing與元素間距去除demo
您使用Chrome瀏覽器,可能看到的是間距依舊存在。確實是有該問題,原因我是不清楚,不過我知道,可以添加display: table;
或display:inline-table;
讓Chrome瀏覽器也變得乖巧。
.space {
display: inline-table;
word-spacing: -6px;
}
5. 其他成品方法
下面展示的是YUI 3 CSS Grids 使用letter-spacing
和word-spacing
去除格柵單元見間隔方法(注意,其針對的是block水平的元素,因此對IE8-瀏覽器做了hack處理):
.yui3-g {
letter-spacing: -0.31em;/* webkit */
*letter-spacing: normal; /* IE < 8 重置 */
word-spacing: -0.43em; /* IE < 8 && gecko */
}
.yui3-u {
display: inline-block;
zoom: 1;
*display: inline; /* IE < 8: 僞造 inline-block */
letter-spacing: normal;
word-spacing: normal;
vertical-align: top;
}
以下是一個名叫RayM的人提供的方法:
li {
display:inline-block;
background: orange;
padding:10px;
word-spacing:0;
}
ul {
width:100%;
display:table; /* 調教webkit*/
word-spacing:-1em;
}
.nav li {
*display:inline;
}
也就是上面一系列CSS方法的組組合合。