摘要:在元素的和固定的情況下,一點(diǎn)小的改變也很有可能對(duì)布局造成影響。其中高度有可能是由元素的內(nèi)容決定的。行高的上下邊界是紅線。元素也有和上下邊界,元素是需要對(duì)齊的對(duì)象。因此文字的最高點(diǎn)超過了的高度。在第二種情況下,另外兩個(gè)元素的位置發(fā)生了下移。
寫在前面的話
開始學(xué)習(xí)前端以來,在CSS相關(guān)知識(shí)當(dāng)中困擾我最多的就是Vertical-Align這個(gè)屬性。在stackoverflow上查找相關(guān)問題的時(shí)候看到了這篇文章,于是將它翻譯出來,作為自己的一次學(xué)習(xí)筆記吧。
正文在遇到將元素在垂直方向上對(duì)齊的需求時(shí),CSS提供了多種方法,有時(shí)候我用float解決,有時(shí)候我使用position:absolute解決,還有時(shí)候采用的方法是手動(dòng)調(diào)整margin和padding。
其實(shí)我并不喜歡這些解決方法,float會(huì)讓元素的頂端對(duì)齊而且需要手動(dòng)清楚浮動(dòng)。絕對(duì)定位讓元素脫離了正常流,這樣這些元素就不會(huì)再影響到周圍的元素。在元素的padding和margin固定的情況下,一點(diǎn)小的改變也很有可能對(duì)布局造成影響。
接下來登場(chǎng)的就是本文的主角了:Vertical-align。通常來說使用這個(gè)屬性進(jìn)行布局是一種hack行為,因?yàn)樗緛聿⒉皇潜挥糜谶@個(gè)目的。它用在文本和與文本相鄰元素的垂直方向上的對(duì)齊問題。然而,你也可以使用Vertical-align在不同的上下文中對(duì)元素進(jìn)行靈活的,細(xì)粒度的排布。元素的尺寸無需知曉,元素任然處于正常流當(dāng)中,因此元素的變化會(huì)影響到周圍的元素,這使得Vertical-align是非常有價(jià)值的排布方案的選擇。
Vertical-align有時(shí)候會(huì)變的面目猙獰。它似乎有一些謎一樣的規(guī)則。舉例來說,有時(shí)候你改變了Vertical-align的值,但是該元素垂直方向上沒有發(fā)生改變反而別的元素改變了位置。
一些資料在談到Vertical-align這個(gè)問題的時(shí)候深入程度不夠,特別是當(dāng)人們想使用這個(gè)屬性布局的時(shí)候。這些資料更多的將精力集中在了一個(gè)誤區(qū)上,就是嘗試將元素內(nèi)的一切都垂直對(duì)齊。他們給出了一下在簡(jiǎn)單情況下的例子來解釋Vertical-align這個(gè)屬性而忽略了一些復(fù)雜奇怪的方面。
Vertical-align被用于垂直對(duì)齊inline元素,也就是display值為inline和inline-block的元素。inline-table的元素不在本文的討論范圍內(nèi)。
inline元素基本上值得就是文本
inline-block元素就像它的名字一樣,同時(shí)具備inline元素和block元素的特點(diǎn),這樣的元素有padding,margin,border,width,height。其中高度有可能是由元素的內(nèi)容決定的。
inline元素一個(gè)挨著一個(gè)的擺放在行內(nèi),當(dāng)行內(nèi)元素太多的情況下,一個(gè)新行會(huì)被創(chuàng)建出來,這些行也叫做line--box。它將行內(nèi)的所有內(nèi)容都包裹了起來。根據(jù)行內(nèi)內(nèi)容的不同,line-box的尺寸也會(huì)不同,在接下來的圖里面,紅線代表了line-box的上下邊界
在這些line-box內(nèi),Vertical-align屬性負(fù)責(zé)對(duì)齊一些獨(dú)立的元素。那么,這些元素是要和誰對(duì)齊呢?
對(duì)于垂直對(duì)齊這個(gè)知識(shí)點(diǎn)來說最重要的就是涉及元素的baseline。有時(shí)候元素的盒模型的上下邊界也會(huì)變的很重要。下面上圖
如圖所示有三行文字。行高的上下邊界是紅線。文字的上下邊界是綠色的線,藍(lán)色的線就是baseline了,左邊文字的高度與行高是一致的,因此綠線和紅線重合了,中間的行高是文字大小的兩倍,而在右邊,行高是文字大小的二分之一。
行內(nèi)元素的外邊緣在行高的上邊緣和下邊緣這個(gè)范圍內(nèi)對(duì)齊,如果行高小于文字的高度也無所謂。關(guān)于baseline的定義還是直接給出標(biāo)準(zhǔn)的鏈接
從左到右的三幅圖片都是inline-block元素,不同的是,左面包含著沒有脫離正常流的內(nèi)容c,中間的除了沒有脫離正常流的內(nèi)容以外還加了overflow:hidden,右面的沒有內(nèi)容但是內(nèi)容區(qū)還有高度。紅線代表了margin-box的邊界。黃色代表的是border,綠色的是padding,藍(lán)色的是content,藍(lán)色的線代表的還是baseline。
inline-block元素的外邊緣就是margin-box的邊緣。
inline-block元素的baseline的位置要看該元素有沒有處于正常流之內(nèi)的內(nèi)容。
(1)在有處于正常流內(nèi)容的情況下,inline-block元素的baseline就是最后一個(gè)作為內(nèi)容存在的元素的baseline,這個(gè)元素的baseline的確定就要根據(jù)他自身來確定了。
(2)在overflow屬性不為visible的情況下,baseline就是margin-box的下邊界了。
(3)第三種情況下baseline還是margin-box的下邊界。
關(guān)于line-box的圖上面已經(jīng)給過了,這次我將文字部分高亮顯示。line-box的上邊界與最高元素的上邊界對(duì)齊,下邊界與最低元素的下邊界對(duì)齊。
W3C標(biāo)準(zhǔn)中并沒有定義line-box的baseline的位置。這一點(diǎn)很讓人困惑,baseline的位置需要滿足vertical-align屬性的值以及讓line-box的高度最小等條件,是一個(gè)很靈活的參數(shù)。
line-box的baseline是不可見的,但是可以很輕松的將它可視化出來,在行的開頭添加一個(gè)字母,比如"x",這個(gè)字母的下邊界默認(rèn)就是baseline的位置。圍繞著baseline在line-box中形成了文字盒。文字盒可以被認(rèn)為是沒有和任何元素對(duì)齊的line-box中的inline元素,它的告訴與它的父元素的font-size的值相同。因此,文字盒僅僅包含非格式化的line-box的文本,文字盒的邊界由綠線來表示。因?yàn)槲淖趾惺蔷o挨著baseline的,所以baseline的位置發(fā)生變化的話,文字盒的位置也會(huì)跟著改變(這里所說的文字盒在標(biāo)準(zhǔn)中被叫做strut)。
總結(jié)起來的話有以下兩點(diǎn):
有一個(gè)區(qū)域叫做line-box,垂直方向上的對(duì)齊都是發(fā)生在這個(gè)區(qū)域里面,它有baseline,有文字盒,有上下邊界。
inline元素也有baseline和上下邊界,inline元素是需要對(duì)齊的對(duì)象。
Vertical-align屬性的值
有關(guān)Vertical-align各個(gè)取值的說明讀者還是上MDN看吧。也可以看看天鑲大神的博客上的文章
我想將一個(gè)icon與文字對(duì)齊僅僅使icon的vertical-align屬性的值設(shè)置為middle似乎不能產(chǎn)生令人滿意的結(jié)果,例子如下圖
Centered?
Centered!
下面給出上圖的輔助線版本
原因就是左面的文字根本就沒有發(fā)生對(duì)齊行為,它還是對(duì)齊于line-box的baseline。而vertical-align對(duì)齊的點(diǎn)是baseline加上半個(gè)x的距離(half of the x-height)。因此文字的最高點(diǎn)超過了icon的高度。
而右面的例子,文字與icon都對(duì)齊于一個(gè)中點(diǎn),文字的baseline稍微下移,位于line-box的baseline的下方。結(jié)果是很好的達(dá)到了icon與文字對(duì)齊的效果。
這是一個(gè)Vertical-align的坑,line-box中的所有元素都會(huì)影響到baseline的位置。假設(shè),一個(gè)元素按某種方式垂直對(duì)齊了,但是這種對(duì)齊方式會(huì)引起baseline的移動(dòng),又因?yàn)榇蟛糠值拇怪睂?duì)齊方式(除了top和bottom)和baseline有關(guān),因此這個(gè)元素的垂直方向?qū)R的行為會(huì)引起該line-box內(nèi)其他元素位置的調(diào)整。
下面還是一些例子
一個(gè)很高的元素,其高度占滿了整個(gè)line-box,那么vertical-align對(duì)其實(shí)沒有影響的,在它的top和bottom之外沒有空間讓其移動(dòng)。但是為了滿足它的vertical-align的值,line-box的baseline會(huì)發(fā)生移動(dòng),左面的高元素的取值為text-bottom,矮元素的取值為baseline。右面的高元素的取值為text-top,你會(huì)看到baseline跳上去了
如果把高元素的vertical-align設(shè)置為其他值,也能看到類似的行為
甚至將vertical-align設(shè)置為bottom或者是top也會(huì)讓baseline發(fā)生移動(dòng)。這很奇怪,因?yàn)檫@時(shí)候應(yīng)該就沒baseline什么事兒了。
將兩個(gè)更大的元素放在一個(gè)line里面,并且設(shè)置vertical-align的值讓line-box的baseline移動(dòng)。在滿足vertical-align數(shù)值對(duì)齊的條件下,line-box的高度會(huì)自我調(diào)整,如左面的圖。再增加第三個(gè)元素,第三個(gè)元素如果因?yàn)槠鋠ertical-align的設(shè)置不會(huì)超過line-box的邊緣的話,它是不會(huì)影響到line-box的高度和baseline的位置的,如果它會(huì)超過line-box的邊緣,那么line-box的高度和baseline的位置也會(huì)進(jìn)行調(diào)整。在第二種情況下,另外兩個(gè)元素的位置發(fā)生了下移。
inline元素下方可能會(huì)有一點(diǎn)空隙
下面給出一個(gè)例子,如果嘗試將li元素在垂直方向上進(jìn)行對(duì)齊的話在,這個(gè)現(xiàn)象非常常見。
正如你所見,li元素是對(duì)齊baseline的,baseline的下方會(huì)給字母的一部分留出空間,因此會(huì)產(chǎn)生一個(gè)空隙。解決方案就是改變line-box的baseline的位置,比如將這些li這是為vertical-align:middle
inline元素之間的空隙造成布局效果與理想狀態(tài)發(fā)生偏差
這主要是因?yàn)閕nline元素本身的原因,但是因?yàn)槿绻寁ertical-align的值產(chǎn)生作用的話,inline元素是必備要求,因此了解一點(diǎn)也不錯(cuò)嘛
這個(gè)空隙來源于inline元素之間的空格,所有的inline元素之間的空白都會(huì)變成一個(gè)空格。如果你想讓inline元素在水平上緊挨著,設(shè)置它們的寬度是不行的。因?yàn)橹g存在空隙,所以行的寬度不夠放下兩個(gè)inline元素。一行會(huì)被破壞為兩行。解決方案如下圖的右側(cè)
注意50% wide50% wide... and in next line50% wide50% wide
兩個(gè)建議,如果vertical-align屬性不起作用,那么問問自己:
line-box的上下邊緣以及baseline的位置在哪里?
inline元素的上下邊緣以及baseline的位置在哪里?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/111033.html
摘要:引言說起大家都知道他是用在對(duì)相鄰的文字和內(nèi)聯(lián)元素上,比如常見的將一個(gè)圖標(biāo)和相鄰的文字居中對(duì)齊。每個(gè)內(nèi)聯(lián)元素也有其自己的基線,頂線和底線。內(nèi)聯(lián)元素的基線位置低于行框的基線。內(nèi)聯(lián)元素的基線相對(duì)于行框基線移動(dòng)相應(yīng)于行高百分比的數(shù)值。 平時(shí)遇到vertical-align時(shí)候會(huì)有各種抓狂的時(shí)刻,調(diào)來調(diào)去雖然也弄好了但是心里面一直很虛,因?yàn)橐恢睕]有透徹理解過這個(gè)屬性,搜索時(shí)候發(fā)現(xiàn)了一篇很棒的文章...
摘要:水平居中行內(nèi)元素的水平居中在父元素中設(shè)置只對(duì)內(nèi)聯(lián)元素或行內(nèi)塊元素有效需要放置于父元素中塊級(jí)元素的水平居中只對(duì)塊級(jí)元素有效指的是自適應(yīng)寬度。參考張?chǎng)涡駥?shí)現(xiàn)絕對(duì)定位元素的居中及原理居中方式水平居中垂直居中塊級(jí)元素設(shè)置內(nèi)聯(lián)元素設(shè)置。 原文地址:https://www.xksblog.top/CSS-mainstream-centering-techniques.html 幾個(gè)月也零零散散學(xué)...
摘要:絕對(duì)定位讓元素脫離文檔流,所以他們不再影響他們的周邊元素。元素在文檔流中,也能感知其他元素尺寸的改變。中間,一個(gè)在文檔流中的元素并且?guī)в袑傩缘脑?。最右,不在文檔流中的元素但是內(nèi)容區(qū)域有高度。元素的基線依賴于元素是否是文檔流中的元素。 原文:Vertical-Align: All You Need To Know 通常我都有需要垂直對(duì)齊在一排上一個(gè)接著一個(gè)的元素。CSS提供了很多種可能...
摘要:水平水平居中有行內(nèi)元素和塊元素,行內(nèi)元素有文字圖片鏈接等塊元素主要是等元素。塊元素對(duì)于一個(gè)塊元素,可以設(shè)置其和自動(dòng),就像這樣在線查看無論塊元素的寬度是否已知,都可以實(shí)現(xiàn)水平居中。 這里主要參考的是CHRIS COYIER寫的一篇的文章(點(diǎn)擊查看),主要講了關(guān)于css水平、垂直居中的一些方法,每個(gè)方法后面都有一個(gè)demo,可以在線查看效果。 1 水平 水平居中有行內(nèi)元素和塊元素,行內(nèi)元素...
閱讀 1976·2023-04-25 23:43
閱讀 1060·2021-11-24 09:39
閱讀 811·2021-11-22 15:25
閱讀 1808·2021-11-22 12:08
閱讀 1193·2021-11-18 10:07
閱讀 2195·2021-09-23 11:22
閱讀 3451·2021-09-22 15:23
閱讀 2796·2021-09-13 10:32