封装svg组件

如何封装svg图标组件

封装svg图标组件的方法有很多种,如果只是单纯的想使用svg图标,可以将svg导出fonts字体图标使用,但这样做会失去svg原有的样式与尺寸,也可以当成img图片或者背景引入,但这样做非常繁琐。

最近项目中需要用大量的svg图标,这里介绍一种通过vue组件使用svg图标的方式:

首先了解一下svg图标的use元素。

<svg><defs><g id="shape"><rect x="0" y="0" width="50" height="50" /><circle cx="0" cy="0" r="50" /></g></defs><use xlink:href="#shape" x="50" y="50" /><use xlink:href="#shape" x="200" y="50" />
</svg>
复制代码

比如我绘制了一个id为shape的svg元素,当我想复用时,不可能再复制粘贴一遍代码,这时借助use元素,让xlink:href指定为#shape,它会去寻找并克隆对应的svg元素,从而实现复用。

use元素方便的是,只要同处于一个文档中,use都可以引用到,它可以重用单个元素,也可以重用一组<g>或者<symbol>元素,只需要通过id选择器进行标时引用即可。

具体的想要了解use克隆的内容放在了哪里,以及svg更底层的内容,可参考:用CSS给SVG 的内容添加样式

封装vue组件

首先,将UI提供的需要使用的svg文件统一放在一个文件夹内:

├── src├── svg├── user.svg└── course.svg
复制代码

开发vue组件:

