在一個行內格式化上下文中,盒是一個接一個水平放置的,從包含塊的頂部開始css
這些盒之間的水平margin
,border
和padding
都有效html
盒可能以不一樣的方式豎直對齊:以它們的底部或者頂部對齊,或者以它們裏面的文本的基線對齊瀏覽器
包含來自同一行的盒的矩形區域叫作行盒(line box)佈局
line box
的寬度由包含塊和float
狀況決定,通常來講,line box
的寬度等於包含塊兩邊之間的寬度,然而float
能夠插入到包含塊和行盒邊之間,若是有float
,那麼line box
的寬度會比沒有float
時小字體
line box
的高度由line-height
決定,而line box
之間的高度各不相同(好比只含文本的line box
高度與包含圖片的line box
高度之間)spa
line box
的高度可以容納它包含的全部盒,當盒的高度小於行盒的高度(例如,若是盒是baseline
對齊)時,盒的豎直對齊方式由vertical-align
屬性決定代理
當一行的行內級盒的總寬度小於它們所在的line box
的寬度時,它們在行盒裏的水平分佈由text-align
屬性決定。若是該屬性值爲justify
,用戶代理可能會拉伸行內盒(不包括inline-table
和inline-block
盒)裏的空白和字(間距)code
line box與float,vertical-align,text-alignorm
一個inline box
是一個(特殊的)行內級盒,其內容參與了它的包含行內格式化上下文htm
當一個inline box
超出一個line box
的寬度時,它會被分紅幾個盒,而且這些盒會跨多line box
分佈。若是一個inline-block
沒法分割(例如,若是該inline box
含有一個單個字符,或者特定語言的單詞分隔規則不容許在該inline box
裏分隔,或若是該inline box
受到了一個值爲nowrap
或者pre
的white-space
的影響),那麼該inline box
會從line box
溢出
當一個inline box
被分割後,margin
,border
和padding
在發生分割的地方(或者在任何分割處,若是有多處的話)不會有可視化效果
同一個line box
裏的inline box
也可能由於雙向(bidirectional)文本處理而被分割成幾個盒
須要盛放(hold)一個行內格式化上下文中的行內級內容時,建立一個line box
。不含文本、保留空白符(preserved white space)、margin
,padding
或者border
非0的行內元素、其它流內內容(例如,圖片,inline block
或者inline table
),而且不以保留換行符(preserved newline)結束的line box
必須被看成一個0高度的line box
,爲了肯定它裏面全部元素的位置,而其它時候(for any other purpose)必須當它不存在
如圖,咱們就知道了,在CSS中,line-height
不是相鄰文本行間上一個baseline
與下一文本行baseline
之間的距離,而是line box
的高度,也就是相鄰文本行間底線的距離
原文連接:Deep dive CSS: font metrics, line-height and vertical-align
line-height與可替換元素,非替換元素以及vertical-align
在例1中,決定line box
高度的是line-height
值,可是其實是content area
以及vertical spacing
決定的,line-height
=content area
+vertical spacing
須要注意的是,content area
不等於font-size
,只有在simsun(宋體)
下,二者相等
經過上面幾個例子,能夠得出如下結論:
計算line box
中每一個行內級盒的高度時,對於可替換元素,inline-block
元素和inline-table
元素,這個值就是其margin box
的高度;對於inline box
,這個值是其line-height
行內級盒是根據其vertical-align
屬性豎直對齊的.若是它們是top
或者bottom
對齊,它們必須對齊得讓line box
高度最小化.若是這樣的盒足夠高,存在多個解,而CSS 2.1沒有定義line box
基線的位置
line box
高度是最高的盒的top
與最低的盒的bottom
之間的距離
空行內元素生成空的
inline box
,這些盒仍然具備margin
,padding
,border
和line height
,並所以會影響這些計算,就像有內容的元素同樣
值 | 描述 |
---|---|
normal | 默認屬性值.跟着用戶的瀏覽器走,且與font-size關聯,通常來講normal值接近於line-height:1.2 |
number | 根據當前元素的font-size大小計算 |
length | 使用具體長度值做爲行高值 |
% | 使用百分比值做爲行高值,相對於設置了該line-height屬性的元素的font-size大小計算 |
inherit | 行高繼承.IE8+ |
在百分比行高值中,繼承的不是line-height:150%
,而是font-size:16px
與line-height:150%
的行高值24px;
在number行高值中,line-height
會根據當前元素的font-size
大小進行計算,能夠實現相應的比例縮放,因此通常建議使用number值
在例1中,咱們知道了圖片是基於baseline
對齊的,因此行高影響的是文本的高度,而不是圖片的高度
在例2中,咱們放置了單張圖片,在父容器使用text-align:center
,圖片受到影響,緣由是strut
對於一個內容由內聯級元素組成的塊容器元素,'line-height'指定了元素內行盒的最小高度。這個最小高度包含基線上方的最小高度和下方的最小深度,就像每一個行盒以一個具備該元素的字體和行高屬性的0寬內聯盒開始。咱們把這種假想盒叫作"strut"(這個名字是受TeX的啓發)
後面的幾個例子是圖片去除縫隙的解決方案,分別是:
圖片display:block
圖片vertical-align:bottom
父元素設置line-height:0
緣由是當line-height:0
時,行盒的基線會上移
該屬性會影響由一個行內級元素生成的盒的行盒內部的豎直定位
默認狀況下,inline
,inline-block
以及table-cell
能夠應用vertical-align
值 | 描述 |
---|---|
length | 把該盒提高(正值)或者下降(負值)這個距離。值'0cm'表示與「基線」相同 |
% | 把該盒提高(正值)或者下降(負值)這個距離('line-height'值的百分比)。值'0%'表示與「基線」相同 |
top | inline/inline-block 元素:元素頂部和整行的頂部對齊,table-cell 元素:單元格頂部padding 邊緣和表格行的頂部對齊 |
bottom | inline/inline-block 元素:元素底部和整行的底部對齊, table-cell 元素:單元格底部padding 邊緣和表格行的底部對齊 |
baseline | 把盒的基線與父級盒的基線對齊。若是該盒沒有基線,就把bottom margin邊和父級的基線對齊 |
middle | 把該盒的豎直中點和父級盒的基線加上父級的1/2x-height對齊 |
text-top | 把該盒的top和父級的內容區(content area)的top對齊 |
text-bottom | 把該盒的bottom和父級的內容區(content area)的bottom對齊 |
sub | 把該盒的基線下降到合適的位置做爲父級盒的下標(該值不影響該元素文本的字體大小) |
super | 把該盒的基線提高到合適的位置做爲父級盒的上標(該值不影響該元素文本的字體大小) |
在數值/百分比值中,vertical-align
能夠用負值,並且百分比值提高或下降對應的是line-height
值
去除圖片空隙的方法除了上面的幾個以外,還包括:
圖片vertical-align:top
,vertical-align:middle
line-height
爲number時,font-size:0
在table-cell
中,高度不足會使用padding
填充
這個例子用到的也是父元素font-size:0
,圖片垂直中心點會上移,並與容器垂直中心點重合,可是這種方法有缺陷,由於若是後面須要插入問題的時候,不會顯示出來
這裏,咱們在圖片後面插入了一個空span
而且設置爲vertical-align:middle
,二者都往下偏移,而後垂直中心點重合
vertical-align:text-bottom與表情圖片文字對齊
例1中,baseline
對齊表情會略微高過文字
例2中,bottom
對齊容易受到其它行內元素影響,比方說插入一張vertical-align:top
的圖片
例3中,middle
須要注意圖片的大小,圖片過大,圖片會相對於文字下沉,並且在IE6/7中有兼容性問題
例4中,text-bottom
是比較合適的用法,由於它不受行高和其它行內元素影響
vertical-align:text-bottom與baseline
在例1中,圖片下面有個很大的空白區,它的緣由是圖片和X與父級的content area
底部對齊,而line-height:250px;
底部的空白區是X的下邊距
在例2中,圖片和X都vertical-align:top
,也就是與父級的content area
頂部對齊,這時,圖片後面的普通文本是line-height:250px
的文本,圖片下方的空白至關於文本的下邊距
在上面的例子中,最後一行圖片的的空隙明顯要比圖片默認狀況下的空隙大,這是爲何呢,咱們先看一個例子
在例1中,咱們定義了一個空的inline-block
盒以及一個帶字符的inline-block
盒,第一個盒子的底邊緣和第二個盒子的baseline
對齊,也就是說,空inline-block
盒子的底邊緣是它的基線
在例2中,咱們設置了line-height:0
,此時,一個0高度的inline-block
有一個有高度的字符,因此它的半間距等於負的字符/2,也就是inline-block
會下沉1/2個字符,盒子的上邊緣在字符的中心點上
在CSS標準中是這樣寫的:
'inline-block'(盒)的基線是它的最後一個常規流中的行盒的基線,除非它沒有流內行盒或者它的'overflow'屬性的計算值不爲'visible',此時基線是bottom margin邊
因此,空隙過大的緣由是,圖片是baseline
對齊的,而line-height:0
時,字符X會下沉1/2,這裏多出來的空隙是1/2baseline
的高度
修復的方法:
父容器line-height:0
,最後一個空inline-block
插入一個字符,這時空隙就會消失
元素vertical-top
元素vertical-bottom
須要注意的是,若是空inline-block
元素使用vertical-align:bottom
時,是元素底部與整個行盒底部對齊,也就是說要保證每一個單獨的元素都設置vertical-align:bottom
在IE6/7下使用vertical-align
圖文一體化,圖片上下留白相等,而現代瀏覽器則不同
解決辦法:在圖片後面的文字inline-block
化
主體元素inline-block
化
添加一個寬度0高度100%的輔助元素
給這兩個元素vertical-align:middle