1.对比

如果想要让块级元素一行排列,可以设置 float,也可以设置 inline-block。两者的效果比较相似,但也有区别:

**是否脱离文档流(Document flow): **
浮动元素会脱离文档流,并使得周围元素环绕这个元素。而 inline-block 元素仍在文档流内。因此设置 inline-block 不需要清除浮动。当然,周围元素不会环绕这个元素,你也不可能通过清除 inline-block 就让一个元素跑到下面去。

水平位置(Horizontal position):
很明显你不能通过给父元素设置 text-align:center 让浮动元素居中。事实上定位类属性设置到父元素上,均不会影响父元素内浮动的元素。但是父元素内元素如果设置了 display:inline-block,则对父元素设置一些定位属性会影响到子元素。(这还是因为浮动元素脱离文档流的关系)。

垂直对齐(Vertical alignment):
在两个 div 的高度不同时,两种方式的对齐效果也不相同:

  • 图一:display:inlne-block 属性修饰的元素没有脱离文档流,当然会与在正常的文档流中的元素一样采取的底端对齐方式。

  • 图二: float 属性修饰的元素在一定程度上脱离了普通文档流的限制,只用考虑向某个方向浮动,所以会产生如图的效果。

区别来了!!!如果是使用 display:inlne-block,则我们可以通过 vertical-align 来控制两个元素的对齐方式。比如说,我们可以为两个 div 分别添加一个属性:vertical-align:middle

<div class="myContainer">
     <div class="div1" style="display: inline-block;vertical-align: middle">
     </div>
     <div class="div2" style="display: inline-block;vertical-align: middle">
     </div>
</div>

这可以让 div1 出现在 div2 的居中位置。假如使用的是 float,那么是做不到这个效果的。

空隙(Whitespace):
inline-block 包含 html 空白节点。如果 html 中一系列元素的每个元素之间都换行了,当你对这些元素设置 inline-block 时,这些元素之间就会出现空隙。而浮动元素会忽略空白节点,互相紧贴。

2.如何消除 inline-block 带来的空隙

那么如何消除 inline-block 带来的空隙呢?有如下几种方法。

方法一

空隙其实是元素标签之间的空格导致的,所以把空格去掉后空隙自然就会消失了。来看以下几种写法:

  • 写法一(不建议使用):
<div class="demo">
    <span>我是一个span</span><span>我是一个span</span><span>我是一个span</span><span>我是一个span</span>
</div>
  • 写法二:
<div class="demo">
    <span>我是一个span
    </span><span>我是一个span
    </span><span>我是一个span
    </span><span>我是一个span</span>
</div>
  • 写法三:
<div class="demo">
    <span>我是一个span</span><!--
    --><span>我是一个span</span><!--
    --><span>我是一个span</span><!--
    --><span>我是一个span</span>
</div>

方法二

取消 span 的闭合标签,这样空隙就没有了。为了兼容 IE6/IE7,最后一个标签需要闭合。

<div class="demo">
        <span>我是一个span
        <span>我是一个span
        <span>我是一个span
        <span>我是一个span</span>
</div>
<style>
.demo span{
     background:#ddd;
     display: inline-block;
}    
</style>    

方法三

不管是思路一还是思路二,都只适用于写静态页面的时候,一旦 HTML 是后台生成,就不管用了。这时还有一个办法:在父容器上使用 font-size:0

<div class="demo">
        <span>我是一个span</span>
        <span>我是一个span</span>
        <span>我是一个span</span>
        <span>我是一个span</span>
</div>
<style>
.demo {font-size: 0;}
.demo span{
        background:#ddd;
        display: inline-block;
        font-size: 14px; /*要设置相应的字号*/
}
</style>

原理:
换行和回车会给各个 span 之间带来空格,而空格会被当成字符处理,因此通过给父元素设置字体大小为 0,则空格字符大小也为 0,相当于消除了其大小。需要注意的是,一定要额外设置 span 中的字体大小,否则会继承父元素的 0 大小字体。

方法四

上面的思路其实已经很完美,但可惜不兼容 Safari,以下给出终极方案,即 font-size:0 配合 letter-space:-N px

.finally-solve {
    letter-spacing: -4px;/*根据不同字体字号或许需要做一定的调整*/
    word-spacing: -4px;
    font-size: 0;
}
.finally-solve li {
    font-size: 16px;
    letter-spacing: normal;
    word-spacing: normal;
    display:inline-block;
    *display: inline;
    zoom:1;
}

3.总结

什么时候使用 inline-block,什么时候使用 float,这取决于你的设计稿跟解决方法。通常来说,当你需要控制元素的垂直对齐跟水平排列时,使用 inline-block;当你需要让元素环绕某一个元素时,或者需要支持旧版本 IE,或者不想处理 inline-block 带来的空隙问题时,使用 float