css難以理解的屬性:vertical-align

vertical-align,是一個使用時生不生效全靠運氣的屬性,也是初級前端程序員難以理解的屬性。接下來,將層層撥開vertical-align的神祕面紗,逐步深入掌握vertical-align。

一、周邊概念

首先,你可以先了解幾個概念:

                                                  

1、基線:一行字橫排時下沿的基礎線,是以英文小寫字母x下端沿的基線。字母’x’在CSS世界中的角色和故事

inline-block行內塊狀元素的基線比較特殊:

文字內容是指: inline-block元素呈現的文本內容,還包括,有內容效果的行內元素,比如img,input,select。

1)當 inline-block 元素中有文字內容的時候,inline-block元素的基線是最後一行文字內容(元素)的基線,無論文字內容在什麼子對象容器內、在什麼位置都沒有關係。

2)當 inline-block元素中不存在文字內容的時候,inline-block元素的基線是 容器的margin-bottom底邊緣,與容器內的元素沒有半毛錢關係,就算和內部元素髮生了外邊距合併也沒有任何影響。

2、x-height:基線和主線[mean line](也稱作中線[midline])之間的距離。

3、字體尺寸:font-size的設置值。

4、內聯盒模型,更深入的理解可以參考 CSS盒子模型

5、line-height:設置行間的距離(行高)。

當以百分比或倍數設置時,則根據font-size設置相對值。

p{
    font-size: 100px;
    line-height: 150%; // line-height的值爲100px * 150% = 150px
}

p{
    font-size: 100px;
    line-height: 1.5; // line-height的值爲100px * 1.5 = 150px
}

6、行框:line-height 與 font-size 的計算值之差(在 CSS 中成爲“行間距”)分爲兩半,分別加到一個文本行內容的頂部和底部。可以包含這些內容的最小框就是行框(line box)。

二、vertical-align

言歸正傳,vertical-align只對以下元素起作用:inline,inline-block,inline-table,用來指定元素的垂直對齊方式,對於塊級元素,vertical-align是不起作用的。

1、vertical-align:baseline(默認值),使元素的基線同父元素的基線(行框的基線)對齊。

基線 例1:空內容的行內塊狀元素 

<span style="border:1px solid blue;">
  這是前面的文字
  <div style="display:inline-block;width:100px;height:100px;border:1px solid red;">
  </div>
  這是後面的
</span>

運行結果:

基線 例2:img:像圖片或者輸入框這樣的元素,本身沒有基線,則將其底端同父元素的基線(行框的基線)對齊。

  <div>
    <img src="./touxiang.png">
    這是前面的文字
  </div>

運行結果:

基線 例3:有內容的inline-block

<body>
  <div style="display:inline-block;width:100px;height:100px;border:1px solid red;">
    這是第一個元素的內容
  </div>

  <div style="display:inline-block;width:150px;height:150px;border:1px solid red;">
    這是中間的元素xxx
  </div>

  <div style="display:inline-block;width:200px;height:200px;border:1px solid red;">
    這是最後一個元素的內容
    <img src="./touxiang.png">
  </div>

  文字xxx
</body>

運行結果:

所以當多幾個行內元素及行內塊狀排列時,我們會看到排列參差不齊,原因就在於每個元素的基線位置不同。

那如何讓每個元素垂直 居中排列呢,接下來我們就看vertical-align的另一個值:vertical-align:middle。

2、vertical-align:middle,即內聯元素(設置vertical-align:middle的元素)的垂直中心點(元素的1/2高度處)與行框盒子基線往上 1/2 x-height 處(字母x的正中間)對齊。

給上述的例3,每個div加上vertical-align: middle,則運行效果如下:

三、實例場景

1.圖片+單行文字

  <div style="border:1px solid blue">
    <img src="./touxiang.png" style="vertical-align: middle;">
    <span>xxxx我是一行單行文字</span>
  </div>

運行結果:

2.圖片+inline-block

這種場景就適合右邊內容多行及自定義內容的情況。

<style>
    .user {
      width: 320px;
      padding: 10px;
      font-size: 0;/*用於消除inline元素存在的幽靈空白節點*/
      border: 1px solid red;
    }

    .user-img {
      vertical-align: middle;
      width: 30%;
    }

    .user-info {
      border: 1px solid blue;
      display: inline-block;
      width: calc(70% - 2px);/*margin及border不計入width*/
      vertical-align: middle;
      font-size: 14px;
    }

  </style>
  <div class="user">
    <img src="./touxiang.png" class="user-img">
    <div class="user-info">
      <p>名字</p>
      <p>職務</p>
      <p>個人介紹:我是一個水瓶座的女生。</p>
      <p>個人介紹:我是一個水瓶座的女生。</p>
      <p>個人介紹:我是一個水瓶座的女生。</p>
    </div>
  </div>

運行結果:

3.單行文本居中

由於文本默認在行中垂直居中,所以將行高設置成父元素的高度,這樣,單行文本就在父元素垂直居中的位置。

 <div style="border:1px solid red;">
    <span style="line-height: 50px;">我只是一行文本</span>
  </div>

運行效果:

除了baseline及middle外,vertical-align還有其它的屬性值(text-top,sub,bottom等)及使用場景(控制table單元格內容的垂直對齊方式),有機會再跟大家一起分享。

部分參考資源:

1.關於 vertical-align 你應該知道的一切: https://juejin.im/post/5e64ee1df265da573e6734ed

推薦相關好文

1.你所不知道的vertical-align: https://www.jianshu.com/p/71a03b8f6eb6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章