关于界面的价值观与方法论

CSS Sprite的新方法

14April2009

最正式的方法就是给一个透明图片加样式:

<img src="blank.gif" width="16" height="16" class="sprite" />

但是这样做有一些缺点:
1. 会多一个图片的请求
2. 众所周知的,内联行里的图片和中文字的底端无法对齐。这个问题的解决办法也有,就是用“vertical-align: -2px;” 强行把图片拉下来一截。

第二种方法:

a {
    display: block;
    text-indent: -3000px;
    overflow: hidden;
    width: 20px;
    height: 20px;
    background: url(...);
}

这个方法很不错,唯一的缺点就是它只能用于样式被设为块级的元素。

第三种方法是我自己想出来的,比较山寨,但是挺实用:

<span class="sprite">&nbsp;&nbsp;</span>
.sprite {
    font-family: "Courier New", Courier, monospace;
    font-size: 12px;
    letter-spacing: -14px;
    padding-left: 50px;
    background: url(...);
}

其中padding-left用来调节宽度。

这个方法的好处在于:
1. 没有多余的空白图片
2. 支持inline样式
3. 良好的垂直对齐

但这个山寨方法有很多局限性:
1. 高度的调节很麻烦。不同的浏览器对字体和行高的解析不一致。
2. 可能在不同操作系统中宽度和高度会不一致。(我还没全面测试)

不管怎么样,这至少是一个在某些固定环境中可以尝试的方法。


  1. fireyy:

    比较倾向于做跨浏览器的inline-block

  2. 蓝蓝小雪:

    看看这个……
    http://blog.istef.info/2008/10/13/cross-browser-inline-block-css/

    inline-block,然后混合一下第二种方法:
    a {
    text-indent: -3000px;
    overflow: hidden;
    width: 20px;
    height: 20px;
    background: url(...);
    /* 这里放更多的css属性,inline-block放在最后 */
    display: -moz-inline-stack;
    display: inline-block;
    zoom: 1;
    *display: inline;
    }

  3. OoSleePinG:

    img可以算是一个inline-block元素,一般是用inline-block的方法,但inline-block也有很大局限性比如ff2表现不佳,ff2下私有属性-moz-inline-stack和-moz-inline-box都有些问题,现在我是干脆放弃FF2。把inline-bock的hack放在css声明位置便于管理。
    .iflower1,.iflower2,.iflower3,.iflower4,.iflower5
    {display:-moz-inline-box;display:inline-block;*display:inline;zoom:1;*margin-right:3px;vertical-align:text-top;position:relative;}

    img标签的想法很有创意。支持

  4. 小麦:

    @蓝蓝小雪:inline-block那个很棒的说。

    哎,为啥之前一直没注意IE的hasLayout有这个特性呢~

    P.S. 你的blog真有趣:)

  5. oneboys:

    img这类可置换(replaced)inline元素的确同定义过inline-block的普通inline元素一致。

  6. bujichong:

    呵呵,不错,我抄一份回去备忘,经常遇到需要背景的内联元素

  7. 天堂左我往右:

    不错,呵呵