關(guān)于inline-block

我一直以為inline-block是一個(gè)很簡(jiǎn)單的屬性,把inline元素設(shè)置為display:inline-block,就能得到一個(gè)可以設(shè)置寬高剪决、有block特性的的inline元素次员;或者把block元素設(shè)置為display:inline-block,就能得到一個(gè)可以在行內(nèi)顯示的block元素割笙。
但其實(shí)权烧,inline-block是一個(gè)非常復(fù)雜的屬性,它與line-height、vertical-align密不可分伤溉,并且存在著兩個(gè)很大的問題——間隙和居中般码。這篇博客主要對(duì)這兩個(gè)問題進(jìn)行整理并描述了inline-block的幾個(gè)應(yīng)用場(chǎng)景。

文章結(jié)構(gòu):

  • inline-block的問題
    1. 關(guān)于間隙
    2. 關(guān)于對(duì)齊
  • inline-block的應(yīng)用場(chǎng)景
    1. inline-block包住浮動(dòng)元素
    2. inline-block實(shí)現(xiàn)水平垂直居中

一乱顾、inline-block的問題

1板祝、關(guān)于間隙

首先我們來看inline元素,舉一個(gè)非常簡(jiǎn)單的例子走净。

// html
<body>
  <span>1</span>
  <span>2</span>
</body>

結(jié)果是什么券时?
選項(xiàng)A:12
選項(xiàng)B:1 2
為了方便觀察,我們給span加上border:

// css
span{
  border:1px solid;
}

結(jié)果:


我們看到伏伯,1和2之間是有空隙的橘洞,所以上面應(yīng)該選“B”。
inline-block是一種特殊的inline元素说搅,那如果我把上面的span設(shè)置為inline-block炸枣,結(jié)果又是什么樣的呢?

// css
span{
  display:inline-block;
  border:1px solid;
}

結(jié)果:

我們看到,與上面的結(jié)果幾乎一模一樣(不一樣的地方在于設(shè)置為inline-block時(shí)邊框要高一些适肠,這是由line-height決定的)霍衫,都有空隙。造成空隙的原因是兩個(gè)inline/inline-block元素之間有空格/回車侯养。去掉這個(gè)回車即可消除空隙敦跌。

// html
<body>
  <span>1</span><span>2</span>
</body>

結(jié)果:

但是你總不能永遠(yuǎn)不寫空格、回車吧逛揩?

還有一種方法柠傍,設(shè)置父元素的font-size為0(這樣空格/回車的font-size也為0),再設(shè)置span的font-size為 'xx'px即可辩稽,代碼如下:

<body>
  <div>
    <span>1</span>
    <span>2</span>
  </div>      
</body>
div{
  border:1px solid red;
  font-size:0;
}
span{
  font-size:16px;
  display:inline-block;
  border:1px solid;
}

但是這樣是很麻煩并且容易出錯(cuò)的携兵,所以這種方法也不建議使用!
在實(shí)際工作中搂誉,建議使用block/float/flex徐紧,棄用inline-block。block/float/flex均可消除這個(gè)間隙炭懊。

2并级、關(guān)于對(duì)齊

你可能不理解我這里的“關(guān)于對(duì)齊”是什么意思。同樣侮腹,我們來看代碼:

// html
<div>
  <span class='s1'>
    1
  <span class='s2'>
    2
  </span>
</div>   
// css
div{
    border:1px solid red;
}
span{
  display:inline-block;
  border:1px solid;
}
.s1{
  width:100px;
  height:200px;
}
.s2{
  width:200px;
   height:300px;
}

結(jié)果:


除了上面討論過的空隙問題外嘲碧,其他都是正常的。我們改變第一個(gè)span的內(nèi)容:

<span class='s1'>
  1哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈   
</span>

結(jié)果:


我們改變第二個(gè)span的內(nèi)容:

<span class='s2'>
  2嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
</span>

結(jié)果:


我們同時(shí)改變二個(gè)span的內(nèi)容:

<span class='s1'>
  1哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈   
</span>
<span class='s2'>
  2嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
</span>

結(jié)果:


綜上父阻,inline-block除了空隙問題外愈涩,還出現(xiàn)了一個(gè)新的問題——兩個(gè)inline-block的對(duì)齊問題。由于才疏學(xué)淺加矛、經(jīng)歷有限履婉,我還并沒有徹底弄清楚到底為什么會(huì)這樣,只是知道和字體默認(rèn)的基線對(duì)齊'vertical-align:baseline'有關(guān)斟览。
現(xiàn)在我們給span添加vertical-align:

// html
<div>
  <span class='s1'>
    1哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈   
  </span>
  <span class='s2'>
    2嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿
  </span>
