關於inline-block問題

前言

在重新學習css,做自己的學習demo時,設置一堆div在一行顯示,呈現對比。


1240

結果如圖,設置了display:inline-block之後,出現了部分下沉現象。
改爲float之後,又恢復正常對齊。

不過,很快就得到了解決。於是,就寫了這篇關於inline-block問題的文章,包含了以前分享過的間距問題,在這裏與大家分享。

一、下沉問題

原因

1. 行內元素有一個基線,所有在這一行中的元素都以這條基線爲準對齊。

如文字:


1240

而行內塊元素,如圖片等,會以底部爲準對齊:


1240

2. 文本在容器中默認是上對齊的,且不能設置其他垂直對齊方式

要設置垂直居中之類的,只能用p標籤或者其他標籤包含之後,設置這些標籤的對齊方式

3. 文本是老大,它不遷就別人,只有容器靠下來遷就它。

這是個很奇怪的現象,行內塊元素的基線原本是底部,在有文本之後,該元素的基線就變成了文本的基線,爲了與其他元素對齊,才導致下沉。

解決方案

1. 設置vertical-align

元素的默認vertical-align爲baseline,也就是基線。把它的值設置爲其他值,就能實現其他方式的對齊,如top、bottom、text-bottom、text-top、middle等,同高度下,效果相同。

display: inline-block;
verticla-align: top;

CSS vertical-align 屬性

2. 使用float等其他方法替換inline-block

當然,在這裏說到用其他方法還有很多,已經與inline-block無關了,所以也不多說。

二、間距問題

原因

行內塊元素或者設置成inline-block的元素之間,會自動存在間距。

1240

這種表現是符合規範的應該有的表現。但是,在某些情況卻會對我們的佈局造成影響。

解決方法

1. 使用margin負值

.space a { 
    display: inline-block;
    margin-right: -3px;
}

margin負值的大小與上下文的字體和文字大小相關,其中,間距對應大小值可以參見“基於display:inline-block的列表佈局”一文part 6的統計表格:

inline-block元素間間隔大小與字體和文字大小之前的關係表截圖
inline-block元素間間隔大小與字體和文字大小之前的關係表截圖

例如,對於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-spacingword-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方法的組組合合。

感謝

去除inline-block元素間間距的N種方法
inline-block之後意外發現塊下沉

發佈了37 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章