并列元素設置display:inline-block

有時候我們設置相鄰元素樣式時,比如三個div塊元素,我們想要讓它在一行顯示,當然除了定位,浮動之外我們可以設置他的display為inline-block,讓它變成行內塊進行一行顯示。當然普通的行內元素我們有時候也會這樣設置。下面的例子我們用div舉例
如下

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .item {
      width: 150px;
      height: 200px;
      background: red;
      display: inline-block;
    }
  </style>
</head>
<body>
  <div class="list">
    <div class="item">111111</div>
    <div class="item">2222</div>
    <div class="item">333</div>
  </div>
</body>
</html>

我們設置好便簽的內容,我們理想的呈現狀態(tài)是這樣的:


期望正常顯示狀態(tài)

但我們真正寫業(yè)務時,標簽的數據是不可控的,不是像我們寫demo那樣數據是寫死的,動態(tài)的數據有時我們也會出現標簽內的內容為空的時候,這里我們將第二個item的內容置為空,看看效果是不是會變

<div class="list">
    <div class="item">111111</div>
    <div class="item"></div>
    <div class="item">33333</div>
  </div>

此時顯示的效果是


此時顯示成這樣

不甘心,再讓第一個item內容變?yōu)榭?/p>

前兩個內容都為空

此時我們好像發(fā)現了什么,當相鄰元素設置成display:inline-block,有數據的元素與沒有數據的元素相鄰,有數據的元素會發(fā)生偏移。似乎好詭異,查下資料發(fā)現:當元素display設置為inline-block,可以將對象呈遞為內聯對象,但是對象的內容作為塊對象呈遞。對象呈遞為內聯元素,而同一行內的內聯元素默認是基于 baseline 對齊的,如下圖
基線

圖中的黑色線條就是我們所說的基線:為什么3個元素的方向不是相同的呢?為什么有內容的元素向下,而無內容的元素會向上呢?就此我們需要了解CSS渲染機制:對于一個inline-block元素,如果內部沒有inline內聯元素,或者overflow不是visible,則該元素的基線就是它margin的底邊緣,否則就是元素內部最后一行內聯元素的基線。
簡單地就以上這種情況來說,沒有內容的item會基于它的margin底邊緣也就是它的下邊緣對齊,而包含內容的item會基于其內部內聯元素的基線對齊,所以會造成這種一上一下的情況。
了解清楚這些原理我們想想有什么方法可以解決以上問題。當然我們首先可以想到,還用啥inline-block,直接float浮動一下,問題瞬間解決,想到了浮動,當然我們也可以想到定位去解決;當浮動和定位對于上下文布局影響太大,當然你要說一句再清除浮動,這話我沒法接,我只想說能不能少點代碼,有簡單的干嘛去復雜了寫,我們可以改變vertical-align的屬性,根據需求設置相關的值(top/middle/bottom),鑒于上面的實例我們試一下:

  .item {
      width: 150px;
      height: 200px;
      background: red;
      display: inline-block;
      vertical-align: top;
    }

此時的效果:


完美

有內容的和沒內容的已經完美“平等”,沒有“高低”

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容