《CSS权威指南》:
行内块元素是一个混合产物,它是块级元素和行内元素的混合。
在行内块元素内部,会像块级元素一样设置内容的格式。就像所有块级或行内替换元素一样,行内块元素也有属性width和height,如果比周围内容高,这些属性会使行高增加。
写在前面的话:IE6/7 是不支持 display: inline-block
的。因此如果我们要使用 display:inline-block
来取代 float
来实现列表的水平布局,需要考虑浏览器的兼容性。不仅如此,使用 display: inline-block
来实现水平布局还会产生空白间距的问题,关于这个问题可以看 大漠 写的一篇文章(文章最后有链接)。
对于display: inline-block
布局,张鑫旭写过文章详细介绍过(文章最后有链接)。所以本文算是自己的一个简单整理吧。
IE6/7 下的 display: inline-block
IE6/7 本身是不支持 display: inline-block
的。
在IE6/7下使用display: inline-block
会触发 IE6/7的 hasLayout (IE8以后已经不在使用, IE6/7下的一些bug很多时候就是和这个有关的。这时就需要触发hasLayout,一般的触发方法和触发BFC(Block Formatting Contexts)是一样的。本人觉得最好使的方法就是使用 zoom: 1;
)。
因此,在IE6/7下,将inline
元素转化为inline-block
元素,触发了hasLayout,从而使内联元素拥有了行内块元素的一些特性(可以像块元素一样设置内容的样式),呈现和其他浏览器一样的效果。
而对于将block
元素转化为inline-block
元素,虽然也同样触发了hasLayout,可是对于块级元素,它本身就是行布局,所以触发后,依然是行布局,依旧会产生换行。
因此使用 display: inline-block
实现水平布局,在IE6/7下,我们需要考虑两种情况:
block
元素inline-block
化在相应的元素中设置CSS:
display: inline-block; *display: inline;
HTML代码:
<div class="line"> <div class="b-2-ib">fff</div> <div class="b-2-ib">fff</div> <div class="b-2-ib">fff</div> <div class="b-2-ib">dfgfddddddddggfdddddddddddddddddddddg</div> </div>
CSS代码:
.line { font-size: 0; word-break: break-all; } .line .b-2-ib { width: 100px; line-height: 1; display: inline-block; *display: inline; /*使其可以呈现内联元素的特性*/ border: 1px solid #000; font-size: 16px; vertical-align: top; }
inline
元素inline-block
化在相应的元素中直接设置CSS:
display: inline-block;
即可。HTML代码:
<div class="line2"> <span class="i-2-ib">1</span> <span class="i-2-ib">2</span> <span class="i-2-ib">3</span> <span class="i-2-ib">4dggggggggggggggggggggggggggggg</span> </div>
CSS代码:
.line2 { font-size: 0; word-break: break-all; } .line2 .i-2-ib { width: 100px; line-height: 1; display: inline-block; *margin-left: -1px; /*解决1px的问题*/ border: 1px solid #000; font-size: 16px; vertical-align: top; }
在本文所列出的代码中,解决空白间距,使用的是将font-size
属性设置为0
(目前Google已支持)。细心的人,可以发现:对于inline
元素 inline-block
化时,CSS代码中多加了*margin-left: -1px;
,是因为在IE6/7下面会产生 1 像素问题。因此在这里使用的是这个方法。目前在Google,Firefox,IE10(以及切换IE自带的文档模式切换IE9/8/7/5)下,测试上面代码没有问题。
不过遇到具体问题需要具体分析以及找到解决办法。可以看看下面的两篇文章。