我對CSS vertical-align的一些理解與認識(一)

轉(zhuǎn)載聲明:此文章為轉(zhuǎn)載(),點擊查看原文夺巩。如有侵權(quán)24小時內(nèi)刪除。聯(lián)系QQ:1522025433

一周崭、關(guān)于今天柳譬,本文,及其他

今天是個特殊的日子续镇,因為今天是汶川地震兩周年的日子美澳,我很悲鳴;今天又是國際護士節(jié)摸航,看到微博上護士照橫流制跟,我很欣慰。
一段放松的YY后酱虎,進入正題雨膨。上個月21號,有位同行留言想讓我講講vertical-align屬性读串,我其實對vertical-align屬性也是略知皮毛聊记,要說豈敢談“講解”,就說說我對vertical-align屬性的一些理解吧恢暖,純屬個人見解排监,若有不準確之處還望見諒。還有杰捂,vertical-align屬性牽扯到的知識實在是太多了社露,不是一篇文章就可以講清楚的,這里我就只挑幾個典型或是重要的地方說一說琼娘。
在開始之前峭弟,希望對下面的知識有所了解附鸽,inline box模型,inline/inline-block/block屬性瞒瘸。//zxx:關(guān)于inline box模型坷备,我在這篇文章的“浮動的’破壞性’”部分做了專門的介紹。

二情臭、vertical-align一大堆亂七八糟的屬性

vertical-align指的是什么意思呢省撑?我window+D清屏,雙擊打開有道桌面詞典俯在,輸入vertical竟秫,再輸入align,“哦~~~~”跷乐,我腦袋一晃肥败,原來是“垂直的”+“對齊”的意思,就是垂直對齊嘛愕提!

中馒稍,就是垂直對齊的意思,先放一邊浅侨,我看先看看vertical-align支持哪些屬性纽谒,我比較喜歡輕巧的Dreamweaver,看看他的提示屬性又哪些:


有句俗語叫做“見多不怪”如输,我估摸著這些top,bottom屬性大家都見過鼓黔,沒啥看頭,沒啥說頭不见。老實講澳化,我看到這些養(yǎng)臭蟲的屬性也頭疼,所以脖祈,忘了他們肆捕,我們說點有意思的刷晋。vertical-align屬性與數(shù)值盖高。見下面的表:

  1. 首先關(guān)于數(shù)值,見下面的示例:
    .test{vertical-align:-2px;}
    我的理解為眼虱,元素相對于基線向下偏移兩像素喻奥,這個常常用來修復(fù)單選框/復(fù)選框與12像素文字大小不對齊的問題。這個沒有什么好說的捏悬。

  2. 再者關(guān)于百分數(shù)值撞蚕,百分值與數(shù)值,以我的眼光看去过牙,代表了不同的思想甥厦,以及心態(tài)纺铭。前者代表著靈活,自由與開放刀疙,后者有嚴謹舶赔,精確,安穩(wěn)之意谦秧。CSS中支持百分值的屬性還不少竟纳,例如width/height,line-height,font-size,這里的vertical-align屬性也是其一。提到百分值疚鲤,必然牽扯到相對于那個屬性(或值)锥累,例如寬度百分比都是相對于父塊狀元素的寬度值的,font-size的百分值是相對于向外的第一含有font-size屬性的層的font-size大小而言的集歇,而這里的vertical-align桶略,有些不拘一格,是相對于此標簽繼承的line-height值決定的鬼悠。例如删性,如下示例代碼:
    .test{vertical-align:-10%;}

假設(shè)這里的.test的標簽繼承的行高是20px,則這里的vertical-align:-10%所代表的實際值是:-10% * 20 = 2(像素)
焕窝。不過事情沒有這么簡單蹬挺,CSS中的line-height是個非常精深的屬性,建議您看看我之前寫的這篇文章:css行高line-height的一些深入理解及應(yīng)用它掂,所以遇到像IE6/IE7這樣吃三鹿奶粉長大的瀏覽器肯定會出點簍子的巴帮。什么簍子呢,就是“IE6/IE7瀏覽器下的vertical-align的百分比值不支持小數(shù)line-height虐秋。”您可以看看我處理的以小數(shù)值line-height繼承的vertical-align百分比顯示對比圖[參展對象:IE6(觀眾扔雞蛋)和Firefox3.6(美女送鮮花)]:


