首页 > 代码库 > 基于display:inline-block的列表布局

基于display:inline-block的列表布局

一、用float(浮动)实现列表布局的局限

  一说起列表布局。大家首先想到的就是用浮动float。这是相当常见的也是目前最最主流的列表布局方式,所以这里就不吃咸鱼蘸酱油——多此一举了。对于浮动局部的局限性,想必同行们都知道,就是每个列表元素的高度必须要一致,否则就会像是俄罗斯方块一样,“锯齿相错”,例如一个左浮动列表布局,如果第一行有个列表高度高于其他列表,那就在第二行,第一个元素会沿着最高元素的右侧对齐,此原因是属于恶魔系的float属性破坏了inline box。如下图:

  技术分享

  浮动本身就是个魔鬼,所以,使用浮动布局还需要修复其带来的副作用——高度塌陷的问题,也就是常提到的“清除浮动”了。

二、表格实现列表布局

  在表格布局时代,基本上不用担心列表元素高度不一会错位的问题,表格中的单元格(td标签)自动会等高关联,且水平列表项还包裹在tr等标签中,所以,不可能发生错位。所以,很正常的,我们会想到利用类似table属性的样式进行一些布局,例如display:table; display:table-row; display:table-cell;等属性,如果不是受制于IE6/7对这些display属性不支持,基于display:table的CSS布局定会大放异彩的。

  如果想使用display:table的CSS布局来代替浮动布局,权衡来看,不见得有提高。好的地方在于,不要担心列表元素的高度不一,甚至自动等高。撇开兼容性不谈,其还有不足在于在后台循环输出时需要水平repeat下,然后再垂直repeat。既然这样,还不如使用浮动布局,因为在这种情况下,使用浮动也是可以不用担心高度不一的问题的。所以,基本上,使用display:table的CSS布局来代替浮动布局是完全占据下风的。

三、另外一种display属性,display:inline-block

  display:inline-block感觉与display:table-cell有些相似,例如对内部元素的包裹性。但是,由于display:inline-block最大的不同就是其没有父元素的匿名包裹特性,这使得display:inline-block属性的使用非常自由,可与文字,图片混排,可内嵌block属性元素,可以可以置身于inline水平的元素中。可谓黑白通吃,左右逢源。

  inline-block属性的元素适用于inline box模型,所以,当其中的列表元素高度不一时,是不会有错位的。一言以蔽之,就是每一行所有的inline元素和inline-block元素会共同形成一个line boxes,这个line box的高度由里面最高的元素决定。所以,即使inline-block属性的列表元素高度异常,撑开的是整个line boxes的高度,因而,不会与下一行的列表元素发生错位。如下示意图所示的:

技术分享

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对于IE8+以及现代浏览器,直接使用: {display:inline-block;} 

对于IE6/7浏览器, *display:inline; *zoom:1; 

所以兼容写法: display:inline-block; *display:inline; *zoom:1; 

四、一点小阻挠:inline-block元素间的换行符空格间隙问题

在完整的展示兼容性的像素级的inline-block元素列表布局前,有必要讲讲使用display:inline-block列表布局经常会遇到的“换行符/空格间隙问题”。

如果inline-block元素间有空格或是换行产生了间隙,那是正常的,应该的。如果没有空格与间隙才是不正常的(IE6/7 block水平元素)。真正的inline-block元素,就像个图片一样。例如,两个不在一行的img标签,形成的两个图片之间就会有间隙,如下图所示:

技术分享

去除inline-block间距的方法有很多。这里只用一种方便的写法: font-size:0; 。这个IE6/7/8 都是兼容的。之前倒是谷歌Chrome不兼容font-size:0;,不过现在也兼容了。

五、总结:

大盒子(big-box)里装着小盒子(litter-box)

big-box  -->     big-box {text-align:center; font-size:0;}    内部小盒子居中显示

        big-box {text-align:justify; text-justify:distribute-all-lines;}   内部小盒子两端对齐。(若内容不够一行,则不会有效果,即使你强制换行也没用)。text-justify是IE兼容写法。

        span{ display:inline-block; width:100%;} 在内部小盒子中加入一个span元素,给予这个css样式,可以规避内容不够一行的情况。

litter-box -->    litter-box {display:inline-block; *display:inline; *zoom:1; vertical-align:top;}    抛弃浮动。这里vertical-align是小盒子的对齐方式。*XXX是IE兼容写法。

  如果是多层套用。则最外层元素写text-align,下面一层层都变为内联元素。

 

基于display:inline-block的列表布局