亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

cucumber / 1058人閱讀

摘要:那不是,是我不懂而已。的用途之一西文是以空格來(lái)分隔單詞的,而漢字間則無(wú)需空格分隔,但為了統(tǒng)一西文東亞和的排版,于是抽象出一個(gè)名為的概念用于分隔詞義單元,則作為的值域,而定義域就是語(yǔ)言信息。

前言

每當(dāng)來(lái)個(gè)需要既要水平排版又要設(shè)置固定高寬時(shí),我就會(huì)想起display:inline-block,還有為了支持IE5.5/6/7的hack*display:inline;*zoom:1;。然后發(fā)現(xiàn)盒子間無(wú)端端多了個(gè)不可選的空白符,于是想盡辦法修復(fù)這個(gè)bug。

直到一天拜讀了@一絲姐、@HAX等高人的秘笈后才頓悟,原來(lái)我錯(cuò)了。那不是bug,是我不懂而已。

先行者——IE5.5中的inline-block

當(dāng)我們?yōu)橹С諭E5.5/6/7而添加這段hack時(shí)*display:inline;*zoom:1,總以為從IE8開(kāi)始才支持display:inline-block屬性值。其實(shí)從IE5.5開(kāi)始已經(jīng)支持了,只是IE5.5/6/7支持的是IE的自定義標(biāo)準(zhǔn),而從IE8開(kāi)始則是支持CSS2.1標(biāo)準(zhǔn)而已。

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.


經(jīng)過(guò)CSS2.1洗禮的我們對(duì)上述內(nèi)容不禁會(huì)發(fā)出兩個(gè)疑問(wèn):

為啥block-level element設(shè)置了display:inline-block后還是垂直方向排列呢?

為啥inline-level element設(shè)置了display:inline-block后之間沒(méi)有詭異的間隙呢?

還記得楊過(guò)是如何變成神雕大俠的嗎?不就是被斷右臂后發(fā)現(xiàn)左手才是真愛(ài)嗎:)

好了,其實(shí)我的意思是拋棄過(guò)去對(duì)display:inline-block的認(rèn)知,重新來(lái)理解IE5.5/6/7下的它才是硬道理啦。

對(duì)于問(wèn)題1,首先上面的引用很直白地告訴我們——display:inline-block能觸發(fā)hasLayout,然后就沒(méi)了。所以block-level element依然是block-level element,不會(huì)一夜成了inline-level element的。結(jié)論:display:inline-block僅會(huì)觸發(fā)hasLayout,而元素本該怎么排版還是怎么排版。關(guān)于hasLayout的內(nèi)容可參考《CSS魔法堂:hasLayout原來(lái)是這樣!》

對(duì)于問(wèn)題2,我們先看看是否真的沒(méi)有間隙吧!






bk1

見(jiàn)鬼了,在前一個(gè)盒子內(nèi)添加些文本就出現(xiàn)間隙了?其實(shí)這真的和display:inline-block無(wú)關(guān)的,大家就放過(guò)他吧!來(lái)上呈堂證供!


before
before
after
after
after
one two
one two

chrome43

對(duì)于起始標(biāo)簽與第一個(gè)non-white-space字符間的white-space字符串,以carriage return( )作為white-space合并單元的起始符,最后保留各合并單元的合并結(jié)果。

結(jié)束標(biāo)簽與最后一個(gè)non-white-space字符間的white-space字符串,以carriage return( )作為white-space合并單元的結(jié)束符,最后保留各合并單元的合并結(jié)果。

詞義單元間的white-space字符串,以carriage return( )作為white-space合并單元的分界符,最后保留各合并單元的合并結(jié)果。

標(biāo)簽內(nèi)僅包含white-space字符串,那么這些white-space字符串將被忽略。

FF5.0

對(duì)于起始標(biāo)簽與第一個(gè)non-white-space字符間和結(jié)束標(biāo)簽與最后一個(gè)non-white-space字符間的white-space字符串將被忽略。

詞義單元間的white-space字符串,以carriage return( )作為white-space合并單元的分界符,最后保留各合并單元的合并結(jié)果。

標(biāo)簽內(nèi)僅包含white-space字符串,那么這些white-space字符串將被忽略。

IE8+

對(duì)于起始標(biāo)簽與第一個(gè)non-white-space字符間和結(jié)束標(biāo)簽與最后一個(gè)non-white-space字符間的white-space字符串將被忽略。

詞義單元間的white-space字符串,合并為1個(gè)(ASCII space)字符。

標(biāo)簽內(nèi)僅包含white-space字符串,那么這些white-space字符串將被忽略。

IE5.5/6/7

對(duì)于起始標(biāo)簽與第一個(gè)non-white-space字符間的white-space字符串將被忽略。

