「Image Spriting」的工做原理是一堆的圖像(稱爲「sprites」,精靈)合併成一張大的圖像(國內稱爲雪碧圖),以達到減小HTTP的請求數。而後經過background-position
巧妙的顯示雪碧圖中須要呈現的圖像。php
下圖是一個工具欄的雪碧圖:css
鑑於上面的圖片,咱們能夠爲媒體圖標這樣寫樣式:html
$icon-width: 24px; $icon-height: 24px; $icons: image-url('toolbar.png'); .media-icon { background-image: $icons; background-position: -($icon-width * 5) -($icon-width * 1); width: $icon-width; height: $icon-height; }
這樣作是媒體圖像是背景圖中X軸方向的第五個以後,Y軸第一個圖像以後:python
雪碧圖是出名的難維護。添加一個新的圖像須要更新圖像與相關的CSS。更糟糕的是若是你要刪除一個圖像時,會變得更爲複雜。你會怎麼作呢?從新作過一張雪碧圖?web
幸運的是,Chris Eppstein的Compass項目包括了一套強大的工具,用於自動建立和維護雪碧圖。Compass能夠建立雪碧圖,給出每一個圖的精確座標,還可讓你控制圖的佈局下間距,並在SCSS中寫入須要的圖像。總之,Compass中製做雪碧圖的工具,將節省你大量的時間與精力。sql
我並不想從頭開始介紹Compass,由於這是項目浩大的工程,何況官網已經有不少教程。若是你並不熟悉Compass,我建議你先閱讀這些教程先。緩存
根據Compass製做雪碧圖的基本原理,你把圖像放在一個文件夾中,並且這個文件夾放在images/
的目錄下,Compass會根據您提供的源圖片生成一張雪碧圖。對於咱們工具欄的例子,我將圖片源都放在了images/toolbar
目錄下,就像下面這樣:sass
images/
|
`-- toolbar/ |-- bold.png |-- italic.png |-- link.png |-- code.png |-- unordered-list.png |-- ordered-list.png ...
請記住,你應該只把須要的圖片源放到這個文件夾內。Compass會利用這些圖片源合併出你最圖須要的雪碧圖。ruby
爲了能更好的經過示例演示Compass和Sass實現雪碧圖,將原文中的示例換成下圖所示:(爲了避免去找圖片源,我使用了我電腦中的一些圖片以示說明)bash
製做雪碧圖最簡單的方法就是使用Compass的@import
命令:
@import "images/toolbar/*.png";
若是你的Sass更新到了最新版本(Sass 3.3.7 (Maptastic Maple)),那麼運行上面的命令將沒法實現,在命令終端會報錯誤信息。這個時候你只須要在命令終端運行:
gem install compass --pre
。使用compass -v
命令查看你的版本號是否是:Compass 1.0.0.alpha.19。若是無誤,咱們能夠繼續往下。下面內容是譯者實戰中的經驗:
爲了能更好的實戰Compass和Sass製做雪碧圖,將原文中的結構換成了上圖的效果,從圖中能夠看出,咱們全部*.png
放在一個名叫「Color」的文件目錄之下,並且這個文件夾是放置在「images/
」之下。若是按照原文教程所言,在.scss
文件中直接經過@import
命令引用:
@import "images/toolbar/*.png";
根據示例所示,咱們只須要把toolbar
換成咱們的Color
:
@import "images/Color/*.png";
開啓compass watch
命令,終端會提示:
>>> Compass is watching for changes. Press Ctrl-C to Stop. info sass/screen.scss was modified overwrite stylesheets/ie.css overwrite stylesheets/print.css error sass/screen.scss (Line 8: No files were found in the load path matching "images/Color/*.png". Your current load paths are: /Applications/XAMPP/xamppfiles/htdocs/Sites/sass-test/images) overwrite stylesheets/screen.css
文件路徑錯誤,按照咱們寫CSS的經驗,我將路徑作相應的調整:
@import "../images/Color/*.png";
命令檢測到:
info sass/screen.scss was modified
identical stylesheets/ie.css
identical stylesheets/print.css
remove images/Color-s36a4fadee6.png
create images/Color-s1760dc49ac.png overwrite stylesheets/screen.css
雖然不報錯,但看編譯出來的.css
文件,不難發現路徑存在問題:
.Color-sprite { background-image: url('/images/../images/Color-s1760dc49ac.png'); background-repeat: no-repeat; }
說實在的,這讓我困惑。後來,我在想,是否是Compass已具有此功能,咱們只須要將路徑改爲包含圖片的文件夾開始,因而我嘗試這樣寫:
@import "Color/*.png";
命令終端也不路徑錯誤,並且編譯出來的CSS也是我想要的:
.Color-sprite { background-image: url('/images/Color-s36a4fadee6.png'); background-repeat: no-repeat; }
此時在你的項目的"images/"能夠看到一張名爲「Color-s36a4fadee6.png
」的圖,以下所示:
你們可能會感到很是神奇,想知道爲何?那麼咱們接下來回到原文。
在Compass看到@import
指令的參數爲*.png
時,它會假定將這個目錄下的全部.png
圖片製做成一張雪碧圖。讓他生成一個mixin,使您在項目中更好的使用雪碧圖。
其中mixin能夠爲雪碧圖的全部圖像生成對應的類。對於mixin的名稱是基於引入圖的文件夾名。例如咱們的示例:
@include all-toolbar-sprites;
編譯出來的CSS:
.toolbar-sprite, .toolbar-bold, .toolbar-italic, .toolbar-link { background-image: url('../images/toolbar-s1f1c6cbfd0.png'); background-repeat: no-repeat; } .toolbar-bold { background-position: 0 0; } .toolbar-italic { background-position: 0 -24px; } .toolbar-link { background-position: 0 -48px; }
請注意,Compass爲咱們自動建立了一張「toolbar-s1f1c6cbfd0.png」圖片。這就是咱們的雪碧圖。這命名咱們放圖像的文件夾(在這個例子中叫toolbar)加上一串字母和數字。每當你更新圖片源時,緩存的CSS就知道,而且會更新雪碧圖。
咱們再次回到我實戰的用例中來(是否是感受蠻亂的,有點神遊)。按照原文的教程所言,我在實際用例中是這樣作的:
在.scss
文件經過@include
調用Compass生成的mixin:
@include all-Color-sprites;
輸出的CSS代碼:
.Color-sprite, .Color-Behance, .Color-Deviantart, .Color-Dribbble, .Color-Facebook, .Color-Forrst, .Color-Github, .Color-LastFM, .Color-LinkedIn, .Color-Picasa, .Color-RSS, .Color-Skype, .Color-Tumblr, .Color-Twitter, .Color-Youtube { background-image: url('/images/Color-s36a4fadee6.png'); background-repeat: no-repeat; } .Color-Behance { background-position: 0 0; } .Color-Deviantart { background-position: 0 -52px; } .Color-Dribbble { background-position: 0 -104px; } .Color-Facebook { background-position: 0 -156px; } .Color-Forrst { background-position: 0 -208px; } .Color-Github { background-position: 0 -260px; } .Color-LastFM { background-position: 0 -312px; } .Color-LinkedIn { background-position: 0 -364px; } .Color-Picasa { background-position: 0 -416px; } .Color-RSS { background-position: 0 -468px; } .Color-Skype { background-position: 0 -520px; } .Color-Tumblr { background-position: