小程序, uni-app等不支持svg标签的情况下,svg图标解决方案

SVG因其缩放不失真,可动态改变颜色等特点, 在web开发中得到了广泛的使用, 目前常见的使用方式有两种

1. 转换成字体文件

线上的网站很多, 像iconfont,iconmoon等, 可以把选定的图标整合成一套字体文件, 然后以特定的标签+类名进行使用

2. 使用symbol引用

主要原理就是把所有要用到的svg文件代码,整合到一个代码块内,并给定每个svg图片一个唯一ID, 使用时候通个这个ID引入具体的svg图片,代码如下:

<svg aria-hidden="true"> 
    <use xlink:href="#ID"></use> 
</svg>

以上两种方式, 在web端都可以完美支持, 但是也有问题

1.无法做到按需引用

字体文件无法单独拆分,就算只使用其中的一个图标,也需要引入全部的字体文件, symbol引用则需要手动把用不到的删除, 比如A项目用到50个svg图标, B项目用到其中的10个, 追求打包后文件大小的话, 就需要重新生成字体文件, 或者重设symbol引用的svg集合

2. 额外文件,重复代码太多

font的话,会生成6个文件,而symbol引用的重复代码太多, svg的格式是固定的, 像svg标签本身代码都属于重复代码,里面的version,xmlss属性都是完全一样的 对于包大小有限制的项目,比如小程序,这些都属于可优化的地方

具体到小程序或者uni-app这种,本身是不支持svg标签的, 所以只能使用字体文件, 但是字体文件又有以上的问题, 所以优化的思路就是:

1. 在小程序等不支持svg标签的环境下使用

2. 单个svg按需使用

svg库可能有很多个文件,但是每个项目可以只使用其中的某些

3. 缩减SVG体积, 去除重复标签

针对第一个问题, 虽然小程序不支持svg标签, 但是支持css的background-image和DATA Urls, 类似下面的代码是支持的

.icon{
background-image: url("data:image/svg+xml,<svg viewBox='0 0 1024 1024' fill='%23cc582c' version='1.1' xmlns='http://www.w3.org/2000/svg'>...</svg>");
}

需要注意单双引号和特殊字符的编码, 颜色字符的#就必须转换成%23

svg标签重复的问题, 可以通过代码动态填充来解决, 使用图标时候, 再动态添加svg标签

针对以上优化需求, 写了个npm库, 按需引用svg, 减小svg体积, 支持uni-app, 使用说明

针对普通vue项目

import Vue from 'vue'
import '@xpf0000/vuesvgicon/dist/VueSvgIcons.css'
import VueSvgIcons from '@xpf0000/vuesvgicon'
Vue.component('Icons', VueSvgIcons)

uni-app引用umd文件有问题, 直接引用源文件

import Vue from 'vue'
import VueSvgIcons from '@xpf0000/vuesvgicon/src/components/vue-svg-icons'
Vue.component('Icons', VueSvgIcons)

添加svg文件, 采用注册机制, 填写svg默认宽高和svg内部代码

import Icon from '@xpf0000/vuesvgicon'
Icon.register({
  'text': {
    'width': 300,
    'height': 150,
    'raw': `<defs>
<path id="path1" d="M75,20 a1,1 0 0,0 100,0" />
</defs>
<text x="10" y="100">
<textPath xlink:href="#path1">I love SVG I love SVG</textPath>
</text>`
  }
})

使用图标

<template>
  <div>
   <Icons name="text"></Icons>
  </div>
</template>

<script>
import './text.js'

export default {
  data: function () {},
  methods: {}
}
</script>

小程序,APP端使用, 添加props :background-image="true"

<Icons :background-image="true" name="text"></Icons>

运行时,会使用css的background-image进行展示

NPM: https://www.npmjs.com/package/@xpf0000/vuesvgicon
GIT: https://github.com/xpf0000/vuesvgicon

欢迎大家star&讨论

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354