字母’x’在CSS世界中的角色和故事
一、不起眼的字母’x’
首先,我們這里的字母 'x'
就是26個英文字母 a
, b
, c
, ...
中的 x
.
由于自身形態的一些特殊性,因此,這個小小的不起眼的字母擔當大任,在CSS世界中扮演了一個重要的角色。
有人可能的第一反應是:“我知道,可以模擬關閉按鈕的那個叉叉效果!”
這位同學思維很活躍,但是呢,本文所要介紹的字母 'x'
和CSS的關系不是奇巧淫技,而是正統的術語上的緊密聯系。
二、字母’x’與CSS中的基線
在各種內聯相關模型中,凡是涉及到垂直方向的排版或者對齊的,都離不開最最基本的基線( baseline
)。例如, line-height
行高的定義就是兩基線的間距; vertical-align
的默認值就是基線;其他中線頂線一類的定義也離不開基線;基線甚至衍生出了:
- “alphabetic” baseline: “字母”基線 – 英文
- “hanging” baseline: “懸掛”基線 – 印度文
- “ideographic” baseline: “表意”基線 – 中文
那大家知道基線又是如何定義的嗎?
哈,基線的定義就離不開本文的男主角 'x'
.
字母x的下邊緣(線)就是我們的基線。
對,是字母 x
, 不是字母 s
之類下面有尾巴的字母。
三、字母’x’與CSS中的x-height
字母 'x'
與CSS的故事遠不止基線這么簡單。CSS中有一個概念叫做 "x-height"
, 指的是字母 'x'
的高度。
有人可能會疑問了,“一個字母的高度跟我CSS布局排版有半毛錢關系啊?”
實際上關系可大了。
首先,需要了解下 "x-height"
的含義,通俗講, "x-height"
就是指的小寫字母 'x'
的高度;術語描述就是基線和等分線[mean line](也稱作中線[midline])之間的距離。
維基上有這么個示意圖:

"x-height"
的示意范圍一目了然,了然于心,于心不忍,不忍直視。
上面圖中還出現了其他的名詞,這里簡單說下我的理解:
- ascender height: 上下線高度
- cap height: 大寫字母高度
- median: 中線
- descender height: 下行線高度
然后,CSS中有些屬性值的定義就和這個 "x-height"
的有關,最典型的代表就是: vertical-align: middle
.
這里的 middle
是中間的意思,注意,跟上面的 median
中線不是一個意思。規范中對垂直對齊的 middle
這么解釋的:
middle:This identifies a baseline that is offset from the alphabetic baseline in the shift-direction by 1/2 the value of the x-height font characteristic. The position of this baseline may be obtained from the font data or, for fonts that have a font characteristic for “x-height”, it may be computed using 1/2 the “x-height”. Lacking either of these pieces of information, the position of this baseline may be approximated by the “central” baseline.
大意就是: middle
指的是基線往上1/2 "x-height"
高度。我們可以近似腦補成字母 x
交叉點那個位置。
有此可見, vertical-align: middle
并不是絕對的垂直居中對齊,我們平常看到的 middle
效果只是一種近似的效果。原因很簡單,因為不同的字體,其在行內盒子中的位置是不一樣的,比方說’微軟雅黑’就是一個字符下沉比較明顯的字體,所有字符的位置相比其他字體要偏下一點。要是 vertical-align: middle
是相對容器中分線對齊,呵呵,你會發現圖標和文字不在一條線上,而相對于字符 x
的中心位置對齊,我們肉眼看上去就好像和文字居中對齊了。
四、字母’x’與CSS中ex
字母 'x'
衍生出了 "x-height"
概念,并在這個基礎上深耕細作,進一步衍生出了 ex
, 注意,這里的 ex
不是前任的意思,而是地地道道CSS中的一個尺寸單位。
大家可能都聽過用過 em
, px
甚至用過 rem
, 說不定對連IE6都老早支持的 ex
單位卻很陌生。
ex
是CSS中的一個相對單位,指的的是小寫字母 x
的高度,沒錯,就是指 "x-height"
.
那這個單位有什么實際用途呢?我只能呵呵,貌似沒啥實際用途,否則也不會這么不為人所知。
是這樣嗎?
五、單位ex的價值與實用性
存在必有價值。我們細細思考字母 "x"
在CSS世界中扮演的角色,就會發現 ex
的價值所在。
首先,需要明確一點,雖然說尺寸單位的作用是限定元素的尺寸,但是,由于字母 "x"
受字體和環境影響大,參考性太低,因此 ex
顯然不太適合做這個。那問題來了, ex
連自己的本職工作都做不好,難道還指望其副業開掛?
沒錯, ex
的價值就在其副業上——不受字體字號影響的內聯元素的垂直居中對齊效果。
我們都知道,內聯元素默認是基線對齊的,而基線就是 x
的底部,而 1ex
就是一個 x
的高度。設想下,假如我們圖標高度就是 1ex
, 同時背景圖片居中,豈不是圖標和文字天然垂直居中,而且,完全不受字體和字號的影響。因為 ex
就是一個相對于字體字號的單位。
文字表述蒼白,我們看個例子,下圖所示的文字后面跟個小三角圖標的效果是非常常見的:

現在,要讓該圖標和文字中間位置排整齊,你是如何實現?
尺寸啪啪,然后 vertical-align: middle
?
這樣雖然也有效果,但是,實際上啰嗦了,借助 ex
單位,我們直接借助默認的 baseline
對齊就可以實現我們的效果!
如下CSS代碼:
.icon-arrow { display: inline-block; width: 20px; height: 1ex; background: url(arrow.png) no-repeat center; }
然后就華麗麗地對齊了,完全沒有 vertical-align
出場的機會。
您可以狠狠地點擊這里: ex高度圖標和字符天然對齊Demo
會發現,字體,文字大小全變化,對齊依舊良好:

雖然使用 ex
做高度實現天然垂直對齊看上去很巧妙,但是,也是有局限的,就是如果圖標背景的高度超過 1ex
,我們就只能再請 vertical-align
出馬了……
對了,還有一點。由于IE6-IE7對內聯模型的解釋有問題,因此,各類 vertical-align
在這些瀏覽器下都是有問題,包括這里的 ex
天然基線對齊,需要特別處理下。
六、結束語
外面的雨嘩啦啦的下了一整天,我的釣魚大計啊,就此泡湯。
要是現在在老家就好了,溝溝渠渠里一定都是從魚塘跑出來的魚,下水摸魚捕魚不知有多快活。
不過話說,這陰雨天適合釣鯰魚,要不待會兒冒雨出去碰碰運氣?
話說本文的 id
是4848, 有些不吉利啊。不過反而來講,可能是對魚兒說的!
有道理,寫完就去釣會兒魚,我有大頭,下雨不愁!
本文為原創文章,會經常更新知識點以及修正一些錯誤,因此轉載請保留原出處,方便溯源,避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。
(本篇完)