1. 程式人生 > >簡單說 CSS的vertical-align

簡單說 CSS的vertical-align

說明

vertical-align屬性,是CSS屬性中一個比較重要的屬性,也是比較不好理解的一個。
我們今天就來說說它。

解釋

先來看看他的定義。

定義和用法

vertical-align 屬性設定元素的垂直對齊方式。
該屬性定義行內元素的基線相對於該元素所在行的基線的垂直對齊。允許指定負長度值和百分比值。這會使元素降低而不是升高。在表格中,這個屬性會設定單元格框中的單元格內容的對齊方式。

上面這段話,的確不是很好理解,沒關係,我們先不用去管他,不過我們先要記住一個事情。

只有元素屬於inline或是inline-block ,vertical-align屬性才會起作用。
例如圖片,按鈕,單複選框,單行/多行文字框等HTML控制元件,只有這些元素預設情況下會對vertical-align屬性起作用。

我們繼續來看看,vertical-align 可以取的值

/* 關鍵值 */
vertical-align: baseline;    /*預設。元素放置在父元素的基線上*/
vertical-align: sub;         /*垂直對齊文字的下標*/
vertical-align: super;       /*垂直對齊文字的上標*/
vertical-align: text-top;    /*把元素的頂端與父元素字型的頂端對齊*/
vertical-align: text-bottom; /*把元素的底端與父元素字型的底端對齊。*/
vertical-align: middle;      /*把此元素放置在父元素的中部*/
vertical-align: top; /*把元素的頂端與行中最高元素的頂端對齊*/ vertical-align: bottom; /*把元素的頂端與行中最低的元素的頂端對齊*/ /* 長度值 */ vertical-align: 10em; vertical-align: 4px; /* 百分比值 */ vertical-align: 20%; /* 全域性值 */ vertical-align: inherit; /*規定應該從父元素繼承 vertical-align 屬性的值*/ vertical-align: initial; /*設定屬性的初始值——瀏覽器的預設定義值*/
vertical-align: unset; /*CSS 關鍵字 unset 是 關鍵字 initial 和 inherit的組合。 如果有繼承父級樣式,則將該屬性重新設定為繼承的值,如果沒有繼承父級樣式,則將該屬性重新設定為初始值。 換句話說這個unset關鍵字會優先用inherit的樣式,其次會應該用initial的樣式。*/

基本的概念我們已經知道了,我們來看一個小例子

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style type="text/css">
        div{
            background: blue;
        }
    </style>
</head>
<body>

    <div>   
        <img src="https://img-blog.csdn.net/20170802165556550">
    </div>

</body>
</html>

你可能會奇怪,一個div 裡面 放一個 img 會有什麼事呢?
div的背景是藍色,我們來看看效果圖。
這裡寫圖片描述
奇怪的事情出現了,為什麼圖片下面會有一點點的空隙呢?
這就要說到 vertical-align 和 line-height ,不過在這之前我們要先說說,vertical-align 的預設值 baseline,看下面這張從張鑫旭大神那借來的圖就好了。

這裡寫圖片描述

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

我們在圖的旁邊寫點字看看,就很清楚了。
這裡寫圖片描述

我們能看見,圖片是和文字x的下邊緣,也就是基線對齊的,並不是和底線對齊。
現在我們調整圖片的 vertical-align 屬性值 為bottom,看看會怎樣

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <style type="text/css">
        div{
            background: blue;
        }
        img{
            vertical-align: bottom;
        }
        span{
            background: white;
        }
    </style>
</head>
<body>

    <div>   
        <img src="https://img-blog.csdn.net/20170802165556550"><span>x</span>
    </div>
</body>
</html>

效果圖
這裡寫圖片描述

好了,那一點點的空隙沒有了,這個時候你可能又有問題問了,最開始的時候,圖片旁邊沒有文字啊,那vertical-align 應該沒用啊,為什麼下面還有空隙呢?

這個呀,就是要注意的地方了,其實,圖片下面會有一點點的空隙,最根本的原因是因為,baseline發生了移動,不過我們為了方便記憶和理解,可以認為圖片旁邊有一個空白節點,他和文字的表現是一樣的,所以我們設定圖片的 vertical-align 就能解決這個問題。

既然我們知道了這些,那我們就能想到更多的解決方案了。
1、設定vertical-align的值,不使用baseline,使用bottom/middle/top都是可以。

2、我們知道vertical-align 的預設值是 baseline,它會和文字的基線對齊,我們直接去掉文字的高度也是可以了的,而文字的高度是由行高決定的,所以我們直接給div設定 line-height: 0; 也能解決問題。

3、說一下 line-height,它的預設值一般為1.2,當 line-height取值為數字或百分數時,它是基於當前字型尺寸來計算的,也就是font-size的大小,所以我們直接給div設定font-size: 0; 也是可以解決問題的。

4、我們最開始提到過,只有元素屬於inline或是inline-block ,vertical-align屬性才會起作用。所以我們直接讓vertical-align屬性失效也可以解決問題,那就直接給img 設定 display: block; 就可以了

總結

這次主要說了一些 vertical-align屬性的基礎的東西。
但是還是有一些要注意的地方。

1、只有元素屬於inline或是inline-block ,vertical-align屬性才會起作用。
2、vertical-align,取值是百分數值時,是相對於此標籤繼承的line-height值決定的。
3、line-height,取值是百分數值時,是相對於當前的font-size值決定的。
4、文中提到的圖片下方會有空隙,必須是HTML5文件宣告才會有的,其他的文件宣告沒有空白,就是必須要有<!DOCTYPE html>這句才可以。

最後 推薦幾篇講 vertical-align 的文章

這裡寫圖片描述