SVG是”Scalable Vector Graphics”的簡稱。中文可以理解成“可縮放矢量圖形”。是一個基于XML的圖形描述語言。它是可以用于描述靜態(tài)圖、動畫,以及用戶界面的一種圖形格式。1999年由萬維網(wǎng)聯(lián)盟發(fā)布。于2013年成為W3C推薦標(biāo)準(zhǔn)。
與其他圖像格式相比,使用SVG的優(yōu)勢在于:
由于前面提到的SVG的特性,因此他被廣泛應(yīng)用于各種開發(fā)中,尤其適合各種icon和圖標(biāo),下面就結(jié)合具體的開發(fā)記錄下小程序中使用SVG的過程。
目前常用的設(shè)計工具例如sketch等都支持將圖形導(dǎo)出為SVG。當(dāng)然如果沒有設(shè)計圖,如果只是一些常見的圖標(biāo)的話也可以去一些資源站點下載。下面是個人常用的資源站點:
material上有大量基于Android的Material Design設(shè)計的一些通用圖標(biāo),而且支持導(dǎo)出為PNG,SVG等,例如文章中的示例icon:
根據(jù)下圖的提示下載對應(yīng)的圖標(biāo)的SVG資源
使用任意文本編輯工具打開資源,可以看到里面的代碼如下:
<svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0h24v24H0z" fill="none"/>
<path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
</svg>
其中最外層的 fill="#000000"
就是SVG的填充色,可以根據(jù)需求修改對應(yīng)的填充顏色(由于示例中的SVG比較簡單,因此只有一個填充顏色,并非所有SVG的最外層的fill都是他的填充色)。我們可以直接使用這部分代碼,也闊以通過一些SVG優(yōu)化工具進一步進行優(yōu)化。目前我一般使用:
將SVG圖片直接拖入頁面右側(cè)的畫布,他會根據(jù)一些通用優(yōu)化方式對SVG進行初步優(yōu)化,點擊上方的 MAKEUP
,再看我們SVG的代碼已經(jīng)發(fā)生了變化(當(dāng)然這里由于我們的示例圖標(biāo)比較簡單,主要是刪除了代碼間的無效空白):
<svg height="24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/></svg>
由于微信小程序的限制,我們不能像在web中一樣直接使用SVG,只能是通過css,設(shè)置背景圖片的方式來設(shè)置。因此我們先要把優(yōu)化后的SVG轉(zhuǎn)化為Base64格式。我一般用下面的地址:
打開網(wǎng)址以后,上推頁面到下圖位置,然后將之前生成的SVG代碼復(fù)制到輸入框中,發(fā)現(xiàn)SVG代碼已經(jīng)轉(zhuǎn)化為Base64編碼。
background-image: url("data:image/svg+xml, 228 bytes → 203 bytes 89.04%25 %3Csvg height='24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z'/%3E%3C/svg%3E");
如果是直接復(fù)制了svgomg中的代碼,會發(fā)現(xiàn)生成的Base64代碼中多了一點東西:
url("data:image/svg+xml, 228 bytes → 203 bytes 89.04%25 %3Csvg`
代碼中的 228 bytes → 203 bytes 89.04%25
為無效信息,需要手動刪除,刪除以后的SVG代碼變?yōu)椋?/p>
background-image: url("data:image/svg+xml, %3Csvg height='24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z'/%3E%3C/svg%3E");
至此我們就完成了在小程序中使用SVG的所有準(zhǔn)備工作了,接下來在代碼中使用就和普通的css中引用SVG沒有太大區(qū)別。具體代碼如下:
<view class="svg-demo-container">
<text class="icon-open-new icon"></text>
<text class="svg-demo-text">在新窗口打開</text>
</view>
.svg-demo-container {
margin: 50rpx;
width: 300rpx;
display: flex;
align-items: center;
}
.svg-demo-text {
color: #888896;
font-size: 26rpx;
margin-left: 9rpx;
}
.icon-open-new {
background-image: url("data:image/svg+xml, %3Csvg height='24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3Cpath d='M19 19H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z'/%3E%3C/svg%3E");
background-size: cover;
}
.icon {
display: inline-block;
width: 50rpx;
height: 50rpx;
}
展示效果:
OK,至此我們就實現(xiàn)了在微信小程序中使用SVG資源。文章中涉及到的所有代碼已經(jīng)開源到github,相關(guān)鏈接如下:
https://github.com/bihe0832/wx-app.git
wechatide://minicode/Qbo6ewmT69Ym