Jinuss's blog Jinuss's blog
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

东流

前端可视化
首页
  • 前端文章

    • JavaScript
  • 学习笔记

    • 《JavaScript高级程序设计》
    • 《Vue》
    • 《React》
    • 《Git》
    • JS设计模式总结
  • HTML
  • CSS
  • 技术文档
  • GitHub技巧
  • 学习
  • 实用技巧
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • HTML

  • CSS

    • CSS教程和技巧收藏
    • flex布局语法
    • flex布局案例-基础
    • flex布局案例-骰子
    • flex布局案例-圣杯布局
    • flex布局案例-网格布局
    • flex布局案例-输入框布局
    • CSS3之transition过渡
    • CSS3之animation动画
    • CSS自定义设置滚动条样式
    • 「布局技巧」图片未加载前自动撑开元素高度
    • 文字在一行或多行时超出显示省略号
    • 从box-sizing属性入手,了解盒子模型
    • 水平垂直居中的几种方式-案例
    • 如何根据系统主题自动响应CSS深色模式
    • CSS-function汇总
    • 网格布局中的动画
    • CSS属性background-position-y实现动画
    • CSS实现github右上角图标
    • CSS3实现购物车动画效果
    • css-functions-属性函数
    • css-functions-图形函数
    • CSS3换装达人原理
    • iconfont图标字体库介绍
    • css关键字currentColor
    • css伪类选择器系列一
    • css伪类选择器系列二
    • 动态修改iconfont图标配色
      • 引言
      • 解决方法
        • 修改symbol
        • 创建新symbol
    • 使用CSS3实现loading效果
    • CSS滚动驱动动画
    • CSS实现图片3D立体效果
    • iconfont中svg图片颜色动态修改第二弹
  • 浏览器

  • 页面
  • CSS
东流
2024-10-08
目录

动态修改iconfont图标配色

# 引言

在 iconfont 图标字体库详细介绍 (opens new window)一文中介绍了iconfont图标字体库的三种使用方法,分别是 1.unicode 引用 2.font-class 引用 3.symbol 引用。其中只有symbol引用的方式才能保留图标的色彩。但是如果我们想改变图标的颜色,那么该如何做呢?

# 解决方法

以React为例,在项目中,封装一个Icon组件,方便在其它需要用到iconfont图标时,传入name即可,Icon组件封装如下

export const Icon = ({ name, ...reset }) => (
  <svg className="icon" {...reset}>
    <use xlinkHref={`#icon-${name}`} />
  </svg>
);
1
2
3
4
5

正确显示iconfont的前提是引入了iconfont.js,该文件会动态插入一段svg代码,而图标的定义(如path)就是在其中定义的。

# 修改symbol

分析symbol的path可知,它的属性fillColor的值是固定的某一个颜色,如果动态修改这个值,那么所有引用该symbol的地方,就都是统一的颜色,显然这种做法不可取。

# 创建新symbol

但是我们可以通过name去找到对应的symbol,再次创建一个symbol,并给它赋新的颜色,代码如下:

export const Icon = ({ name, ...reset }) => {
  const { style } = reset;
  if (!style?.color) {
    return (
      <svg className="icon" {...reset}>
        <use xlinkHref={`#icon-${name}`} />
      </svg>
    );
  }

  var oSvg = document.querySelector(`symbol#icon-${name}`);
  let paths = "";
  if (oSvg) {
    var pathRegex = /<path[^>]*>[^<]*<\/path>/gi;
    var pathMatches = oSvg.outerHTML.match(pathRegex);
    if (pathMatches && pathMatches.length) {
      paths = pathMatches
        .map((path) => {
          return path.replace(/fill="[^"]*"/, 'fill="currentColor"');
        })
        .join("");
    }

    return (
      <svg className="icon" viewBox="0 0 1024 1024" {...reset}>
        <g dangerouslySetInnerHTML={{ __html: paths }} />
      </svg>
    );
  }
};
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

引用Icon组件,如下:

<Icon name="bianji" style={{ color: "#a7aebd" }} />
1

缺点

上面创建一个新symbol的方法只是解决了图标纯色动态修改的问题,即图标只有一个颜色,如果图标有多个颜色,那么这种解决方法就捉襟见肘。如果有这种需求,可以设计新的图标更为稳妥,不让,需要在iconfont定义多个color参数,显然代价更高,性价比很低。

编辑 (opens new window)
上次更新: 2024/10/08, 07:37:51
css伪类选择器系列二
使用CSS3实现loading效果

← css伪类选择器系列二 使用CSS3实现loading效果→

最近更新
01
GeoJSON
05-08
02
Circle
04-15
03
CircleMarker
04-15
更多文章>
Theme by Vdoing | Copyright © 2024-2025 东流 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式