結(jié)束標(biāo)簽與最后一個(gè)non-white-space字符間的white-space字符串,合并為1個(gè)(ASCII space)字符。

詞義單元間的white-space字符串,合并為1個(gè)(ASCII space)字符。

標(biāo)簽內(nèi)僅包含white-space字符串,那么這些white-space字符串將被忽略。

合并單元:合并單元包含0到N個(gè)white-space字符串,最終合并為0到1個(gè)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

望文生義翻譯法:標(biāo)簽與正文間的line breaks要被忽略掉!也就是上下兩種HTML格式的渲染效果應(yīng)該一致。實(shí)際上除了IE5.5/6/7外其他瀏覽器均遵守之一規(guī)定的。也許你會(huì)說(shuō)上面的實(shí)驗(yàn)不是已經(jīng)證明chrome43不遵守這個(gè)法則嗎?其實(shí)


My favorite Website

HTML格式等價(jià)于#x000A;My favorite Website#x000A;而不是#x000D;#x000A;My favorite Website#x000D;#x000A;。現(xiàn)在大家都清楚了吧:)

繞到這里我想大家都有點(diǎn)暈了,到底這個(gè)跟問(wèn)題2有啥關(guān)系呢?先不要著急嘛,我們先記住兩點(diǎn):

IE5.5/6/7中"結(jié)束標(biāo)簽與最后一個(gè)non-white-space字符間的white-space字符串,合并為1個(gè)(ASCII space)字符";

IE5.5/6/7中僅字符(串)可以作為詞義單元,而IE8+中inline-level element也作為詞義單元。





bk1

IE5.5/6/7下等價(jià)于





bk1

對(duì)比一下上面的規(guī)則,空隙自然就有了。

IE8+下等價(jià)于

 
 


   

inline-level element整體作為詞義單元,從外部看根本不用管里面具體字符串是什么。

后來(lái)者居上——CSS2.1描述中的inline-block

相對(duì)IE自定義的inline-block,CSS2.1引入的inline-block就好理解多了,它做了兩件事:

將元素變性為inline-level element;

讓元素產(chǎn)生新的BFC。

消滅尾行者

現(xiàn)在我們終于明白通過(guò)display:inline-block進(jìn)行元素的水平排版時(shí),為啥會(huì)有個(gè)討人厭的跟屁蟲(chóng)了,那剩下的工作當(dāng)然是去而快之啦。首先這個(gè)跟屁蟲(chóng)實(shí)質(zhì)上就是white-space字符串,而我們一般會(huì)輸入的就是ASCII space( )、ASCII tab( )和讓HTML Markup更可讀的line breakscarriage return( )、line feed( )。

那么消滅尾行者的方式就只有兩個(gè)方向:1. 從根本上消除white-space字符串;2. 視覺(jué)效果上消除white-space字符串的影響。

犧牲HTML Markup可讀性

犧牲前

one
two
three

犧牲后1:一行搞定(一大坨代碼,會(huì)斗雞眼的。。。)

onetwothree

犧牲后2:注釋銜接(通過(guò)JS獲取子元素?cái)?shù)會(huì)有問(wèn)題)

onetwothree

犧牲后3

onetwothree

然后@一絲姐說(shuō)為展現(xiàn)效果犧牲結(jié)構(gòu)是耍流氓,@HAX說(shuō)這是"削足適履"。雖說(shuō)這方法從根本上清除了white-space字符串,但那種丑不是一般人能接受的。

font-size:0大法

這種方式存在兼容性的問(wèn)題,而且子元素需要重新設(shè)置font-size以保證后續(xù)采用em設(shè)置屬性值正確有效這個(gè)就是一個(gè)巨蛋疼的事了。

負(fù)margin-right法

原理是通過(guò)負(fù)margin-right將white-space字符收入盒子后方,而margin-right的屬性值需要根據(jù)font-size來(lái)決定,必須恰恰等于字形寬度的負(fù)數(shù),否則會(huì)出現(xiàn)元素重疊的問(wèn)題。(IE5.5/6/7不兼容這玩法)

引入HTML預(yù)編譯

引入如Jade等HTML模板引擎,開(kāi)發(fā)和維護(hù)時(shí)采用可讀性可維護(hù)性更高的語(yǔ)言,而瀏覽器運(yùn)行時(shí)則采用效率更佳但可讀性差甚至非人類友好的編碼,然后通過(guò)如sourcemap來(lái)做映射。

但若僅僅為解決本文的問(wèn)題而引入HTML模板引擎,是不是小題大造了呢?

用float啦!

既然上述方式皆不爽,而你又熟知float的使用和注意事項(xiàng),那直接換成float就好了。float的內(nèi)容可參考《CSS魔法堂:說(shuō)說(shuō)Float那個(gè)被埋沒(méi)的志向》

總結(jié)

