摘要:那不是,是我不懂而已。的用途之一西文是以空格來分隔單詞的,而漢字間則無需空格分隔,但為了統一西文東亞和的排版,于是抽象出一個名為的概念用于分隔詞義單元,則作為的值域,而定義域就是語言信息。
前言
每當來個需要既要水平排版又要設置固定高寬時,我就會想起display:inline-block,還有為了支持IE5.5/6/7的hack*display:inline;*zoom:1;。然后發現盒子間無端端多了個不可選的空白符,于是想盡辦法修復這個bug。
直到一天拜讀了@一絲姐、@HAX等高人的秘笈后才頓悟,原來我錯了。那不是bug,是我不懂而已。
先行者——IE5.5中的inline-block當我們為支持IE5.5/6/7而添加這段hack時*display:inline;*zoom:1,總以為從IE8開始才支持display:inline-block屬性值。其實從IE5.5開始已經支持了,只是IE5.5/6/7支持的是IE的自定義標準,而從IE8開始則是支持CSS2.1標準而已。
https://msdn.microsoft.com/library/ms530751%28v=vs.85%29.aspx
The inline-block value is supported starting with Internet Explorer 5.5. You can use this value to give an object a layout without specifying the object’s height or width.
經過CSS2.1洗禮的我們對上述內容不禁會發出兩個疑問:
為啥block-level element設置了display:inline-block后還是垂直方向排列呢?
為啥inline-level element設置了display:inline-block后之間沒有詭異的間隙呢?
還記得楊過是如何變成神雕大俠的嗎?不就是被斷右臂后發現左手才是真愛嗎:)
好了,其實我的意思是拋棄過去對display:inline-block的認知,重新來理解IE5.5/6/7下的它才是硬道理啦。
對于問題1,首先上面的引用很直白地告訴我們——display:inline-block能觸發hasLayout,然后就沒了。所以block-level element依然是block-level element,不會一夜成了inline-level element的。結論:display:inline-block僅會觸發hasLayout,而元素本該怎么排版還是怎么排版。關于hasLayout的內容可參考《CSS魔法堂:hasLayout原來是這樣!》
對于問題2,我們先看看是否真的沒有間隙吧!
bk1
見鬼了,在前一個盒子內添加些文本就出現間隙了?其實這真的和display:inline-block無關的,大家就放過他吧!來上呈堂證供!
beforebeforeafterafterafterone twoone two
chrome43
對于起始標簽與第一個non-white-space字符間的white-space字符串,以carriage return( )作為white-space合并單元的起始符,最后保留各合并單元的合并結果。
結束標簽與最后一個non-white-space字符間的white-space字符串,以carriage return( )作為white-space合并單元的結束符,最后保留各合并單元的合并結果。
詞義單元間的white-space字符串,以carriage return( )作為white-space合并單元的分界符,最后保留各合并單元的合并結果。
標簽內僅包含white-space字符串,那么這些white-space字符串將被忽略。
FF5.0
對于起始標簽與第一個non-white-space字符間和結束標簽與最后一個non-white-space字符間的white-space字符串將被忽略。
詞義單元間的white-space字符串,以carriage return( )作為white-space合并單元的分界符,最后保留各合并單元的合并結果。
標簽內僅包含white-space字符串,那么這些white-space字符串將被忽略。
IE8+
對于起始標簽與第一個non-white-space字符間和結束標簽與最后一個non-white-space字符間的white-space字符串將被忽略。
詞義單元間的white-space字符串,合并為1個(ASCII space)字符。
標簽內僅包含white-space字符串,那么這些white-space字符串將被忽略。
IE5.5/6/7
對于起始標簽與第一個non-white-space字符間的white-space字符串將被忽略。
結束標簽與最后一個non-white-space字符間的white-space字符串,合并為1個(ASCII space)字符。
詞義單元間的white-space字符串,合并為1個(ASCII space)字符。
標簽內僅包含white-space字符串,那么這些white-space字符串將被忽略。
合并單元:合并單元包含0到N個white-space字符串,最終合并為0到1個white-space字符
SGML描述B.3.1 Line breaks
specifies that a line break immediately following a start tag must be ignored, as must a line break immediately before an end tag. This applies to all HTML elements without exception.
My favorite Website My favorite Website
望文生義翻譯法:標簽與正文間的line breaks要被忽略掉!也就是上下兩種HTML格式的渲染效果應該一致。實際上除了IE5.5/6/7外其他瀏覽器均遵守之一規定的。也許你會說上面的實驗不是已經證明chrome43不遵守這個法則嗎?其實
My favorite Website
HTML格式等價于#x000A;My favorite Website#x000A;而不是#x000D;#x000A;My favorite Website#x000D;#x000A;。現在大家都清楚了吧:)
繞到這里我想大家都有點暈了,到底這個跟問題2有啥關系呢?先不要著急嘛,我們先記住兩點:
IE5.5/6/7中"結束標簽與最后一個non-white-space字符間的white-space字符串,合并為1個(ASCII space)字符";
IE5.5/6/7中僅字符(串)可以作為詞義單元,而IE8+中inline-level element也作為詞義單元。
bk1
IE5.5/6/7下等價于
bk1
對比一下上面的規則,空隙自然就有了。
IE8+下等價于
inline-level element整體作為詞義單元,從外部看根本不用管里面具體字符串是什么。
后來者居上——CSS2.1描述中的inline-block相對IE自定義的inline-block,CSS2.1引入的inline-block就好理解多了,它做了兩件事:
將元素變性為inline-level element;
讓元素產生新的BFC。
消滅尾行者現在我們終于明白通過display:inline-block進行元素的水平排版時,為啥會有個討人厭的跟屁蟲了,那剩下的工作當然是去而快之啦。首先這個跟屁蟲實質上就是white-space字符串,而我們一般會輸入的就是ASCII space( )、ASCII tab( )和讓HTML Markup更可讀的line breakscarriage return( )、line feed( )。
那么消滅尾行者的方式就只有兩個方向:1. 從根本上消除white-space字符串;2. 視覺效果上消除white-space字符串的影響。
犧牲HTML Markup可讀性犧牲前
one two three
犧牲后1:一行搞定(一大坨代碼,會斗雞眼的。。。)
onetwothree
犧牲后2:注釋銜接(通過JS獲取子元素數會有問題)
onetwothree
犧牲后3
onetwothree
然后@一絲姐說為展現效果犧牲結構是耍流氓,@HAX說這是"削足適履"。雖說這方法從根本上清除了white-space字符串,但那種丑不是一般人能接受的。
font-size:0大法這種方式存在兼容性的問題,而且子元素需要重新設置font-size以保證后續采用em設置屬性值正確有效這個就是一個巨蛋疼的事了。
負margin-right法原理是通過負margin-right將white-space字符收入盒子后方,而margin-right的屬性值需要根據font-size來決定,必須恰恰等于字形寬度的負數,否則會出現元素重疊的問題。(IE5.5/6/7不兼容這玩法)
引入HTML預編譯引入如Jade等HTML模板引擎,開發和維護時采用可讀性可維護性更高的語言,而瀏覽器運行時則采用效率更佳但可讀性差甚至非人類友好的編碼,然后通過如sourcemap來做映射。
但若僅僅為解決本文的問題而引入HTML模板引擎,是不是小題大造了呢?
用float啦!既然上述方式皆不爽,而你又熟知float的使用和注意事項,那直接換成float就好了。float的內容可參考《CSS魔法堂:說說Float那個被埋沒的志向》
總結原來display:inline-block受委屈的這么多年,現在總算沉冤得雪了!都怪CSS2沒有專門的布局模塊,逼得我們東拼西湊地拼頁面。所幸的是CSS3專設了Flexbox/Grid/Multi-columns Layout Modules,我們可以寄望更美好的將來了!
尊重原創,轉載請注明來自:http://www.cnblogs.com/fsjohnhuang/p/5396037.html^_^肥仔John
感謝inline-block 前世今生
inline-block 未來
應不應該使用inline-block代替float
inline-block元素間間隙產生及去除詳解
有哪些好方法能處理 display: inline-block 元素之間出現的空格?
Fighting the Space Between Inline Block Elements
拜拜了,浮動布局-基于display:inline-block的列表布局
9.1 White space
9.3.2 Controlling line breaks
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/115185.html
摘要:前言繼上篇魔法堂稍稍深入偽類選擇器記錄完偽類后,我自然而然要向偽元素伸出魔掌的啦。和的注意事項默認必須設置屬性,否則一切都是無用功默認,就是和的內容無法被用戶選中的偽元素和偽類結合使用形如。 前言 ?繼上篇《CSS魔法堂:稍稍深入偽類選擇器》記錄完偽類后,我自然而然要向偽元素伸出魔掌的啦^_^。本文講講述偽元素以及功能強大的Contet屬性,讓我們可以通過偽元素更好地實現更多的可能! ...
摘要:到底是何方神圣可以簡單看作是中的。和產生新的特性一樣,無法通過屬性直接設置,而是通過某些屬性間接開啟這一特性。不同的是某些屬性是以不可逆方式間接開啟為。因此所引發的問題,很大程度可以理解為在不應該的或沒有預料到的地方產生新的導致的。 前言 過去一直聽說舊版本IE下很多詭異bug均由一個神秘角色引起的,那就是hasLayout。趁著最近突然發神經打算好好學習CSS,順便解答多年來的疑惑。...
摘要:擼代碼實現首頁檢驗單查詢成品通用標準審核圓角的何止是啊上圖的變成橢圓形了,而且中的文字好像飄到外面。我們可以看到兩邊相交所形成的矩形的對角線,將作為邊的相交點。 前言 ?當CSS3推出border-radius屬性時我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來模擬圓角了,但發現border-radius還分水平半徑和垂直半徑,然后又發現border-top-left/right...
摘要:下的屬性值詳解以下內容均在中測試默認對齊方式這里作為參考系,而它的就是所要對齊的了。沒有任何變化。那改變又如何呢為了讓的清晰可見,特意添加一個的包裹著。 前言 一直聽說line-height是指兩行文本的基線間的距離,然后又說行高等于行距,最近還聽說有個叫行間距的家伙,@張鑫旭還說line-height和vertical-align基情四射,貴圈真亂啊。。。。。。于是通過本篇來一探究竟...
摘要:深入本屆集團公司黨委由公司黨委由本屆集團公司黨委由公司黨委由組均是,而組則是。下英文泰文等的默認對齊方式,下的默認對齊方式等同于,采用增加減少象形文字間的距離。 前言 也許提及text-align你會想起水平居中,但除了這個你對它還有多少了解呢?本篇打算和大家一起來跟text-align來一次負距離的交往,你準備好了嗎? text-align屬性詳解 The text-align C...
閱讀 1426·2021-11-09 09:45
閱讀 1791·2021-11-04 16:09
閱讀 1457·2021-10-14 09:43
閱讀 1821·2021-09-22 15:24
閱讀 1601·2021-09-07 10:06
閱讀 1601·2019-08-30 14:15
閱讀 986·2019-08-30 12:56
閱讀 1570·2019-08-29 17:22