作者:凹凸曼 - 暖暖
一、SVG印象SVG 的应用十分广泛,得益于 SVG 强大的各种特性。 1.1、 矢量可利用 SVG 矢量的特点,描出深圳地铁的轮廓: 1.2、iconfontSVG 可依据一定的规则,转成 iconfont 使用: 1.3、 foreignObject利用 SVG 的 <svg xmlns="http://www./2000/svg"> <foreignObject width="120" height="60"> <p style="font-size:20px;margin:0;">凹凸实验室 欢迎您</p> </foreignObject> </svg> 截图实现流程:
1.4、SVG SMIL由于微信编辑器不允许嵌入 点击 "凹凸实验室" 后,围绕 "凹凸实验室" 中心旋转 360度,点击0.5秒后 出现 https:/// ,动画只运行一次。 下图为 GIF循环演示: 代码如下: <svg width="360" height="300" xmlns="http://www./2000/svg"> <g> <!-- 点击后 运行transform旋转动画,restart="never"表示只运行一次 --> <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"> 凹凸实验室 </text> </g> <g style="opacity: 0;"> <!-- 同一个初始位置以及大致的宽高,触发点击事件 --> <text font-family="microsoft yahei" font-size="20" x="50" y="80">https:///</text> <!-- 点击后 运行transform移动动画,改变文本的位置 --> <animateTransform attributeName="transform" type="translate" begin="click" dur="0.1s" to="0 40" fill="freeze" restart="never" /> <!-- 点击0.5秒后 运行opacity显示动画 --> <animate attributeName="opacity" begin="click+0.5s" from="0" to="1" dur="0.5s" fill="freeze" restart="never" /> </g> </g> </svg> 以上是鄙人对SVG的大致印象,最近的需求开发再次刷新了我的认知,那就是 SVG实现非比例缩放 以及 小程序不支持SVG标签的处理,下面容我来讲述一番。 二、SVG 实现非比例缩放我们熟知的 iconfont,可通过改变字体大小缩放,但是这是 比例缩放,那如何实现 SVG 的非比例缩放呢? 划重点:实现非比例缩放主要涉及三个知识点:viewport、viewBox和preserveAspectRatio,viewport 与viewBox 结合可实现缩放的功能,viewBox 与 preserveAspectRatio 结合可实现非比例的功能。 2.1、viewport
通过类似CSS的属性 <svg width="400" height="200"></svg> 2.2、viewBoxviewBox值有4个数字:x, y, width, height 。 <svg width="400" height="200" viewBox="0 0 200 100"></svg> 显示器屏幕的画面,可以特写,可以全景,这就是
2.3、preserveAspectRatio上图的红色框框和蓝色框框,恰好和显示器的比例相同,如果是下图的绿色框框,怎样在显示器屏幕中显示呢? 2.3.1、 定义
preserveAspectRatio="[defer] <align> [<meetOrSlice>]" // 例如 preserveAspectRatio="xMidYMid meet" 其中 defer 此时不是重点,暂且忽略,主要了解
2.3.2、 例子例子1: 例子2: 例子3: 例子4: 三、小程序不支持svg标签怎么办微信小程序官方不支持 SVG 标签的,但是决定曲线救国,相当于自己实现了一个SVG标签:使用小程序内置的 但是今天我想讲讲其他的。 但是我这边还有个需求,随时更改 SVG 每个路径的颜色,即 颜色可配置: 来回转 Base64 肯定是比较麻烦的,有没有更好的方式呢? 3.1、URL 编码直接使用 SVG XML 格式代码,首先要了解 3.1.1、入门
原理:ASCII 字符 = % + 两位 ASCII 码(十六进制)。 3.1.2、URL 编码压缩前言:
正文:
综上所述,只需要对 受限字符或不安全字符 进行编码即可。
svgToUrl (svgData) { encoded = encoded .replace(/<!--(.*)-->/g, '') // 亲测必须去掉注释 .replace(/[\r\n]/g, ' ') // 亲测最好去掉换行 .replace(/"/g, `'`) // 单引号是保留字符,双引号改成单引号减少编码 .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 导出 SVG ,冗余代码比较多,有条件的话建议使用 SVGO 压缩SVG的原本体积,比如清除换行、重复空格;删除文档声明;删除注释;删除desc描述等等。 四、总结SVG强大的地方在于,出其不意,炫酷,与众不同。 无论是微信公众号花式排版,foreignObject 标签实现截图,实现非比例缩放,或者 背景图直接使用 SVG XML 格式代码,还是上文没有提及的路径动画、描边动画、图形裁剪、滤镜等等,都可以玩出新的花样。 |
|