Vue项目中实现SVG悬浮变色的完整指南

更新日期: 1970-01-01 阅读: 10 标签: svg

在Vue项目中实现「鼠标悬浮时SVG显示不同颜色」的效果,有两种核心应用场景(对应不同实现方案)。本文把所有场景的完整实现方式、代码示例和核心技巧都讲清楚,你可以按需选用。


一、核心前提说明

SVG的颜色控制依赖两个核心CSS属性:

  • fill:控制SVG图形的填充颜色(SVG内部色块的颜色),最常用

  • stroke:控制SVG图形的描边颜色(SVG的边框线条颜色)

绝大多数需求只需要修改fill属性即可,两个属性可以单独或同时修改。


二、方案一:Vue中直接内联SVG代码(推荐、最优、最简单)

适用场景

把SVG的源码直接写在Vue的template模板中(最常用的场景,比如自定义图标、小的矢量图形)。

核心优势

  • 内联SVG的所有内部标签都属于当前Vue组件的DOM节点,CSS可以直接精准控制

  • 实现成本最低,零依赖,无兼容性问题,性能最好

  • 支持精准控制SVG的任意部分单独变色

写法1:行内样式 + :hover伪类(最简,推荐)

直接给SVG标签加class,通过CSS的:hover伪类控制鼠标悬浮时的fill/stroke:

<template>
  <div class="svg-box">
    <svg class="my-svg-icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
      <path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"/>
      <path d="M689.9 434.9c-9.4-9.4-24.6-9.4-33.9 0L512 578.1 368 434.9c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l173 173c9.4 9.4 24.6 9.4 33.9 0l173-173c9.4-9.4 9.4-24.6 0-33.9z"/>
    </svg>
  </div>
</template>

<style scoped>
.my-svg-icon {
  width: 40px;
  height: 40px;
  fill: #666;
  stroke: #999;
  cursor: pointer;
  transition: fill 0.2s ease, stroke 0.2s ease;
}

.my-svg-icon:hover {
  fill: #1677ff;
  stroke: #0958d9;
}
</style>

写法2:SVG内部元素单独控制(进阶,精准控制局部变色)

如果你的SVG是多元素组合,需要鼠标划过时某一部分不变色、某一部分单独变色,可以直接给SVG内部的path/g等标签加class:

<template>
  <div class="svg-box">
    <svg class="my-svg-icon" viewBox="0 0 1024 1024">
      <circle class="svg-bg" cx="512" cy="512" r="448" />
      <path class="svg-arrow" d="M689.9 434.9c-9.4-9.4-24.6-9.4-33.9 0L512 578.1 368 434.9c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l173 173c9.4 9.4 24.6 9.4 33.9 0l173-173c9.4-9.4 9.4-24.6 0-33.9z"/>
    </svg>
  </div>
</template>

<style scoped>
.my-svg-icon {
  width: 40px;
  height: 40px;
  cursor: pointer;
}

