SVG图片通过img引入修改颜色

通过 <img> 标签引入的 SVG 图片默认无法直接通过 CSS 修改颜色,但可通过以下方法实现颜色修改:


1. 使用 CSS filterdrop-shadow 技巧

原理 ‌:通过滤镜生成彩色投影,偏移后覆盖原图,隐藏原图并显示投影。

实现步骤‌:

  1. <img> 放入父容器并设置 overflow: hidden
  2. <img> 应用 filter: drop-shadow 生成彩色投影
  3. 使用 transform 偏移原图,使投影覆盖原位置
css 复制代码
htmlCopy Code
<div class="svg-container">
  <img src="icon.svg" class="svg-icon">
</div>
css 复制代码
cssCopy Code
.svg-container {
  width: 50px;
  height: 50px;
  overflow: hidden;
}
.svg-icon {
  filter: drop-shadow(#ff0000 50px 0); /* 红色投影 */
  transform: translateX(-50px); /* 偏移原图 */
}

适用场景‌:单色修改,需固定尺寸容器。


2. 使用 mask-image 方案

原理 ‌:将 SVG 作为遮罩,通过 background-color 控制颜色。

实现步骤‌:

  1. mask-image 引入 SVG
  2. 通过 background-color 设置颜色
css 复制代码
htmlCopy Code
<div class="svg-mask"></div>
css 复制代码
cssCopy Code
.svg-mask {
  width: 50px;
  height: 50px;
  background-color: #00ff00; /* 绿色 */
  -webkit-mask-image: url(icon.svg);
  mask-image: url(icon.svg);
}

优点‌:无需偏移,支持动态颜色。


3. 使用 JavaScript 动态注入 SVG

原理 ‌:通过脚本将 SVG 内联到 DOM,直接修改属性。

实现步骤 ‌(以 svg-inject 库为例):

  1. 安装库:npm install @iconfu/svg-inject
  2. <img> 标签添加 onload 事件:
ini 复制代码
htmlCopy Code
<img src="icon.svg" onload="SVGInject(this)" class="svg-injected">
css 复制代码
cssCopy Code
.svg-injected path {
  fill: blue; /* 直接修改填充色 */
}

优点‌:支持多色修改,保留矢量特性。


4. 转换为 Base64 内联

原理 ‌:将 SVG 转为 Base64 编码,直接修改代码中的颜色值。

实现步骤‌:

  1. 使用工具将 SVG 转为 Base64
  2. 替换 fillstroke 属性值
css 复制代码
htmlCopy Code
<img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL..." alt="SVG">

缺点‌:需手动修改代码,灵活性低。


注意事项

  • 浏览器兼容性 ‌:mask-image 需前缀,drop-shadow 在旧版浏览器可能失效14。
  • 性能影响‌:复杂滤镜可能增加渲染负担6。

根据项目需求选择合适方案,优先推荐 mask-image 或 JavaScript 注入

相关推荐
前端一小卒5 分钟前
我用 TypeScript 从零手写了一个 Claude Code,然后发现它的核心只有 30 行
前端·agent
大圣编程2 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
yuhaiqiang2 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
之歆2 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜3 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端
负责的蛋挞4 小时前
异步HttpModule的实现方式
java·服务器·前端
丹宇码农7 小时前
把 HLS 字幕玩出花:zwPlayer 如何让 M3U8 视频支持全文搜索、翻译与码率自适应
前端·javascript·音视频·hls·视频播放器
2501_943782357 小时前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq7 小时前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net