// svg-icon.vue
<template><svg :class="svgClass" aria-hidden="true" v-on="$listeners"><use :xlink:href="iconName"></use></svg>
</template><script>
import './icons';export default {name: 'SvgIcon',props: {// svg图标名称name: {default: ''},// 自定义样式className: {type: String,default: ''}},computed: {iconName() {return `#icon-${this.name}`;},svgClass() {return ['svg-icon',this.className ? this.className:'']}}
};
</script><style scoped>
.svg-icon {vertical-align: -0.15em;fill: currentColor;overflow: hidden;
}
</style>
复制代码

我们期望使用svg-icon组件来统一使用所有的svg文件,通过指定name来变更对应的svg文件。

想要使用svg文件的话,还需要将所有svg文件统一加载到内存当中,可以使用import 'svg/user.svg'这种方式一个一个引用,这里借助require.context一次性引入所有svg文件。

// icons.jsconst req = require.context('@svg', false, /\.svg$/);
const requireAll = requireContext => requireContext.keys().map(requireContext);
requireAll(req);
复制代码

这个时候,还不能通过svg-icon组件指定name的方式来引用兑用svg文件。我们还需要将每个svg文件进一步处理,将他们文件内容的icon封装进symbol元素中,达到下面的使用效果:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol class="icon" viewBox="0 0 970 740" id="icon-user">...</symbol>
</svg>
复制代码

这里可以借助webpack插件:svg-sprite-loader

改造项目的webpack配置

由于项目是基于vue-cli3定制的,所以这里只介绍一下如何在vue-cli3中配置svg-sprite-loader

代码如下:

module.exports = {...chainWebpack: config => {...config.module.rule('svg').exclude.add(resolve('src/svg')).end();config.module.rule('svgs-loader').test(/\.svg$/).include.add(resolve('src/svg')).end().use('svg-sprite-loader').loader('svg-sprite-loader').options({symbolId: 'icon-[name]'}).end();}
}
复制代码

这里要注意一下,配置svg-sprite-loader之前,要先替换vue-cli3本身的file-loader规则,该loader会把svg同图片资源一样单独输出出来,这里配置file-loader忽略svg下面所有的svg文件即可。

最后,在vue中就可以通过svg-icon组件来使用对应的svg图标了。

相关文章

  • 未来必热:SVG Sprite技术介绍
  • 用CSS给SVG 的内容添加样式

如文章内容出现错误,敬请谅解,希望可以不吝赐教。

转载请注明出处

转载于:https://juejin.im/post/5cf79b8c518825382565ba19

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 延迟队列,消息延迟推送

应用场景 目前常见的应用软件都有消息的延迟推送的影子&#xff0c;应用也极为广泛&#xff0c;例如&#xff1a; 淘宝七天自动确认收货。在我们签收商品后&#xff0c;物流系统会在七天后延时发送一个消息给支付系统&#xff0c;通知支付系统将款打给商家&#xff0c;这个过程…

windows Navicat Premium连接oracle

需要下载并指定Instant Client 下载地址&#xff1a;在oracle官网搜索Instant Client Downloads选择自己需要的客户端 //说明 //Navicat 版本 9 或以上捆绑了 instant client&#xff0c;但是捆绑的用不了&#xff0c;捆绑的10.2。因此下载高版本替换之 //版本有要求&#xff0…

关于arraylist的扩容机制

ArrayList会自动改变size的长度&#xff1a; 首先&#xff0c;ArrayList定义了一个私有的未被序列化的数组elementData&#xff0c;用来存储ArrayList的对象列表&#xff08;注意只定义未初始&#xff09;&#xff1a;private transient Object[] elementData;   其次&am…

不同级别UI设计师的区别有哪些?

不同等级的UI设计师在工作内容以及基本的薪资待遇方面也是有区别的&#xff0c;很多在UI培训学校学习的小伙伴们并不知道各个等级的UI设计师工作内容有什么差别&#xff0c;那么合肥学码思小编就给大家总结一下这些区别分别表现在哪些方面。 一、初级UI设计师 初级UI设计师的主…

Linux命令行参数前加--,-和不加杠

参数前“-”的表明后面的参数是字符形式。参数前“--”的则表明后面的参数是单词形式。参数前有横的是System V风格。 参数前没有横的是BSD风格。 转载于:https://www.cnblogs.com/YYRise/p/9090476.html

反射笔记-----------------------------

1.反射基本概念&#xff1a; 01.定义&#xff1a; 反射是指在程序运行期间&#xff0c;能够观察和修改类或者类的对象的属性和行为的特性&#xff01; 02.作用&#xff1a; 001.在运行期间获取类的修饰符&#xff0c;包名&#xff0c;类名&#xff0c;实现的接口&#xff0c;继…

kubernetes 集群部署

kubernetes 集群部署 环境JiaoJiao_Centos7-1(152.112) 192.168.152.112JiaoJiao_Centos7-2(152.113) 192.168.152.113JiaoJiao_Centos7-3(152.114) 192.168.152.114已开通 4C8G80G 集群规划 部署方式 环境准备&#xff1a;基于主机名称通信&#xff0c;时间同步&#xff0c;关…

PHP学习笔记--抽象类和抽象方法的应用

抽象类** 什么是抽象方法&#xff1f;** 定义&#xff1a;如果一个类中的方法&#xff0c;没有方法体的方法就是抽象方法(就是一个方法没有使用{}而直接使用分号结束)* * abstract function test(); //抽象方法* * function test(){ //有方法体…

wordpress 显示数学公式 (MathJax-LaTeX)

blog 不放一堆数学公式怎么能显得高大上&#xff0c;所以 MathJax-LaTeX 也是必装的插件之一了。 一、安装 MathJax-LaTex 插件 直接在 wordpress 插件中&#xff0c;搜索并安装 MathJax-LaTeX 二、安装本地 MathJax 服务 不过由默认的 MathJax cdn 服务经常被墙&#xff0c;所…

长春理工大学第十四届程序设计竞赛(重现赛)F.Successione di Fixoracci

链接&#xff1a;https://ac.nowcoder.com/acm/contest/912/F 题意&#xff1a; 动态规划(Dynamic programming&#xff0c;简称dp)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。例如&#xff0c;假设小x一步能爬1层或2层台阶&#xff0c;求小x爬n层台阶…

ConstraintLayout

ConstraintLayout使用笔记 具体使用参考&#xff1a;http://blog.csdn.net/guolin_blog/article/details/53122387 ConstraintLayout 好处还是很明显&#xff0c;确实可以减少嵌套。性能对比参阅&#xff1a;http://www.cnblogs.com/liujingg/p/7161319.html 简单嵌套Constrain…

css权重

权重大小 内嵌权重为1000 <p style"color: yellow;">ALEX</p> id选择器的权重为100&#xff0c;类选择器的权重为10&#xff0c;标签选择器的权重为1. /*1 1 1*/ #box1 .wrap2 p{color: red; }当权重一样的时候&#xff0c;是以后设置的属性为准&#xf…

手机两列布局,正方形

手机两列布局&#xff0c;正方形。 直接贴出调试网站的结果&#xff0c;阅读效果还不错。 转载于:https://www.cnblogs.com/blogzhang/p/11002428.html

python(5)- 基础数据类型

一 int 数字类型 #abs(x)      返回数字的绝对值&#xff0c;如abs(-10) 返回 10 # ceil(x)    返回数字的上入整数&#xff0c;如math.ceil(4.1) 返回 5 # cmp(x, y)    如果 x < y 返回 -1, 如果 x y 返回 0, 如果 x > y 返回 1 # exp(x)…

B s

666 转载于:https://www.cnblogs.com/lovelgx/articles/9099239.html

基于HTK的语音拨号系统

为什么80%的码农都做不了架构师&#xff1f;>>> 基于 HTK 的语音拨号系统 Veket NWPU 2011-6-22 目标&#xff1a; 该系统能够识别连续说出的数字串和若干组姓名。建模是针对子词&#xff08; sub-word,eg.. 音素&#xff09;&#xff0c;具有一定的…

MySQL无法重启问题解决Warning: World-writable config file '/etc/my.cnf' is ignored

为什么80%的码农都做不了架构师&#xff1f;>>> 今天帮朋友维护服务器&#xff0c;在关闭数据库的命令发现mysql关不了&#xff0c;提示Warning: World-writable config file /etc/my.cnf is ignored &#xff0c;大概意思是权限全局可写&#xff0c;任何一个用户都…

用户体验分析: 以 “南通大学教务管理系统微信公众号” 为例

基于实例分析&#xff0c;体会用户体验设计的 7 条准则&#xff0c;分析“南通大学教务管理系统微信公众号” 在用户体验设计方面让你觉得满意的地方&#xff08;不少于2点&#xff09;&#xff1b;&#xff08;20分&#xff09;&#xff0c;请陈述理由。 同样&#xff0c;分析…

JVM学习笔记(一):Java内存区域

由于Java程序是交由JVM执行的&#xff0c;所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前&#xff0c;先来看一下Java程序具体执行的过程&#xff1a; 首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀)&am…

EdgeRouter X设置外网远程访问和HTTPS连接指定出口网关

EdgeRouter X虽然小巧&#xff0c;但功能强大&#xff0c;为方便远程管理&#xff0c;必须对防火墙进行设置&#xff0c;允许从外部进行访问&#xff0c;由于公网的80、443端口都已被运营商关闭&#xff0c;必须设置端口转发才能从外部访问。一、设置外网远程访问通过浏览器进入…