在vue项目中使用svg,并能根据需要修改svg大小颜色等样式

2019-12-10 11:23:50

参考地址   在vue项目中使用svg,并能根据需要修改svg大小颜色等样式

重点是最后一句话,去掉fill这个属性,我们再设置fill才有效果。

1、介绍


考虑到一部分人还在用vue-cli 2.x,故本教程既包含2.x版本,也包含3.x版本


2、安装依赖


npm install --save-dev svg-sprite-loader

1

3、把svg文件放入项目中


如图所示:


我把svg文件放入到了assets目录下的icons目录里面了


4.1、vue-cli 2.x 配置


在webpack.base.conf.js中配置允许svg依赖


 module: {

    rules: [

      {

        test: /\.svg$/,

        loader: 'svg-sprite-loader',

        include: [resolve('src/assets/icons')],

        options: {

          symbolId: 'icon-[name]'

        }

      },

      {

        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,

        loader: 'url-loader',

        exclude: [resolve('src/assets/icons')],

        options: {

          limit: 10000,

          name: utils.assetsPath('img/[name].[hash:7].[ext]')

        }

      }

    ]

  },

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

4.2、vue-cli 3.x 配置


在根目录新建vue.config.js文件中配置loader


module.exports = {

  chainWebpack: config => {

    // svg rule loader

    const svgRule = config.module.rule('svg') // 找到svg-loader

    svgRule.uses.clear() // 清除已有的loader, 如果不这样做会添加在此loader之后

    svgRule.exclude.add(/node_modules/) // 正则匹配排除node_modules目录

    svgRule // 添加svg新的loader处理

      .test(/\.svg$/)

      .use('svg-sprite-loader')

      .loader('svg-sprite-loader')

      .options({

        symbolId: 'icon-[name]',

      })

    // 修改images loader 添加svg处理

    const imagesRule = config.module.rule('images')

    imagesRule.exclude.add(resolve('src/assets/icons'))

    config.module

      .rule('images')

      .test(/\.(png|jpe?g|gif|svg)(\?.*)?$/)

  }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

5、在src/compoments/下创建SvgIcon.vue


<template>

  <svg :class="svgClass" aria-hidden="true">

    <use :xlink:href="iconName"></use>

  </svg>

</template>


<script>

export default {

  name: 'svg-icon',

  props: {

    iconClass: {

      type: String,

      required: true

    },

    className: {

      type: String

    }

  },

  computed: {

    iconName () {

      return `#icon-${this.iconClass}`

    },

    svgClass () {

      if (this.className) {

        return 'svg-icon ' + this.className

      } else {

        return 'svg-icon'

      }

    }

  }

}

</script>


<style scoped>

.svg-icon {

  width: 1em;

  height: 1em;

  vertical-align: -0.15em;

  fill: currentColor;//此属性为更改svg颜色属性设置

  overflow: hidden;

}

</style>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

6、在assets/icons/下创建index.js


相信大家也看到上面传svg文件到项目那张图的时候,看到了里面有个index.js,这个文件就是包含将组件注册到全局的逻辑


下面的@即为src,是事先在配置中配置过的


import Vue from 'vue'

import SvgIcon from '@/components/SvgIcon'

// 全局注册组件

Vue.component('svg-icon', SvgIcon)

// 定义一个加载目录的函数

const requireAll = requireContext => requireContext.keys().map(requireContext)

const req = require.context('@/assets/icons', false, /\.svg$/)

// 加载目录下的所有 svg 文件

requireAll(req)

1

2

3

4

5

6

7

8

9

7、在main.js中引入执行


import './assets/icons'

1

8、使用svg组件

在需要的组件中直接可以使用,iconClass的值就是svg文件的文件名,className的值就是对于svg图标的样式类名


<template>

  <svg-icon iconClass='qyf_sy_tx' className='icon'></svg-icon>

</template>

...

<style scoped>

.icon {

  width: 100px;

  height: 100px;

  color: red;

}

</style>

1

2

3

4

5

6

7

8

9

10

11

在类名icon中设置需要的样式,包括颜色,svg的样式就会随之改变


注意:有时会出现改变颜色图标颜色不会发生改变的情况,这时打开svg文件,看下图:


删除style标签里的每一项fill样式设置,这样就可以实现颜色自由切换了

————————————————

版权声明:本文为CSDN博主「dearqz」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_42204698/article/details/93751906


  • 2018-12-10 00:57:37

    Android沉浸式状态栏(透明状态栏)最佳实现

    在Android4.4之前,我们的应用没法改变手机的状态栏颜色,当我们打开应用时,会出现上图中左侧的画面,在屏幕的顶部有一条黑色的状态栏,和应用的风格非常不协调;为了提供更好的界面交互,google在Android4.4以后提供了设置沉浸式状态栏的方法,对于沉浸式状态栏这个名字存在争议,我们不做讨论,实际的效果其实就是透明的状态栏,然后在状态栏的位置显示我们自定义的颜色,通常为应用的actionbar的颜色,或者是将应用的整体的一张图片也占据到状态栏中,如下图所示:

  • 2018-12-11 10:20:40

    Android下载图片到相册

    调用以上系统自带的方法会把bitmap对象保存到系统图库中,但是这种方法无法指定保存的路径和名称,上述方法的title、description参数只是插入数据库中的字段,真实的图片名称系统会自动分配。 或者

  • 2018-12-11 15:45:00

    Laravel中七个非常有用但很少人知道的Carbon方法

    在编写PHP应用时经常需要处理日期和时间,Carbon继承自 PHP DateTime 类的 API 扩展,它使得处理日期和时间更加简单,这篇文章主要给大家分享了Laravel中七个非常有用但很少人知道的Carbon方法,需要的朋友可以参考下。

  • 2018-12-13 11:41:23

    Android drawable微技巧,你所不知道的drawable的那些细节

    好像有挺久时间没更新博客了,最近我为了准备下一个系列的博客,也是花了很长的时间研读源码。很遗憾的是,下一个系列的博客我可能还要再过一段时间才能写出来,那么为了不至于让大家等太久,今天就给大家更新一篇单篇的文章,讲一讲Android drawable方面的微技巧。

  • 2018-12-13 17:14:41

    Android安全开发之浅谈密钥硬编码

    在阿里聚安全的漏洞扫描器中和人工APP安全审计中,经常发现有开发者将密钥硬编码在Java代码、文件中,这样做会引起很大风险。信息安全的基础在于密码学,而常用的密码学算法都是公开的,加密内容的保密依靠的是密钥的保密,密钥如果泄露,对于对称密码算法,根据用到的密钥算法和加密后的密文,很容易得到加密前的明文;对于非对称密码算法或者签名算法,根据密钥和要加密的明文,很容易获得计算出签名值,从而伪造签名。

  • 2018-12-13 17:17:02

    轻松实现动态获取Android手机CPU架构类型

    .so文件是unix的动态连接库,是二进制文件,作用相当于windows下的.dll文件。 他使用了C/C++代码编写的可以操作硬件比java更高级的 底层代码,执行速度和效率比其他语言要高。 在Android中调用动态库文件(*.so)都是通过jni的方式。