svg精灵图使用方法

872 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

svg的使用方法

1.svg可以当成图片路径使用

<img src="./user.svg" alt="">

2.可以直接使用svg标签

<svg width="130" height="130" viewBox="0 0 130 130" xmlns="http://www.w3.org/2000/svg">
     <path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-
     37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 
     31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325
     48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-
     41.271z" stroke="#979797"/>
</svg>
  • width: 宽度

  • heigth: 高度

  • viewBox : 四个值 0 0 130 130

    前两个值: x与y轴的偏移量

    后两个值: 图片的原大小

    注意: 只设width与heigth是不会出现效果的,必须配合viewBox 属性

  • fill:填充颜色

image.png

svg进阶使用(svg精灵图)

svg组件的使用, 参考:

  1. 懒人神器:svg-sprite-loader实现自己的Icon组件
  2. 未来必热:SVG Sprites技术介绍

语法:

1.声明svg(相当于一个容器)

2.用symbol包裹图标路径形状之类代码

symbol是一个一个组装好的元件,这这些一个一个的元件就是我们即将使用的一个一个SVG图标。

3.使用精灵图

image.png

以上方法较为麻烦,vue可以配置svg-sprite-loader实现自己的icon组件

一.核心代码: 把所有的svg图片引入进来

import Vue from 'vue'

// 导入svgIcon组件对象
import SvgIcon from '@/components/SvgIcon'// svg component

// 注册全局组件 <svg-icon></svg-icon>
Vue.component('svg-icon', SvgIcon)

// 将svg中的文件生成svg精灵图
const req = require.context('./svg', false, /.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

补充: require.context 语法:

   require.context(directory,useSubdirectories,regExp)
   directory:表示检索的目录
   useSubdirectories:表示是否检索子文件夹
   regExp:匹配文件的正则表达式,一般是文件名
   例如 require.context("@/views/components",false,/.vue$/)

二.将svg的使用封装成组件

  • 将使用svg这个语法进行封装

image.png

  • 接收传过来的svg文件名

image.png

三.函数式组件: 通过render渲染结构

<script>
// 函数式组件: 通过render渲染结构
// 一个组件必须有结构: template结构渲染 或 render函数结构渲染
export default {
  name: 'MenuItem',
  functional: true, // 声明函数式组件
  props: {
    icon: {
      type: String,
      default: ''
    },
    title: {
      type: String,
      default: ''
    }
  },
  // 渲染当前组件结构
  render(h, context) {
    const { icon, title } = context.props
    const vnodes = []

    // 渲染图标
    if (icon) {
      if (icon.includes('el-icon')) {
        vnodes.push(<i class={[icon, 'sub-el-icon']} />)
      } else {
        vnodes.push(<svg-icon icon-class={icon}/>)
      }
    }

    // 渲染标题
    if (title) {
      vnodes.push(<span slot='title'>{(title)}</span>)
    }
    return vnodes
  }
}
</script>

以上为实现的原理,vue-element-admin都已经封装好了,我们使用时,只需要以下步骤:

一: 侧边栏中,通过路由配置使用

1.将所需要的svg精灵图复制到src/icons文件夹下

image.png

2.配置路由的时候添加meta属性,来显示侧边栏标题与图表

// 组织架构模块
import Layout from '@/layout'

export default {
  path: '/departments',
  component: Layout,
  children: [
    {
      path: '',
      name: 'departments',
      component: () => import('@/views/departments'),
      meta: { title: '组织架构', icon: 'tree' }
    }
  ]
}

注:meta中tiltle为侧边栏标题,icon为svg精灵图==>值为对应svg文件名

二.页面中使用

1.直接使用封装好的组件(这个组件全局注册过)

1)封装好的组件

image.png

2)全局已注册

image.png

2.在需要的地方当做标签直接调用即可

<svg-icon icon-class="bug" />

icon-class是传给子组件的文件名