如果您現(xiàn)在使用的就是IE6或是IE7或是IE6/7內(nèi)核的瀏覽器榕茧,同時相對這個bug有所見識,您可以狠狠地點擊這里:IE6/7 vertical-align百分值與line-height小數(shù)值bug
要是您不想見到讓您生氣的IE下的糟糕表現(xiàn)客给,您可以狠狠地點擊這里:非小數(shù)line-height修復(fù)demo用押。

  1. 最后關(guān)于其他屬性,像是bottom靶剑,middle等蜻拨,我是懶得說什么了,為何桩引?可以看看下面這張兼容性表:

這是老外前輩整出的vertical-align兼容性表缎讼,雖然我不清楚Opera瀏覽器一欄的full是個什么意思,但是”buggy”知道坑匠,就是臭蟲成群血崭,bug成堆的意思,我想,做過簡單研究的都會注意到不同瀏覽器下的差異確實明顯夹纫。

不過vertical-align的這些屬性值也不是一無是處咽瓷,有些屬性,例如text-bottom和middle有時會用來修正一些樣式表現(xiàn)或是實現(xiàn)特定布局舰讹。這個后面再說~~不過有一點知識有必要補一補就是忱详,baseline,middle,top,bottom到底指什么,看下面這張圖跺涤,我是找了張圖ps了好一會兒:


我們剛學(xué)英語的時使用的那個英語本子每行有四條線匈睁,其中底部第二條線就是基線,是a,c,z,x等字母的底邊線桶错。下圖的紅色線即為基線航唆。

三、為什么我的vertical-align屬性不起作用院刁?

知道了vertical-align是垂直對齊的意思糯钙,不少經(jīng)驗尚淺的同行會試著使用這個屬性實現(xiàn)一些垂直方向上的對齊效果,會發(fā)現(xiàn)有時候可以退腥,有時候又不起作用任岸,不知道為什么?不急狡刘,慢慢來享潜。

我們知道display也有很多屬性值,其中以inline/inline-block/block三個最常見嗅蔬,這代表了頁面上三種不同水平的元素剑按。我常常會以液態(tài)/固液混合態(tài)/固態(tài)加以形象化思考,對應(yīng)于現(xiàn)實中的事物就是:牛奶/果凍/堅果澜术。

我們都知道艺蝴,每個人都有不同的嗜好,有的人喜歡吃甜食鸟废,有的人喜歡吃辣的東西猜敢,有的人不喜歡吃芹菜,有的人不喜歡吃羊肉等等盒延。CSS中的有些元素也是這樣缩擂,他們有的只對牛奶感興趣,有的只喜歡吃堅果和果凍兰英,而討厭牛奶撇叁。而vertical-align呢供鸠,是個比較挑食的家伙畦贸,它只喜歡吃果凍,從小吃果凍長大,沒有了果凍薄坏,它就會鬧脾氣趋厉,對你不理不睬。我稱之為“果凍依賴型元素”胶坠,又稱之為“inline-block依賴型元素”君账,也就是說,只有一個元素屬于inline-block(table-cell也可以理解為inline-block水平)水平沈善,只有一個元素屬于inline或是inline-block(table-cell也可以理解為inline-block水平)水平乡数,其身上的vertical-align屬性才會起作用。所以闻牡,類似下面的代碼就不會起作用:
span{vertical-align:middle;}
div{vertical-align:middle;}
所謂inline-block水平的元素净赴,就是既可以“吸”又可以“咬”的元素,既可以與inline水平元素混排罩润,又能設(shè)置高寬屬性的元素玖翅。哪些元素呢,例如圖片割以,按鈕金度,單復(fù)選框,單行/多行文本框等HTML控件严沥,只有這些元素默認情況下會對vertical-align屬性起作用猜极。

雖然vertical-align屬性只會在inline-block水平的元素上期作用,但是其影響到的元素涉及到inline屬性的元素消玄,這里千萬記住魔吐,inline水平元素受vertical-align屬性而位置改變等不是因為其對vertical-align屬性敏感或起作用,而是受制于整個line box的變化而不得不變化的莱找,這個后面會較為深入的分析酬姆。

四、vertical-align屬性是如何起作用的奥溺?

這里辞色,我使用vertical-align:middle屬性作為例子,講講我對vertical-align是如何起作用的理解浮定。