</div>    
// css 
div{
  border:1px solid red;
}
span{
  display:inline-block;
  border:1px solid;
}
.s1{
  width:100px;
  height:200px;
  vertical-align:top;
}
.s2{
  width:200px;
  height:300px;
} 

結(jié)果:


所以毁腿,要想實(shí)現(xiàn)inline-block的對(duì)齊,需要改變 inline-block 元素的vertical-align:top /middle苛茂。在實(shí)際工作中已烤,同樣建議使用float/flex,棄用inline-block妓羊。

總結(jié):
1胯究、使用inline-block:該元素是獨(dú)生子,沒有兄弟元素躁绸,不需對(duì)齊(這樣也不會(huì)有空隙問題)
2裕循、inline-block一定要慎用丙猬!inline-block一定要慎用!inline-block一定要慎用费韭!


二、inline-block的應(yīng)用場(chǎng)景

1庭瑰、inline-block包住浮動(dòng)元素

我們現(xiàn)在想實(shí)現(xiàn)這樣一個(gè)界面:


‘logo’和‘login’水平垂直居中星持,且中間沒有空隙。
前面講到弹灭,如果想要去除inline/inline-block的空隙督暂,最好使用block/float/flex,棄用inline-block穷吮。使用flex十分簡(jiǎn)單逻翁,這里我們就使用float完成這個(gè)效果。

// html
<body>
  <div class='parent'>
     <span>logo</span>
     <span>login</span>
  </div>
</body>
// css
body{
  margin:0;
  padding:0;
}
.parent{
  max-width:300px;
  margin:0 auto;
  border:1px solid;
}
span{
  border:1px solid red;
  float:left;
}

結(jié)果:

我們知道捡鱼,當(dāng)元素設(shè)置float后八回,元素就脫離了文檔流,所以兩個(gè)span元素已經(jīng)不在.parent里了驾诈。那我怎么可以讓這兩個(gè)浮動(dòng)元素居中呢缠诅?
這時(shí)候,inline-block就派上用場(chǎng)了乍迄。由于inline-block可以包住浮動(dòng)元素管引,我們?cè)趦蓚€(gè)span的上面加一個(gè)inline-block包裹住他們。代碼如下:

// html
<body>
   <div class='parent'>
     <div class='box'>
        <span>logo</span>
        <span>login</span>
     </div>  
   </div>
</body>
// css
body{
  margin:0;
  padding:0;
}
.parent{
  max-width:300px;
  margin:0 auto;
  border:1px solid;
}
.box{
  border:1px solid blue;
  display:inline-block;
}
span{
  border:1px solid red;
  float:left;
}

結(jié)果:



你看闯两,inline-block是不是把兩個(gè)浮動(dòng)元素包住了褥伴?如果你還存在疑問,可以試試block漾狼,看看能不能包住浮動(dòng)元素(結(jié)果肯定是不能)重慢,是不是很神奇?

其實(shí)逊躁,inline-block之所以能包住浮動(dòng)元素伤锚,是因?yàn)?strong>BFC的影響,大家可查看我的另一篇博客為什么"overflow:hidden"能清除浮動(dòng)的影響中對(duì)BFC的講解志衣。

接下來屯援,我們對(duì).parent元素設(shè)置居中:

.parent{
  max-width:300px;
  margin:0 auto;
  border:1px solid;
  text-align:center;
}

結(jié)果:


但是,inline-block下面還是有空隙澳罡狞洋!這是怎么回事?
inline-block默認(rèn)基線對(duì)齊,所以inline-block下方還是有一個(gè)空隙(請(qǐng)參考我的另一篇博客“圖片下方為什么會(huì)有空隙”)绿店。所以我們?nèi)孕柙O(shè)置這個(gè)inline-block的vertical-align:

.box{
  border:1px solid blue;
  display:inline-block;
  vertical-align:top/bottom/middle;
}

結(jié)果:


2吉懊、inline-block實(shí)現(xiàn)水平垂直居中

inline-block實(shí)現(xiàn)水平垂直居中要和vertical-align配合使用庐橙,該方法能實(shí)現(xiàn)不定長(zhǎng)多行文字、不定長(zhǎng)圖片的水平垂直居中借嗽。
首先我們先來實(shí)現(xiàn)垂直居中态鳖,代碼如下:

// html
<body>
  <div class='wrapper'>
   <span></span>
    ![](http://upload-images.jianshu.io/upload_images/5617133-bea075f677449c0a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  </div>
</body>
// css
body{
  padding:0;
  margin:0;
}
*{
   box-sizing:border-box;
}
.wrapper{
  width:400px;
  height:300px;
  margin:0 auto;
  border:1px solid;
  text-align:center;
}
span{
  display:inline-block;
  border:1px solid blue;
  height:100%;
  vertical-align:middle;
}
img{
  width:200px;
  vertical-align:middle;
}

結(jié)果:


分析:
在圖片前面設(shè)置一個(gè)“透明”的span(為了觀察方便我將span顯示出來),將這個(gè)span設(shè)置為inline-block并設(shè)置高度與父元素的高度相同恶导,這樣浆竭,同時(shí)設(shè)置該span和圖片以中線對(duì)齊vertival-align:middle,即可實(shí)現(xiàn)垂直居中效果惨寿。
我們很容易看到邦泄,這時(shí)的圖片僅僅實(shí)現(xiàn)了垂直居中,還未實(shí)現(xiàn)水平居中裂垦,原因在于span和圖片之間的“空隙”顺囊。我們通過在圖片后面再添加一個(gè)相同的span來“抵消”這個(gè)空隙。代碼:

// html
<body>
  <div class='wrapper'>
   <span></span>
   ![](http://upload-images.jianshu.io/upload_images/5617133-bea075f677449c0a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
   <span></span>
  </div>
</body>

結(jié)果:


最后消除兩個(gè)span的邊框:

//添加span樣式
span{
  border:1px solid transparent;
}

結(jié)果:


至此蕉拢,我們就實(shí)現(xiàn)了圖片的水平垂直居中特碳。
最后,我們對(duì)上述代碼做一個(gè)小小的改進(jìn)晕换。我們看到测萎,圖片前面和后面都有一個(gè)span元素,換句話說届巩,父元素的第一個(gè)子元素和最后一個(gè)子元素都是無內(nèi)容不可見的span元素硅瞧,因此我們可以使用偽元素的特性進(jìn)行一些改進(jìn),代碼如下:

// html
<body>
  <div class='wrapper'>
   ![](http://upload-images.jianshu.io/upload_images/5617133-bea075f677449c0a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  </div>
</body>
// css
.wrapper{
  width:400px;
  height:300px;
  margin:0 auto;
  border:1px solid;
  text-align:center;
}
.wrapper::before,.wrapper::after{
  content:'';
  border:1px solid transparent;
  display:inline-block;
  height:100%;
  vertical-align:middle;
}
img{
  width:200px;
  vertical-align:middle;
}

結(jié)果:



其實(shí)恕汇,flex可以很簡(jiǎn)單地實(shí)現(xiàn)水平垂直居中的這個(gè)功能腕唧,只需要短短三行代碼即可。CSS3果然很方便啊......

由于個(gè)人水平有限瘾英,博客錯(cuò)誤之處枣接,煩請(qǐng)指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缺谴,一起剝皮案震驚了整個(gè)濱河市但惶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湿蛔,老刑警劉巖膀曾,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異阳啥,居然都是意外死亡添谊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門察迟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩狱,“玉大人耳高,你說我怎么就攤上這事∷唬” “怎么了泌枪?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)秕岛。 經(jīng)常有香客問我碌燕,道長(zhǎng),這世上最難降的妖魔是什么瓣蛀? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮雷厂,結(jié)果婚禮上惋增,老公的妹妹穿的比我還像新娘。我一直安慰自己改鲫,他們只是感情好诈皿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著像棘,像睡著了一般稽亏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缕题,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天截歉,我揣著相機(jī)與錄音,去河邊找鬼烟零。 笑死瘪松,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锨阿。 我是一名探鬼主播宵睦,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼墅诡!你這毒婦竟也來了壳嚎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤末早,失蹤者是張志新(化名)和其女友劉穎烟馅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然磷,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焙糟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了样屠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穿撮。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缺脉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悦穿,到底是詐尸還是另有隱情攻礼,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布栗柒,位于F島的核電站礁扮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏瞬沦。R本人自食惡果不足惜太伊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望逛钻。 院中可真熱鬧僚焦,春花似錦、人聲如沸曙痘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边坤。三九已至名扛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茧痒,已是汗流浹背肮韧。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旺订,地道東北人惹苗。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像耸峭,于是被迫代替她去往敵國(guó)和親桩蓉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案劳闹? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • 前言 在重新學(xué)習(xí)css院究,做自己的學(xué)習(xí)demo時(shí),設(shè)置一堆div在一行顯示本涕,呈現(xiàn)對(duì)比业汰。 結(jié)果如圖,設(shè)置了displa...
    destiny0904閱讀 1,085評(píng)論 0 1
  • 移動(dòng)開發(fā)基本知識(shí)點(diǎn) 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,472評(píng)論 0 6
  • 1.在什么場(chǎng)景下會(huì)出現(xiàn)外邊距合并放祟?如何合并鳍怨?如何不讓相鄰元素外邊距合并?給個(gè)父子外邊距合并的范例 外邊距合并指的是...
    JunVincetHuo閱讀 321評(píng)論 0 0
  • 參考文章:深入了解CSS的line-height屬性Vertical-Align: 你需要知道的所有事【譯】Ver...
    若邪Y閱讀 3,440評(píng)論 1 6