原來(lái)display:inline-block受委屈的這么多年,現(xiàn)在總算沉冤得雪了!都怪CSS2沒(méi)有專門的布局模塊,逼得我們東拼西湊地拼頁(yè)面。所幸的是CSS3專設(shè)了Flexbox/Grid/Multi-columns Layout Modules,我們可以寄望更美好的將來(lái)了!

尊重原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)自:http://www.cnblogs.com/fsjohnhuang/p/5396037.html^_^肥仔John

感謝

inline-block 前世今生
inline-block 未來(lái)
應(yīng)不應(yīng)該使用inline-block代替float
inline-block元素間間隙產(chǎn)生及去除詳解
有哪些好方法能處理 display: inline-block 元素之間出現(xiàn)的空格?
Fighting the Space Between Inline Block Elements
拜拜了,浮動(dòng)布局-基于display:inline-block的列表布局
9.1 White space
9.3.2 Controlling line breaks

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/115185.html

相關(guān)文章

  • CSS魔法:一起玩透?jìng)卧睾虲ontent屬性

    摘要:前言繼上篇魔法堂稍稍深入偽類選擇器記錄完偽類后,我自然而然要向偽元素伸出魔掌的啦。和的注意事項(xiàng)默認(rèn)必須設(shè)置屬性,否則一切都是無(wú)用功默認(rèn),就是和的內(nèi)容無(wú)法被用戶選中的偽元素和偽類結(jié)合使用形如。 前言 ?繼上篇《CSS魔法堂:稍稍深入偽類選擇器》記錄完偽類后,我自然而然要向偽元素伸出魔掌的啦^_^。本文講講述偽元素以及功能強(qiáng)大的Contet屬性,讓我們可以通過(guò)偽元素更好地實(shí)現(xiàn)更多的可能! ...

    DevTalking 評(píng)論0 收藏0
  • CSS魔法:hasLayout原來(lái)是這樣的!

    摘要:到底是何方神圣可以簡(jiǎn)單看作是中的。和產(chǎn)生新的特性一樣,無(wú)法通過(guò)屬性直接設(shè)置,而是通過(guò)某些屬性間接開(kāi)啟這一特性。不同的是某些屬性是以不可逆方式間接開(kāi)啟為。因此所引發(fā)的問(wèn)題,很大程度可以理解為在不應(yīng)該的或沒(méi)有預(yù)料到的地方產(chǎn)生新的導(dǎo)致的。 前言 過(guò)去一直聽(tīng)說(shuō)舊版本IE下很多詭異bug均由一個(gè)神秘角色引起的,那就是hasLayout。趁著最近突然發(fā)神經(jīng)打算好好學(xué)習(xí)CSS,順便解答多年來(lái)的疑惑。...

    URLOS 評(píng)論0 收藏0
  • CSS魔法:重拾Border之——不僅僅是圓角

    摘要:擼代碼實(shí)現(xiàn)首頁(yè)檢驗(yàn)單查詢成品通用標(biāo)準(zhǔn)審核圓角的何止是啊上圖的變成橢圓形了,而且中的文字好像飄到外面。我們可以看到兩邊相交所形成的矩形的對(duì)角線,將作為邊的相交點(diǎn)。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來(lái)模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right...

    _Dreams 評(píng)論0 收藏0
  • CSS魔法:深入理解line-height和vertical-align

    摘要:下的屬性值詳解以下內(nèi)容均在中測(cè)試默認(rèn)對(duì)齊方式這里作為參考系,而它的就是所要對(duì)齊的了。沒(méi)有任何變化。那改變又如何呢為了讓的清晰可見(jiàn),特意添加一個(gè)的包裹著。 前言 一直聽(tīng)說(shuō)line-height是指兩行文本的基線間的距離,然后又說(shuō)行高等于行距,最近還聽(tīng)說(shuō)有個(gè)叫行間距的家伙,@張?chǎng)涡襁€說(shuō)line-height和vertical-align基情四射,貴圈真亂啊。。。。。。于是通過(guò)本篇來(lái)一探究竟...

    avwu 評(píng)論0 收藏0
  • CSS魔法:你真的懂text-align嗎?

    摘要:深入本屆集團(tuán)公司黨委由公司黨委由本屆集團(tuán)公司黨委由公司黨委由組均是,而組則是。下英文泰文等的默認(rèn)對(duì)齊方式,下的默認(rèn)對(duì)齊方式等同于,采用增加減少象形文字間的距離。 前言 也許提及text-align你會(huì)想起水平居中,但除了這個(gè)你對(duì)它還有多少了解呢?本篇打算和大家一起來(lái)跟text-align來(lái)一次負(fù)距離的交往,你準(zhǔn)備好了嗎? text-align屬性詳解 The text-align C...

    tinylcy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<