CSS參考手冊上說vertical-align:middle是將當前元素放在父元素的中間相满,大致一讀,似乎是那么回事桦卒,但是細細一想立美,不知道具體指什么,概念模糊方灾。我們從簡單的開始建蹄,一步一步探究生效的原理碌更。

  1. 一些簡單的例子
    這里先列舉幾個簡單的例子,方便對vertical-align:middle有了初步的直觀的認識洞慎。例子內(nèi)容如下痛单,創(chuàng)建一個inline-block屬性的元素,此元素的高度和寬度均為4像素劲腿,為了對比效果明顯旭绒,我使用黑白二色,背景黑色焦人,此4像素*4像素的元素為白色挥吵,vertical-align屬性依次為middle,bottom和text-bottom花椭,當然蔫劣,文字是必須的,否則何見對齊呢个从!整個實例的HTML代碼都是一致的脉幢,唯一不同的就是一段vertical-align屬性,測試環(huán)境均是Firefox3.6瀏覽器嗦锐,HTML代碼如下:
<span class="box">
    <span class="dot"></span>
    我是一段卡哇伊的文字嫌松。
</span>
實例一:默認屬性(也就是baseline)
參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px;}
.dot{display:inline-block; width:4px; height:4px; background:white;}

結(jié)果如下圖:


實例二:bottom
參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px;}
.dot{display:inline-block; width:4px; height:4px; background:white; vertical-align:bottom;}

結(jié)果如下圖:


實例三:text-bottom
參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px;}
.dot{display:inline-block; width:4px; height:4px; background:white; vertical-align:text-bottom;}

結(jié)果如下圖:


對比vertical-align:bottom和vertical-align:text-bottom,他們的表現(xiàn)似乎一樣奕污,實際上呢萎羔,這里的表現(xiàn)一致只是一個巧合而已,此話怎講碳默?要顯示其差異很簡單贾陷,添加一個line-height值,您就會看到不一樣的地方了嘱根。

實例四:line-height:10px + vertical-align:bottom
參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px; line-height:10px;}
.dot{display:inline-block; width:4px; height:4px; background:white; vertical-align:bottom;}

結(jié)果如下截圖:

而如果vertical-align的屬性是text-bottom呢髓废?

實例五:line-height:10px + vertical-align:text-bottom
參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px; line-height:10px;}

.dot{display:inline-block; width:4px; height:4px; background:white; vertical-align:text-bottom;}

可以看到,vertical-align:text-bottom屬性的那個小方點的位置沒有隨著line-height的改變而改變该抒,還是與文字的底部對齊慌洪。如果您細看關(guān)于text-bottom以及bottom屬性的定義,您可以找到其表現(xiàn)的原因:text-bottom是與父標簽的文字底部對齊凑保,在這里也就是后面的“我是一個卡哇伊的文字”這段文字對齊冈爹,而bottom是相對于父標簽的底部對齊,而如果您熟悉line box模型且對高度的本質(zhì)有所了解欧引,那么您就會明白為什么line-height會改變標簽的bottom的位置了频伤。這點的了解有助于理解下面vertical-align:middle生效的過程及原理。

實例六:middle參見如下的CSS代碼:

.box{background:black; color:white; padding-left:20px;}
.dot{display:inline-block; width:4px; height:4px; background:white; vertical-align:middle;}

結(jié)果如下圖所示:

  1. 復(fù)雜點的例子

如果說上面的例子只是熱身的話芝此,那么現(xiàn)在就要開始進入實戰(zhàn)了憋肖。在這里的實例中因痛,我們添加一個新的元素,就是圖片瞬哼,我們通過觀察不同屬性下圖片的樣式表現(xiàn)來理解vertical-align:middle等相關(guān)屬性是怎么一回事,是怎樣產(chǎn)生頁面表現(xiàn)的租副。
為了方便大家理解坐慰,同時也是為了自己加深對vertical-align的理解,我特地做了個簡易的vertical-align屬性實驗面板用僧,見下圖:


此vertical-align實驗面板頁面地址如下:http://www.zhangxinxu.com/study/201005/verticle-align-test-demo.html结胀,您還可以狠狠地點擊這里:vertical-align屬性測試面板頁面
通過修改,行高以及對應(yīng)元素的vertical-align屬性责循,您會在頁面上直接看到效果糟港,同時修改文字大小的頁面表現(xiàn)也有助于您對inline box模型的理解。由于IE6/7對inline box的解釋不完善院仿,同時對vertical-align的認識也是一坨香噴噴的鳥屎秸抚,所以請不要再IE6/7下使用此面板,會對您產(chǎn)生誤導(dǎo)的歹垫,IE8剥汤,F(xiàn)irefox,最新的Opera瀏覽器排惨,chrome吭敢。Safari瀏覽器都是上佳的選擇。關(guān)于IE6/7的解釋問題會在下集介紹暮芭。
這里說點我的認識吧:vertical-align:middle屬性的表現(xiàn)與否鹿驼,僅僅與其父標簽有關(guān),至于我們通吃辏看到的與后面的文字垂直居中顯示那都是假象畜晰!這就是我的認識,當然瑞筐,我也可以為我的理解提供強有力的證據(jù)舷蟀,我們來看vertical-align屬性實驗面板。
當我們將圖片vertical-align:middle屬性改為其他的時候面哼,例如top野宜,或是bottom的時候,您會發(fā)現(xiàn)魔策,圖片位置上移或是下移了匈子,且居邊了,但是文字在那里卻紋絲不動闯袒,顯然虎敦,vertical-align的本質(zhì)上是個獨立的個體游岳,與后面的line水平的元素是不存在直接的關(guān)系的。兩者沒有必然的聯(lián)系其徙,這是一個需要認識清楚的重要的東西胚迫。


您也可以查看下面一段錄制的視頻,在Firefox3.6瀏覽器下錄制唾那,觀察表現(xiàn)效果:
見原文

五访锻、下集預(yù)告

下集看點:
解析vertical-align一般的行為表現(xiàn)
vertical-align相關(guān)對齊問題分析及解決
浮動為何可以破壞vertical-align屬性

未完,待續(xù)……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闹获,一起剝皮案震驚了整個濱河市期犬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌避诽,老刑警劉巖龟虎,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異沙庐,居然都是意外死亡鲤妥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門拱雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旭斥,“玉大人,你說我怎么就攤上這事古涧〈谷” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵羡滑,是天一觀的道長菇爪。 經(jīng)常有香客問我,道長柒昏,這世上最難降的妖魔是什么凳宙? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮职祷,結(jié)果婚禮上氏涩,老公的妹妹穿的比我還像新娘。我一直安慰自己有梆,他們只是感情好是尖,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泥耀,像睡著了一般饺汹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痰催,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天兜辞,我揣著相機與錄音迎瞧,去河邊找鬼。 笑死逸吵,一個胖子當著我的面吹牛凶硅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扫皱,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼足绅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啸罢?” 一聲冷哼從身側(cè)響起编检,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胎食,失蹤者是張志新(化名)和其女友劉穎扰才,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厕怜,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衩匣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粥航。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅捏。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖递雀,靈堂內(nèi)的尸體忽然破棺而出柄延,到底是詐尸還是另有隱情,我是刑警寧澤缀程,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布搜吧,位于F島的核電站,受9級特大地震影響蛤铜,放射性物質(zhì)發(fā)生泄漏街氢。R本人自食惡果不足惜厘贼,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜒程。 院中可真熱鬧,春花似錦伺帘、人聲如沸昭躺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窍仰。三九已至,卻和暖如春礼殊,著一層夾襖步出監(jiān)牢的瞬間驹吮,已是汗流浹背针史。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碟狞,地道東北人啄枕。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像族沃,于是被迫代替她去往敵國和親频祝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案脆淹? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽?zāi)J的外補...
    _Yfling閱讀 13,751評論 1 92
  • 有些東西我們經(jīng)常用常空,但是我們卻并不了解它的原理,所以一旦換了場景盖溺,好多東西就不知道該怎么用了漓糙。最近一直很糾結(jié)ver...
    朱小維閱讀 4,935評論 8 34
  • 參考文章:深入了解CSS的line-height屬性Vertical-Align: 你需要知道的所有事【譯】Ver...
    若邪Y閱讀 3,440評論 1 6
  • 李娟是我非常喜歡的作家之一蝇庭。 在她的作品中醉鳖,總能給讀者帶來一種清新、自然哮内、親切的感覺盗棵。看過許多讀者對她寫作的評價北发,...
    蘇聽風(fēng)閱讀 521評論 1 11
  • 原文 “克己須要掃除廓清纹因,一毫不存方是。有一毫在鲫竞,則眾惡相引而來辐怕。” 注 引陳榮捷注从绘,施邦曜云:“著一毫意思寄疏,便不...
    無住居士閱讀 1,260評論 7 7