小何hdc 跟着小何学编程 

☉本文由小何整理首发,

版权归本公众号所有,

如有侵犯,请自行删除!

svg雪碧图

安装vite-plugin-svg-icons

pnpm install vite-plugin-svg-icons -D

配置

src\main.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// svg雪碧图
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'


// 
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
  return {
    plugins: [
      vue(),
      // 注册所有的svg文件生成svg雪碧图
      createSvgIconsPlugin({
        iconDirs: [path.resolve(process.cwd(), "src/assets/icons/svg")], //svg图片存放的目录
        symbolId: "icon-[name]", // 指定symbolId格式
        svgoOptions: command === 'build' // SVG压缩配置
      })
    ],
    resolve: {
      alias: {
        "@": path.resolve("./src") // 相对路径别名配置,使用 @ 代替 src
      }
    }
  }
})

引入样式

src\main.js

import 'virtual:svg-icons-register'

封装svg组件

<template>
    <svg :class="svgClass" aria-hidden="true">
        <use :xlink:href="iconName" :fill="color" />
    </svg>
</template>

<script setup>
const props = defineProps({
    /**
     * svg 的文件名
     */
    iconClass: {
        type: String,
        required: true
    },
    // svg的class
    className: {
        type: String,
        default: ''
    },
    // svg的颜色
    color: {
        type: String,
        default: ''
    },
})

/**
 * 构建svg的完整名称
 */
const iconName = computed(() => `#icon-${props.iconClass}`);

/**
 * 默认使用 svg-icon 类样式
 *  如果传入 className 在 svg-icon 类样式 追加类样式
 */
const svgClass = computed(() => {
    if (props.className) {
        return `svg-icon ${props.className}`
    }
    return 'svg-icon'
})
</script>

<style scope lang="scss">
/* 
  1em
    将icon大小设置和字体大小一致

  fill 是SVG元素的一种属性
    fill 定义元素的颜色,
    currentColor是一个变量,
    这个变量的值就表示当前元素的color值,
    如果当前元素未设置color值,
    则从父元素继承

  vertical-align
    因icon大小被设置为和字体大小一致,
    而span等标签的下边缘会和字体的基线对齐,
    故需设置一个往下的偏移比例,
    来纠正视觉上的未对齐效果
 */
.svg-icon {
    width: 1em;
    height: 1em;
    position: relative;
    fill: currentColor;
    vertical-align: -2px;
}
</style>

全局注册

src\main.js

import SvgIcon from '@/components/SvgIcon/index.vue'

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

案例

<template>
   <div class="login">
       <svg-icon icon-class="user"   />
   </div>
</template>

<script setup>
</script>

<style lang="scss" scoped>
.login{
   
   display: flex;
   justify-content: center;
   align-items: center;
   height:100%;
}
</style>
 

Logo

快速构建 Web 应用程序

更多推荐