inline-block从入门到精通
Published by 乌龙茶
前端开发 14 条回复
首先先对行内元素(inline elements,比如span,a,b等。)和块元素(block elements,比如div,h1,p等)进行一下知识回顾.简而言之,它们的区别可以分为下几点
- 块元素会自动在末尾加一个换行,而行内元素不会。
- 块元素可以定义自身的高度(width)和宽度(height),而行内元素不可以。
- 块对象定义的自身垂直边距可以改变行高,而行内元素虽然可以定义但改变不了行高。
在前端开发中,我们遵循结构,表现,行为相分离。所以将修饰型图片利用css的background把它写在表现层中。那最常见的就是icon的应用。如:
去我的flickr相册。这是利用行内元素的左侧内间距(padding-left)实现的icon+文字的组合。
但有时候,我们还需要另外一种表现形式,只是单独的icon而不需要文字或者链接,并且是图文混排。也许你想只要把span里面的文字删除不就可以了么,实际上并非如你所愿。
。如果你现在在ie下,肯定什么也看不到。
原因是行内元素在内容为空的情况下,ie认为它的width为0。
,现在在ie下可以看到了。
根据行内元素的特性,并不能为其设置一个宽度来解决,所以只能在里面加一个毫无意义的空格用来占位,来生成一个高度值,但在无css的条件下(在spider的眼里),无法得知它为何物。如下:
<a class="icon-flickr"> </a>
所以这样的解决方案让人无法接受。
使用inline-block就可以解决这个问题
通过将外包元素设置为inline-block,利用有inline的行级特性和block的指定高度和宽度的特性。再通过将内嵌标签中的解释文字隐藏来实现该效果。
你会在这里看到两个并排的icon,它们是“~这里飘过无尽的解释性文字啊!~~这里飘过无尽的解释性文字啊!~”,flick的icon,它和文字在一起。
代码如下:
.icon{
display:inline-block;
/* ie8,firefox3,safari,opera */
display:-moz-inline-stack;
/* firefox2,-moz-inline-box其实也可以,但在某些情况下会有些异常-_-b */
*display:inline;
zoom:1;
/*
ie6,7,在ie中,如果该class应用在行内元素中的时候,
display:inline-block 会触发layout.
从而使该元素拥有inline-block的特性,但为了考虑到通用性,
使其能在块元素中应用,所以使用zoom:1来触发layout
*/
width:20px;
height:20px;
vertical-align:middle; /* 这个用来对opera的hack,使其垂直居中 */
overflow:hidden; /* 针对ie,防止内容溺出,造成的高度及宽度改变 */
background:url("http://l.yimg.com/a/i/ww/sp/trough_1.8.gif") -400px -680px;
}
.icon i{
visibility:hidden; /* 将解释性文字隐藏 */
}
<a href="#" class="icon"><i>~这里飘过无尽的解释性文字啊!~</i></a>
在最后,还要多说几句-moz-inline-stack,在firefox2中它还存在一下小bug.当它所应用的外包装器(wrapper)的display为inline的时候,它所包含的a或button将无法点击或者无法选取。我们需要通过position:relative来hack掉这个bug。Sigh~。
关于inline-block的详细分析可以参考学鹍的CSS{display:inline-block}或者圆心的display:inline-block的深入理解
相关阅读:
Cross Browser Support for inline-block Styling
display:inline-block的应用两例
Inline formatting context
www.hedgerwow.com



4月 5th, 2008 at 9:18 下午
首先先对内联对象(inline elements,比如div,h1,p等。)和块对象(block elements,比如span,a,b等)
是不是说反了?~···
4月 5th, 2008 at 11:57 下午
囧囧囧囧囧囧囧囧
真的写反了。。。不好意思哈。。。
4月 7th, 2008 at 9:20 上午
学到啦~~:)正好最近有用到,知一下所以然~哈
4月 7th, 2008 at 10:49 上午
没有用过,要好好去试下嘿嘿
4月 8th, 2008 at 9:16 上午
这篇文章不错^^display:-moz-inline-stack;用得妙
4月 8th, 2008 at 9:39 上午
对于
.icon i{
visibility:hidden; /* 将解释性文字隐藏 */
}
方法很欠缺,1、增加了无谓的标签,2、把控制权从一个元素变为了两个元素。
建议给.icon 设置 font-size:0 的属性
4月 8th, 2008 at 9:50 上午
不能修改自己的留言呀–! font-size:0 结合 text-indent:-9999em 使用。
4月 8th, 2008 at 10:14 上午
圆心说的对,在做的时候也考虑到2个元素,还是会有些欠缺。
font-size:0;这个解决方案不错。
谢谢圆心~ :)
ps:我们可以到后台去改评论,如果注册了的话应该可以修改吧。:p
4月 8th, 2008 at 3:23 下午
当font-size:0和text-indent:9999px配合使用的时候。还存在一点小问题,
比如<a class=”iocn” rel=”nofollow”>flickr</a>
这样在ie下的a的left offeset超大。。
在前面加个字将其顶出来才行。
4月 9th, 2008 at 1:36 上午
http://www.planabc.net/2008/04/08/cross_browser_support_for_inline-block_styling/ 提供了两种方式来隐藏文字。
4月 20th, 2008 at 12:17 下午
文字我喜欢用几年前老的方法~
用一个1×1的透明gif,设置好高宽,然后在alt属性内完成文字内容。
4月 20th, 2008 at 11:14 下午
上次把一个span变成inline-block,就是为了可以设置它的宽度,然后设置overflow:hidden。这么有用的属性,主流浏览器全都不支持,无奈。
4月 27th, 2008 at 3:59 下午
刚好最近有用到,不 错,当参考啦
给文字一个span 然后display:none;是不是也 可以隐藏文字不过也 是多了 个没用的 标签啊
4月 28th, 2008 at 10:00 上午
display:none;后的元素并不占位..
所以会ie6下会出现没有宽度的问题.