作者:凹凸曼 - 暖暖
一、SVG印象SVG 的應(yīng)用十分廣泛,得益于 SVG 強(qiáng)大的各種特性。 1.1、 矢量可利用 SVG 矢量的特點(diǎn),描出深圳地鐵的輪廓: 1.2、iconfontSVG 可依據(jù)一定的規(guī)則,轉(zhuǎn)成 iconfont 使用: 1.3、 foreignObject利用 SVG 的 <svg xmlns="http://www./2000/svg"> <foreignObject width="120" height="60"> <p style="font-size:20px;margin:0;">凹凸實(shí)驗(yàn)室 歡迎您</p> </foreignObject> </svg> 截圖實(shí)現(xiàn)流程:
1.4、SVG SMIL由于微信編輯器不允許嵌入 點(diǎn)擊 "凹凸實(shí)驗(yàn)室" 后,圍繞 "凹凸實(shí)驗(yàn)室" 中心旋轉(zhuǎn) 360度,點(diǎn)擊0.5秒后 出現(xiàn) https:/// ,動(dòng)畫只運(yùn)行一次。 下圖為 GIF循環(huán)演示: 代碼如下: <svg width="360" height="300" xmlns="http://www./2000/svg"> <g> <!-- 點(diǎn)擊后 運(yùn)行transform旋轉(zhuǎn)動(dòng)畫,restart="never"表示只運(yùn)行一次 --> <animateTransform attributeName="transform" type="rotate" begin="click" dur="0.5s" from="0 100 80" to="360 100 80" fill="freeze" restart="never" /> <g> <text font-family="microsoft yahei" font-size="20" x="50" y="80"> 凹凸實(shí)驗(yàn)室 </text> </g> <g style="opacity: 0;"> <!-- 同一個(gè)初始位置以及大致的寬高,觸發(fā)點(diǎn)擊事件 --> <text font-family="microsoft yahei" font-size="20" x="50" y="80">https:///</text> <!-- 點(diǎn)擊后 運(yùn)行transform移動(dòng)動(dòng)畫,改變文本的位置 --> <animateTransform attributeName="transform" type="translate" begin="click" dur="0.1s" to="0 40" fill="freeze" restart="never" /> <!-- 點(diǎn)擊0.5秒后 運(yùn)行opacity顯示動(dòng)畫 --> <animate attributeName="opacity" begin="click+0.5s" from="0" to="1" dur="0.5s" fill="freeze" restart="never" /> </g> </g> </svg> 以上是鄙人對SVG的大致印象,最近的需求開發(fā)再次刷新了我的認(rèn)知,那就是 SVG實(shí)現(xiàn)非比例縮放 以及 小程序不支持SVG標(biāo)簽的處理,下面容我來講述一番。 二、SVG 實(shí)現(xiàn)非比例縮放我們熟知的 iconfont,可通過改變字體大小縮放,但是這是 比例縮放,那如何實(shí)現(xiàn) SVG 的非比例縮放呢? 劃重點(diǎn):實(shí)現(xiàn)非比例縮放主要涉及三個(gè)知識(shí)點(diǎn):viewport、viewBox和preserveAspectRatio,viewport 與viewBox 結(jié)合可實(shí)現(xiàn)縮放的功能,viewBox 與 preserveAspectRatio 結(jié)合可實(shí)現(xiàn)非比例的功能。 2.1、viewport
通過類似CSS的屬性 <svg width="400" height="200"></svg> 2.2、viewBoxviewBox值有4個(gè)數(shù)字:x, y, width, height 。 <svg width="400" height="200" viewBox="0 0 200 100"></svg> 顯示器屏幕的畫面,可以特寫,可以全景,這就是
2.3、preserveAspectRatio上圖的紅色框框和藍(lán)色框框,恰好和顯示器的比例相同,如果是下圖的綠色框框,怎樣在顯示器屏幕中顯示呢? 2.3.1、 定義
preserveAspectRatio="[defer] <align> [<meetOrSlice>]" // 例如 preserveAspectRatio="xMidYMid meet" 其中 defer 此時(shí)不是重點(diǎn),暫且忽略,主要了解
2.3.2、 例子例子1: 例子2: 例子3: 例子4: 三、小程序不支持svg標(biāo)簽怎么辦微信小程序官方不支持 SVG 標(biāo)簽的,但是決定曲線救國,相當(dāng)于自己實(shí)現(xiàn)了一個(gè)SVG標(biāo)簽:使用小程序內(nèi)置的 但是今天我想講講其他的。 但是我這邊還有個(gè)需求,隨時(shí)更改 SVG 每個(gè)路徑的顏色,即 顏色可配置: 來回轉(zhuǎn) Base64 肯定是比較麻煩的,有沒有更好的方式呢? 3.1、URL 編碼直接使用 SVG XML 格式代碼,首先要了解 3.1.1、入門
原理:ASCII 字符 = % + 兩位 ASCII 碼(十六進(jìn)制)。 3.1.2、URL 編碼壓縮前言:
正文:
綜上所述,只需要對 受限字符或不安全字符 進(jìn)行編碼即可。
svgToUrl (svgData) { encoded = encoded .replace(/<!--(.*)-->/g, '') // 親測必須去掉注釋 .replace(/[\r\n]/g, ' ') // 親測最好去掉換行 .replace(/"/g, `'`) // 單引號(hào)是保留字符,雙引號(hào)改成單引號(hào)減少編碼 .replace(/%/g, '%25') .replace(/&/g, '%26') .replace(/#/g, '%23') .replace(/{/g, '%7B') .replace(/}/g, '%7D') .replace(/</g, '%3C') .replace(/>/g, '%3E') return `data:image/svg+xml,${encoded}` }
3.2、SVG 壓縮一般從 Sketch 導(dǎo)出 SVG ,冗余代碼比較多,有條件的話建議使用 SVGO 壓縮SVG的原本體積,比如清除換行、重復(fù)空格;刪除文檔聲明;刪除注釋;刪除desc描述等等。 四、總結(jié)SVG強(qiáng)大的地方在于,出其不意,炫酷,與眾不同。 無論是微信公眾號(hào)花式排版,foreignObject 標(biāo)簽實(shí)現(xiàn)截圖,實(shí)現(xiàn)非比例縮放,或者 背景圖直接使用 SVG XML 格式代碼,還是上文沒有提及的路徑動(dòng)畫、描邊動(dòng)畫、圖形裁剪、濾鏡等等,都可以玩出新的花樣。 |
|