inline-block从入门到精通

首先先对行内元素(inline elements,比如span,a,b等。)和块元素(block elements,比如div,h1,p等)进行一下知识回顾.简而言之,它们的区别可以分为下几点

  1. 块元素会自动在末尾加一个换行,而行内元素不会。
  2. 块元素可以定义自身的高度(width)和宽度(height),而行内元素不可以。
  3. 块对象定义的自身垂直边距可以改变行高,而行内元素虽然可以定义但改变不了行高。

在前端开发中,我们遵循结构,表现,行为相分离。所以将修饰型图片利用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~。

  • 在firefox2里面我终于可点了
  • 我也是a可为什么我却不能点??—_—|||

关于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

你可能感兴趣的:(inline-block从入门到精通)