1. 程式人生 > >前端優化:如何將多張圖示合併成一張,做好資源連結優化?

前端優化:如何將多張圖示合併成一張,做好資源連結優化?

前端素材資源一般由圖片、SVG、音訊、視訊組成,每個資源都會有一個獨立的連結請求,當一個web頁面素材過多時,這表示該頁面將會建立多次連結請求,這將直接導致頁面載入速度變慢。那麼是否可以將一些常用的圖示素材合併成一張圖片實現共用呢?答案是可以的,這樣在使用時只需建立一次連結請求即可,這個步驟有點複雜, 我們一步步來。

首先,建立一個名稱為prepros的web專案,目錄結構如圖所示:


此專案使用的是sass樣式編譯,編譯工具為Prepros,關於這款工具使用說明可以參考文章《介紹一款極度優秀的前端編譯工具Prepros,讓您的程式設計效率幾何級的提升》。將要合併的6張圖示素材如下:


這裡要注意一點,圖示資料夾icons必須放在一個名稱為images的目錄下,且該images目錄和樣式編譯檔案sass.scss同級,否則編譯時會發生如下錯誤。


錯誤表明,當將images名稱改為img或其它時,將編譯出錯,此處應該是個Prepros的bug,必須要用images資料夾來合併圖片。

開啟sass.scss檔案,寫入程式碼:

$icons: sprite-map("icons/*.png", $spacing:15px);
@mixin iconsbg {
    background: $icons;
} 

@mixin iconbg($map, $sprite) {
    background-position: sprite-position($map, $sprite, 0, 0, false);
    $w: image-width(sprite-file($map, $sprite));
}

.icon {
    @include iconsbg;
}
 
.icon_1 {
    @include iconbg($icons,
    1);
    width: 16px;
    height: 16px;
}

.icon_2 {
    @include iconbg($icons,
    2);
    width: 16px;
    height: 16px;
}

.icon_3 {
    @include iconbg($icons,
    3);
    width: 16px;
    height: 16px;
}

.icon_4 {
    @include iconbg($icons,
    4);
    width: 16px;
    height: 16px;
}

.icon_5 {
    @include iconbg($icons,
    5);
    width: 16px;
    height: 16px;
}

.icon_6 {
    @include iconbg($icons,
    6);
    width: 16px;
    height: 16px;
}
$icons表示合併icons目錄下的所有圖示素材。

@mixin iconsbg表示引用合併後的圖片作為背景圖。

@mixin iconbg($map, $sprite)表示定位每張圖示素材的位置。

.icon_1表示對圖示1.png的引用。

點選儲存,Prepros將會自動編譯該檔案,並生成了一張由 1.png~6.png 6張圖示合併成的一張新組合素材icons-s72d43477be.png,如圖所示:


開啟該圖片,如圖所示,6張圖片已經合成1張。


開啟index.html檔案,引入編譯生成的sass.css檔案,程式碼如下:

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title></title>
		<link rel="stylesheet" href="assets/sass.css" />
	</head>

	<body>
		<div class="icon icon_1"></div>
		<div class="icon icon_2"></div>
		<div class="mycolor">Hello China</div>
	</body>

</html>
用瀏覽器開啟頁面,發現有個引用錯誤,合併圖路徑出錯了。


不要緊,修改一下sass.scss檔案即可,修改程式碼如下:

.icon {
    @include iconsbg;
    background: url('./images/icons-s72d43477be.png');
}
重新儲存允許,我們的圖示顯示出來了。


(注)實際上只建立了一次連結 http://localhost:7879/assets/images/icons-s72d43477be.png

此外,還有一種途徑可以科學的管理和使用圖示,使用阿里雲提供的線上圖示管理工具 iconfont。

官網地址是http://www.iconfont.cn/,裡面圖示均由SVG實現,不僅可以管理和共享自己的圖示庫,官網上也有大量的圖示庫可供使用,基本能滿足大部分專案對圖示的使用需求。當對圖示沒有太敏感需求的時候,建議前端工程師們使用 iconfont 來處理圖示相關需求。