.svg-bg { fill: #f5f5f5; stroke: #e5e5e5; }
.svg-arrow { fill: #666; }

.my-svg-icon:hover .svg-bg { fill: #e6f0ff; }
.my-svg-icon:hover .svg-arrow { fill: #1677ff; }
</style>


三、超级实用技巧:fill: currentColor 继承父元素颜色

这是Vue中开发SVG图标最常用的高级技巧,强烈推荐掌握!

核心原理

给SVG设置fill: currentColor,那么SVG的填充色会自动继承父元素的color属性值。

优势

  • 只需要修改父元素的color,就能同步修改SVG颜色,无需单独写SVG的fill

  • 结合:hover时,只需要改父元素的color即可实现SVG变色,代码更简洁

  • 可以和Vue的动态样式完美结合,实现动态变色

完整示例

<template>
  <div class="svg-icon-wrapper">
    <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
      <path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"/>
      <path d="M689.9 434.9c-9.4-9.4-24.6-9.4-33.9 0L512 578.1 368 434.9c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l173 173c9.4 9.4 24.6 9.4 33.9 0l173-173c9.4-9.4 9.4-24.6 0-33.9z"/>
    </svg>
  </div>
</template>

<style scoped>
.svg-icon-wrapper {
  color: #666;
  cursor: pointer;
  transition: color 0.2s ease;
}

.svg-icon-wrapper:hover {
  color: #1677ff;
}

.svg-icon-wrapper svg {
  width: 40px;
  height: 40px;
  fill: currentColor;
}
</style>


四、方案二:Vue中引入外部SVG文件

适用场景

SVG是独立文件(比如UI给的.svg文件),通过<img>标签或import方式引入Vue组件。

重要坑点

通过<img src="xxx.svg">引入的SVG,会被浏览器解析为独立的图片资源,而非当前DOM的一部分,当前页面的CSS无法穿透到图片内部修改SVG的fill/stroke属性。

方案2.1:把外部SVG文件转为内联SVG(最推荐)

这是最优解,操作极其简单:

  1. 用编辑器打开你的.svg文件

  2. 复制文件里的全部源码(从<svg>开始到</svg>结束)

  3. 把复制的源码直接粘贴到Vue的template中,变成内联SVG

  4. 直接使用方案一的CSS hover变色方法

优点:零成本、零依赖、效果完美,解决所有外部SVG的变色需求。

方案2.2:使用CSS的filter滤镜实现变色

如果不想把SVG转内联,也可以用CSS的filter滤镜,通过颜色滤镜让SVG整体变色。

<template>
  <div class="svg-container">
    <img class="svg-img" src="@/assets/icon.svg" alt="svg图标" />
  </div>
</template>

<style scoped>
.svg-img {
  width: 40px;
  height: 40px;
  cursor: pointer;
  transition: filter 0.2s ease;
}

.svg-img:hover {
  filter: invert(32%) sepia(89%) saturate(1300%) hue-rotate(200deg) brightness(95%) contrast(100%);
}
</style>

常用filter颜色值(复制即用):

  • 红色:filter: invert(27%) sepia(79%) saturate(2476%) hue-rotate(346deg) brightness(90%) contrast(100%);

  • 绿色:filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);

  • 橙色:filter: invert(54%) sepia(98%) saturate(1195%) hue-rotate(350deg) brightness(97%) contrast(102%);

方案2.3:使用vue-svg-loader插件

适合大量外部SVG文件的项目,它能把SVG文件解析为Vue组件。

步骤1:安装依赖

npm install vue-svg-loader svg-sprite-loader -D

步骤2:配置vue.config.js

module.exports = {
  chainWebpack: config => {
    const svgRule = config.module.rule('svg')
    svgRule.uses.clear()
    svgRule
      .test(/\.svg$/)
      .use('vue-svg-loader')
      .loader('vue-svg-loader')
      .options({
        svgo: false
      })
  }
}

步骤3:在Vue组件中使用

<template>
  <div class="svg-box">
    <MyIcon class="my-svg" />
  </div>
</template>

<script setup>
import MyIcon from '@/assets/icon.svg'
</script>

<style scoped>
.my-svg {
  width: 40px;
  height: 40px;
  fill: #666;
  cursor: pointer;
  transition: fill 0.2s ease;
}

.my-svg:hover {
  fill: #1677ff;
}
</style>


五、Vue3组合式API实现动态绑定

如果需要通过JS逻辑控制SVG变色(比如根据条件显示不同颜色),可以用鼠标事件加动态样式绑定:

<template>
  <div class="svg-box">
    <svg 
      class="my-svg" 
      viewBox="0 0 1024 1024"
      @mouseenter="isHover = true"
      @mouseleave="isHover = false"
      :style="{ fill: isHover ? hoverColor : defaultColor }"
    >
      <path d="M512 64C264.6 64 64 264.6 64 512s200.6 448 448 448 448-200.6 448-448S759.4 64 512 64zm0 820c-205.4 0-372-166.6-372-372s166.6-372 372-372 372 166.6 372 372-166.6 372-372 372z"/>
      <path d="M689.9 434.9c-9.4-9.4-24.6-9.4-33.9 0L512 578.1 368 434.9c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l173 173c9.4 9.4 24.6 9.4 33.9 0l173-173c9.4-9.4 9.4-24.6 0-33.9z"/>
    </svg>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const isHover = ref(false)
const defaultColor = ref('#666')
const hoverColor = ref('#1677ff')
</script>

<style scoped>
.my-svg {
  width: 40px;
  height: 40px;
  cursor: pointer;
  transition: fill 0.2s ease;
}
</style>


总结

场景推荐方案
90%的场景内联SVG + CSS :hover + fill/stroke
外部SVG文件优先转为内联SVG
大量外部SVG文件vue-svg-loader插件
快速临时变色CSS filter滤镜
需要JS逻辑控制颜色Vue鼠标事件 + 动态style绑定

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13555

相关推荐

通过css改变svg img的颜色

一般的解决办法有:1.字体图标改变css的color属性;2.js在hover事件中切换图片;3.老一点的方案是hover切换背景?但是为了更小的开销,一般css为更好的解决方案

封装全局icon组件 svg (仿造element-ui源码)

引入 svg-sprite-loader 插件,vue-cli项目默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。使用 webpack 的 exclude和 include

如何在vue项目中优雅地使用SVG

安装svg-sprite-loader。通过vue-cli脚手架创建的项目默认情况下会使用 url-loader 对svg进行处理,在static下新建svg文件夹,用来放置当做icon使用的svg,使用include,include和img做区分。然后修改webpack.base.conf.js配置,这样svg-sprite-loader只会处理我们指定的static/svg下的文件

使用vue组件加载SVG图片步骤

使用vue加载SVG图片,有两种方法,一种是雪花loader,一种是vue-svg-loader(官网推荐)。在自己的项目中,本次使用vue-svg-loader加载svg图片,并且对图片进行属性修改。操作步骤:

10个开源SVG图标库

在国内,我想大家基本上都是用阿里的iconfont图标库,这里介绍10个其他的开源图标库,下面列出的所有库都是完全开源的,因为我已经检查了许可条款和条件。

使用SVG symbols建立图标系统完整指南

从最开始的使用img图片,到后来的使用css sprite来减少服务器请求,再到流行的图形字体化图标Iconfont。现在,一种全新的图标使用方式开始流行了起来——SVG symbols图标。

如何使用SVG及其动画技术为你的 Web 前端开发带来一些新鲜的体验

设备间不同的屏幕尺寸、分辨率和比例使得产品难以提供一致的体验,对于那些对产品有着像素级完美追求的人这种体验差异尤其显著! SVG(可缩放的矢量图形)完美地解决了上文中提到的部分问题。

SVG弧形进度环实现

先要了解svg能怎么实现的这个问题,svg的哪些元素能实现?A命令可以画椭圆和圆形,rx ry分别表示两个轴的半径,x-axis-rotatio表示x轴的旋转情况,我这里的圆弧是正置的,所以值设为0即可。

svg的path的应用

我们这里只要用到M L A 和Z命令就可以了,M L 和Z命令比较简单,这里详细讲解A命令,A命令是画弧的命令,里面的A命令有 7个参数:rx ry x-axis-rotation large-arc-flag sweep-flag x y

SVG基础图形和D3.js

学习如何使用D3.js来创建这些图形?这里会包括前面例子中的SVG基础图形以及如何使用D3.js设置图形的属性。使用D3.js画一个SVG 的 圆 circle,可以使用如下代码创建:

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!