有效解決 css sprite 圖片使用 rem 單位邊角缺失的問題

原由

在移動端使用 rem 佈局時 sprite 圖片也須要用 rem 單位。
但因爲瀏覽器對小數單位精度解析的差別,在不一樣設備上一些圖片看起來會缺了一點點,或者多了一點點..css

有哪些方案?

  1. 【百分比 background-position】html

    既然不能寫固定單位,那麼用百分比應該能夠吧?
    其實上面的截圖正是用的百分比,網絡上見到大多數也有提到這個方法,但博主的實踐來看,並無效果,或許是哪裏沒作好..
  2. 【提升數值精度】git

    瀏覽器沒辦法精確的處理小數,那麼提升數值精度就行了吧。
    例如本來 `23.12456rem` ,提升 100 倍, 寫成 `2312.456rem` 這樣瀏覽器解析就會準確多了。

下面提到的辦法就是 【2】 的方案github

怎麼作?

思路

  • 單位數值變大了,總體也會變得很大,須要縮小回原來的尺寸。web

  • 縮小尺寸可使用 css 的 zoom,或者 transform scale,建議使用後者,緣由能夠看下最後的【參考文檔】gulp

小障礙

  • 從圖中能夠看到,scale 的縮放並不會影響到佈局segmentfault

  • 那麼能夠藉助 僞元素 讓要縮放的圖片脫離文檔流瀏覽器

編寫代碼

最後寫下如下代碼網絡

.icon-my {
    width: 2.13333rem;
    height: 2.13333rem;
    position: relative; /* 相對定位 */
}

.icon-my:after {
    content: '';
    width: 10000%;  /* 放大100倍 */
    height: 10000%;
    position: absolute; 
    left: 0;
    top: 0;
    background: url(icon-index.png) no-repeat -245.33333rem 0; /* 單位尺寸放大100倍 */
    background-size: 593.06667rem 458.66667rem;
    transform-origin: 0 0; /* 不從中心點縮放 */
    transform: scale(0.01); /* 縮放回原尺寸 */
}

一些別的研究

  • 相對於維護麻煩的 css sprite,其實還有 Data URI(base64的方式),並且不會遇到文章裏想要解決的問題,推薦閱讀【參考文檔】裏的資料app

盜圖一張?

  • 不遠的未來 人們會逐漸用上 http2,藉助 多路複用 的特性,不作 css sprite 看樣子性能會更好。

  • 聽說縮放 100 倍,在移動頁面上會致使嚴重性能問題,但博主暫時沒試出來..

參考文檔

移動端性能大比拼:CSS Sprites vs. Data URI
假如HTTP/2已經普及
zoom和transform:scale()的區別
移動端適配之雪碧圖(sprite)背景圖片定位 (百分比方案)
移動端web app自適應佈局探索與總結 (提升數值精度方案)

github庫

https://github.com/think2011/gulp-icons
相關代碼和調試能夠看下上面的代碼庫,也歡迎 star 收藏。

本文同時發佈在 think2011的博客 2017-03-31 20:07:23

相關文章
相關標籤/搜索