CSS 2.1 中為何規定行內塊元素的「overflow」為非「visible」時其基線是底部外邊界?

The baseline of an "inline-block" is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its "overflow" property has a computed value other than "visible", in which case the baseline is the bottom margin edge.

規範地址:Visual formatting model details

Demo:JS Bin - Collaborative JavaScript Debugging

示例中,overflow 為 auto 時,按照規範的表現應該是這樣的:

Chrome 30 之前表現存在錯誤:


inline-block 的 baseline 是一個坑。(inline-block 這個本來就是後加的,在最早的 CSS2 里是沒有的。從這個角度說,inline-block 的行為更多的是 CSS 2.1 對瀏覽器實現的確認,也就是基於瀏覽器開發者對 CSS 的理解和推導,而不是 CSS 最初設計者的想法。

顯然,在 overflow: visible 時的定義並不能用於非 visible ,因為當有 scrolling 時,你無法確定 last line box 的位置。那麼這個時候,合理的定位就只有 box 的邊界。而這個 box 實際上類似 iframe,所以從一致性上說應底邊對齊。

然而這在 overflow: visible 時造成問題,當元素有內容(與最後一行對齊)和沒有內容(與底邊對齊)時,布局會發生顯著的變化。計子@程劭非 曾吐槽過這個。

相對來說,如果默認行為是與首行而不是末行對齊可能就沒有這個問題,但是這樣與圖片對齊(圖片底邊與父元素的 baseline 對齊)看上去就太不一致。而圖片對齊是 CSS1 時代確定的,當時並沒有 inline-block 。

所以在 CSS Line Layout Module Level 3 規範中,對這塊做了重新定義,比如可以通過 inline-box-align: initial 設定使用首行對齊,也可以指定與任意行對齊。


推薦閱讀:

關於阿里巴巴的矢量圖標與傳統的雪碧圖有什麼優勢?
apache django 間交互的問題?
Meterial Design 按鈕陰影疑惑?
誰能介紹下web前端工程化?
前端開發中提到的「腳手架」到底指什麼,CLI?gulp 和 gulp-cli有什麼區別

TAG:前端開發 | CSS | Web標準 | CSS布局 |