A tool to create svg icon components. (vue 2.x) 一个创建 svg 图标组件的工具。(vue 2.x)
https://github.com/Justineo/vue-awesome
https://mmf-fe.github.io/vue-svgicon/
# 安装到全局
npm install vue-svgicon -g
# 安装到项目
npm install vue-svgicon
# 生成 svg 图标组件, -s: svg 源文件,-t: 图标组件生成路径
vsvg -s /path/to/svg/source -t /path/for/generated/components
{
"scripts": {
"svg": "vsvg -s ./static/svg/src -t ./src/icons"
}
}
# bash
npm run svg
以上命令会在指定目录下生成图标
# 指定模板路径
vsvg -s /path/to/svg/source -t /path/for/generated/components --tpl /path/for/icon-template
默认模板是
/* eslint-disable */
var icon = require('vue-svgicon')
icon.register({
'${name}': {
width: ${width},
height: ${height},
viewBox: ${viewBox},
data: '${data}'
}
})
vsvg -s /path/to/svg/source -t /path/for/generated/components --ext ts
vsvg -s /path/to/svg/source -t /path/for/generated/components --ext ts --es6
首先,你需要为 vue-svgicon
在全局写一些样式代码。推荐的代码如下:
/* recommended css code for vue-svgicon */
.svg-icon {
display: inline-block;
width: 16px;
height: 16px;
color: inherit;
vertical-align: middle;
fill: none;
stroke: currentColor;
}
.svg-fill {
fill: currentColor;
stroke: none;
}
.svg-up {
/* 默认 */
transform: rotate(0deg);
}
.svg-right {
transform: rotate(90deg);
}
.svg-down {
transform: rotate(180deg);
}
.svg-left {
transform: rotate(-90deg);
}
你可以使用
classPrefix
选项设置默认的 class 的前缀。默认的前缀是svg
注册 vue-svgicon
组件
import Vue from 'vue'
import App from './App.vue'
import SvgIcon from 'vue-svgicon'
// Default tag name is 'svgicon'
Vue.use(SvgIcon, {
tagName: 'svgicon'
})
new Vue({
el: '#app',
render: h => h(App)
})
在组件中使用图标组件
<!-- App.vue -->
<template>
<div id="app">
<p>
<svgicon name="vue" width="200" height="200" color="#42b983 #35495e"></svgicon>
</p>
</div>
</template>
<script>
// �使用之前需要引入生成的图标�
import 'icons/vue'
export default {
name: 'app',
data () {
return {
msg: 'Welcome to Your Vue.js App',
}
}
}
</script>
你可以 � 一次将所有 � 图标引入进来
import 'icons'
自定义标签名. 默认是 svgicon
Vue.use(svgicon, {
tagName: 'svgicon'
})
<svgicon name="vue"></svgicon>
你可以使用 classPrefix
选项设置默认的 class 的前缀。默认的前缀是 svg
Vue.use(svgicon, {
classPrefix: 'vue-svg'
})
这样会生成像以下那样的代码
<svg version="1.1" viewBox="0 0 4 7" class="vue-svg-icon vue-svg-fill vue-svg-up">
<!-- svg code -->
</svg>
默认大小
Vue.use(svgicon, {
defaultWidth: '1em',
defaultHeight: '1em'
})
默认使用描边样式
Vue.use(svgicon, {
isStroke: true
})
图标名称
<svgicon icon="vue"></svgicon>
<svgicon name="vue"></svgicon>
图标方向
<svgicon name="arrow" width="50" height="50" dir="left"></svgicon>
<svgicon name="arrow" width="50" height="50" dir="up"></svgicon>
<svgicon name="arrow" width="50" height="50" dir="right"></svgicon>
<svgicon name="arrow" width="50" height="50" dir="down"></svgicon>
是否填充 path/shape. 默认是 true
<svgicon name="arrow" width="50" height="50"></svgicon>
<svgicon name="arrow" width="50" height="50" :fill="false"></svgicon>
You can use r-color to reverse the fill property 你可以使用 r-color 反向设置 fill 属性。
<!-- 第一个 path 是填充的 (默认), 第二个是描边 -->
<svgicon name="clock" color="#8A99B2 r-#1C2330" width="100" height="100"></svgicon>
<!-- 第一个 path 是描边的 (默认), 第二个是填充 -->
<svgicon name="clock" color="#8A99B2 r-#1C2330" width="100" height="100" :fill="false"></svgicon>
指定图标大小,默认单位是 px
<svgicon name="arrow" width="50" height="50"></svgicon>
<svgicon name="arrow" width="10em" height="10em"></svgicon>
缩放图标
<svgicon name="arrow" scale="10"></svgicon>
<svgicon name="arrow" scale="10" width="10em" height="10em"></svgicon>
指定图标颜色. 默认是继承颜色.
<p style="color: darkorange">
<svgicon name="arrow" width="50" height="50"></svgicon>
<svgicon name="arrow" width="50" height="50" color="red"></svgicon>
<svgicon name="arrow" width="50" height="50" color="green"></svgicon>
<svgicon name="arrow" width="50" height="50" color="blue"></svgicon>
</p>
如果图标有多个 path/shape, 你可以按照顺序定义多种颜色。
<svgicon name="vue" width="100" height="100" color="#42b983 #35495e"></svgicon>
你可以使用 css 设置颜色
<svgicon class="vue-icon" name="vue" width="100" height="100"></svgicon>
.vue-icon path[pid='0'] {
fill: #42b983;
}
.vue-icon path[pid='1'] {
fill: #35495e;
}
使用渐变
<template>
<svg>
<defs>
<linearGradient id="gradient-1" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stop-color="#57f0c2"/>
<stop offset="95%" stop-color="#147d58"/>
</linearGradient>
<linearGradient id="gradient-2" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stop-color="#7295c2"/>
<stop offset="95%" stop-color="#252e3d"/>
</linearGradient>
</defs>
</svg>
<svgicon name="vue" width="15rem" height="15rem" color="url(#gradient-1) url(#gradient-2)"></svgicon>
</template>
使用 svg 原来的颜色
<icon name="colorwheel" width="100" height="100" :original="true"></icon>
<!-- 覆盖原来的颜色,_ 表示当前位置的 path/shape 使用原来的颜色,其他使用新的颜色 -->
<icon name="colorwheel" width="100" height="100" :original="true" color="_ black _ black _"></icon>
你可以使用多个路径存放 svg 文件,避免同名冲突。
├── arrow.svg
├── sora
│ ├── arrow.svg
│ └── fit
│ └── arrow.svg
<svgicon name="arrow" width="50" height="50"></svgicon>
<svgicon name="sora/arrow" width="50" height="50"></svgicon>
<svgicon name="sora/fit/arrow" width="50" height="50"></svgicon>
This component doesn't work on IE because IE don't support innerHTML
in SVGElement. You can use innersvg-polyfill to make it work. You can also use the polyfill provided by this component.
// in main.js first line
import 'vue-svgicon/dist/polyfill'
This polyfill is a wrapper of innersvg-polyfill.