微信小程序开发之SVG的使用

2018-05-22 10:54:42 浏览数 (1)

因为工作的原因,最近开始接触并且了解微信小程序。太久没有写或者看过前端相关的代码,加上小程序本身的bug也比较多,中间发现坑还是不少,后面逐渐整理总结一下。这一篇先总结一下svg在小程序中的使用。

SVG 简介

什么是SVG

SVG是”Scalable Vector Graphics”的简称。中文可以理解成“可缩放矢量图形”。是一个基于XML的图形描述语言。它是可以用于描述静态图、动画,以及用户界面的一种图形格式。1999年由万维网联盟发布。于2013年成为W3C推荐标准。

SVG有哪些优势

与其他图像格式相比,使用SVG的优势在于:

  • SVG 可被非常多的工具读取和修改
  • SVG 与JPEG和GIF图像比起来,尺寸更小,且可压缩性更强。
  • SVG 使用 XML 格式定义图形
  • SVG 图像在放大或改变尺寸的情况下其图形质量不会有所损失

SVG在小程序中的使用

由于前面提到的SVG的特性,因此他被广泛应用于各种开发中,尤其适合各种icon和图标,下面就结合具体的开发记录下小程序中使用SVG的过程。

获取SVG资源

目前常用的设计工具例如sketch等都支持将图形导出为SVG。当然如果没有设计图,如果只是一些常见的图标的话也可以去一些资源站点下载。下面是个人常用的资源站点:

  • https://material.io/icons/

material上有大量基于Android的Material Design设计的一些通用图标,而且支持导出为PNG,SVG等,例如文章中的示例icon:

  • https://material.io/icons/#ic_open_in_new

根据下图的提示下载对应的图标的SVG资源

获取对应SVG代码

使用任意文本编辑工具打开资源,可以看到里面的代码如下:

代码语言:javascript复制
<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的填充色,可以根据需求修改对应的填充颜色(由于示例中的SVG比较简单,因此只有一个填充颜色,并非所有SVG的最外层的fill都是他的填充色)。我们可以直接使用这部分代码,也阔以通过一些SVG优化工具进一步进行优化。目前我一般使用:

  • https://jakearchibald.github.io/svgomg/

将SVG图片直接拖入页面右侧的画布,他会根据一些通用优化方式对SVG进行初步优化,点击上方的MAKEUP,再看我们SVG的代码已经发生了变化(当然这里由于我们的示例图标比较简单,主要是删除了代码间的无效空白):

代码语言:javascript复制
<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>
将SVG代码转码为Base64编码格式

由于微信小程序的限制,我们不能像在web中一样直接使用SVG,只能是通过css,设置背景图片的方式来设置。因此我们先要把优化后的SVG转化为Base64格式。我一般用下面的地址:

  • https://codepen.io/jakob-e/pen/doMoML

打开网址以后,上推页面到下图位置,然后将之前生成的SVG代码复制到输入框中,发现SVG代码已经转化为Base64编码。

代码语言:javascript复制
background-image: url("data:image/svg xml, 228 bytes → 203 bytes 89.04% ");

如果是直接复制了svgomg中的代码,会发现生成的Base64代码中多了一点东西:

代码语言:javascript复制
`url("data:image/svg xml, 228 bytes → 203 bytes 89.04% 

代码中的228 bytes → 203 bytes 89.04% 为无效信息,需要手动删除,删除以后的SVG代码变为:

代码语言:javascript复制
background-image: url("data:image/svg xml, ");
在具体代码中引用SVG

至此我们就完成了在小程序中使用SVG的所有准备工作了,接下来在代码中使用就和普通的css中引用SVG没有太大区别。具体代码如下:

  • index.wxml:
代码语言:javascript复制
   <view class="svg-demo-container">
        <text class="icon-open-new icon"></text>
        <text class="svg-demo-text">在新窗口打开</text>   
   </view>
  • index.wxss:
代码语言:javascript复制
   .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, ");
     background-size: cover;
   } 	   
.icon {
     display: inline-block;
     width: 50rpx;
     height: 50rpx;
   }
 
 
  • 展示效果:

相关资源:

OK,至此我们就实现了在微信小程序中使用SVG资源。文章中涉及到的所有代码已经开源到github,相关链接如下:

  • github:
    • http: https://github.com/bihe0832/wx-app/tree/master/svg-demo
    • git: https://github.com/bihe0832/wx-app.git
  • 小程序代码片段(可以直接使用小程序开发工具导入):
    • wechatide://minicode/f3zNjDmE6oYB

0 人点赞