2014-11-13 68 views
1

鑑於以下(也JSFiddle)的:避免垂直對齊:中間延伸高度包含塊

div { 
 
    font-size: 28px; 
 
    outline: 1px solid red; 
 
    width: 40%; 
 
    float: left; 
 
    line-height: 36px; 
 
} 
 
div:first-child::before { 
 
    content: "Hi!"; 
 
    display: inline-block; 
 
    vertical-align: middle; 
 
    outline: 1px solid blue; 
 
    font-size: 8px; 
 
}
<div>xHello, world!</div> 
 
<div>xHello, world!</div>

的第二個div(即,不垂直取向中間內容)是36px高(正如人們所期望的那樣;其中的單線框的高度爲36px,每line-height)。

這裏的第一個div是39px高(帶有子像素渲染,這裏預計會有一些細微的變化,所以39px/40px都是合理的預期),因爲內容::before的線框延伸超過「normal 「內容,由於其垂直對齊。我怎樣才能得到包含塊(即div)只擴展到36px高(假設我不關心內容::before溢出它)?

將它從正常流程中取出的典型方法在此不起作用,因爲它不再是垂直對齊的。鑑於塊級元素的高度取決於其中最底部的線框,這是否合理?

+0

垂直對齊意味着什麼都沒有,你控制使用的line-height高度,看看[小提琴](http://jsfiddle.net/61omkd9d/2/)。 – skobaljic

+0

@skobaljic在上面的例子中,它沒有任何意義,只是因爲它發生在':: before'內容的font-size等於div內容的x-height;如果將':: before'的字體大小更改爲8px,則會更加清晰。 – gsnedders

+0

是的,但它看起來像一個錯誤(也許它是),這兩個元素是內聯的,所以他們應該保持在線。控制內聯元素高度的最佳方式是行高。 – skobaljic

回答

1

::before元素繼承36px行高。據我所知,它不需要行高,因爲你正在使用居中文本的垂直對齊方法。事實上,這種不必要的高線高度導致了這個問題。復位:

div { 
 
    font-size: 28px; 
 
    outline: 1px solid red; 
 
    width: 40%; 
 
    float: left; 
 
    line-height: 36px; 
 
} 
 
div:first-child::before { 
 
    content: "Hi!"; 
 
    display: inline-block; 
 
    vertical-align: middle; 
 
    outline: 1px solid blue; 
 
    font-size: 8px; 
 
    /* the line height is inherited, reset it */ 
 
    line-height: normal; 
 
}
<div>xHello, world!</div> 
 
<div>xHello, world!</div>

+0

再一次,垂直對齊在這裏沒有效果。 – skobaljic

+0

當(i)使用垂直對齊(ii)行高時,比較'Hi!'和'x'的位置。他們是不同的。 [見小提琴](http://jsfiddle.net/salman/61omkd9d/4/)。 –

+0

它應該被刪除,它有負面影響 - [小提琴](http://jsfiddle.net/61omkd9d/3/) – skobaljic