前言
在重新學(xué)習(xí)css,做自己的學(xué)習(xí)demo時(shí),設(shè)置一堆div在一行顯示,呈現(xiàn)對(duì)比。

結(jié)果如圖,設(shè)置了display:inline-block之后,出現(xiàn)了部分下沉現(xiàn)象。
改為float之后,又恢復(fù)正常對(duì)齊。
不過,很快就得到了解決。于是,就寫了這篇關(guān)于inline-block問題的文章,包含了以前分享過的間距問題,在這里與大家分享。
一、下沉問題
原因
1. 行內(nèi)元素有一個(gè)基線,所有在這一行中的元素都以這條基線為準(zhǔn)對(duì)齊。
如文字:

而行內(nèi)塊元素,如圖片等,會(huì)以底部為準(zhǔn)對(duì)齊:

2. 文本在容器中默認(rèn)是上對(duì)齊的,且不能設(shè)置其他垂直對(duì)齊方式
要設(shè)置垂直居中之類的,只能用p標(biāo)簽或者其他標(biāo)簽包含之后,設(shè)置這些標(biāo)簽的對(duì)齊方式
3. 文本是老大,它不遷就別人,只有容器靠下來遷就它。
這是個(gè)很奇怪的現(xiàn)象,行內(nèi)塊元素的基線原本是底部,在有文本之后,該元素的基線就變成了文本的基線,為了與其他元素對(duì)齊,才導(dǎo)致下沉。
解決方案
1. 設(shè)置vertical-align
元素的默認(rèn)vertical-align為baseline,也就是基線。把它的值設(shè)置為其他值,就能實(shí)現(xiàn)其他方式的對(duì)齊,如top、bottom、text-bottom、text-top、middle等,同高度下,效果相同。
display: inline-block;
verticla-align: top;
2. 使用float等其他方法替換inline-block
當(dāng)然,在這里說到用其他方法還有很多,已經(jīng)與inline-block無關(guān)了,所以也不多說。
二、間距問題
原因
行內(nèi)塊元素或者設(shè)置成inline-block的元素之間,會(huì)自動(dòng)存在間距。

這種表現(xiàn)是符合規(guī)范的應(yīng)該有的表現(xiàn)。但是,在某些情況卻會(huì)對(duì)我們的布局造成影響。
解決方法
1. 使用margin負(fù)值
.space a {
display: inline-block;
margin-right: -3px;
}
margin負(fù)值的大小與上下文的字體和文字大小相關(guān),其中,間距對(duì)應(yīng)大小值可以參見“基于display:inline-block的列表布局”一文part 6的統(tǒng)計(jì)表格:

例如,對(duì)于12像素大小的上下文,Arial字體的margin負(fù)值為-3像素,Tahoma和Verdana就是-4像素,而Geneva為-6像素。
由于外部環(huán)境的不確定性,以及最后一個(gè)元素多出的父margin值等問題,這個(gè)方法不適合大規(guī)模使用。
2. 使用font-size:0
類似下面的代碼:
.space {
font-size: 0;
}
.space a {
font-size: 12px;
}
這個(gè)方法,基本上可以解決大部分瀏覽器下inline-block元素之間的間距(IE7等瀏覽器有時(shí)候會(huì)有1像素的間距)。不過有個(gè)瀏覽器,就是Chrome, 其默認(rèn)有最小字體大小限制,因?yàn)?,考慮到兼容性,我們還需要添加:類似下面的代碼:
.space {
font-size: 0;
-webkit-text-size-adjust:none;
}
點(diǎn)擊這里查看示例:font-size:0清除換行符間隙demo
補(bǔ)充:目前Chrome瀏覽器已經(jīng)取消了最小字體限制。因此,上面的-webkit-text-size-adjust:none;代碼估計(jì)時(shí)日不多了。
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;
}
一個(gè)是字符間距letter-spacing,一個(gè)是單詞間距word-spacing,大同小異。據(jù)我測試,word-spacing的負(fù)值只要大到一定程度,其兼容性上的差異就可以被忽略。因?yàn)?,貌似,word-spacing即使負(fù)值很大,也不會(huì)發(fā)生重疊。
點(diǎn)擊這里查看示例:word-spacing與元素間距去除demo
您使用Chrome瀏覽器,可能看到的是間距依舊存在。確實(shí)是有該問題,原因我是不清楚,不過我知道,可以添加display: table;或display:inline-table;讓Chrome瀏覽器也變得乖巧。
.space {
display: inline-table;
word-spacing: -6px;
}
5. 其他成品方法
下面展示的是YUI 3 CSS Grids 使用letter-spacing和word-spacing去除格柵單元見間隔方法(注意,其針對(duì)的是block水平的元素,因此對(duì)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;
}
以下是一個(gè)名叫RayM的人提供的方法:
li {
display:inline-block;
background: orange;
padding:10px;
word-spacing:0;
}
ul {
width:100%;
display:table; /* 調(diào)教webkit*/
word-spacing:-1em;
}
.nav li {
*display:inline;
}
也就是上面一系列CSS方法的組組合合。