使用svg-sprite-loader和svgo处理icon
为什么不推荐使用iconfont
- 引入的字体文件如果下载到本地,每次新增或者修改icon,我们都需要重新下载一遍,如果通过外链的方式,每次都要改一遍地址,不方便
- 不同的项目的UI规范是不一样的,每次项目中的icon在我们看来,没什么区别,实际上线条的宽度圆角什么的是有差别的
为什么使用svg
- 支持多色图标了,不再受单色限制。
- 支持像字体那样通过font-size,color来调整样式。
- 支持 ie9+
- 可利用CSS实现动画。
- 减少HTTP请求。
- 矢量,缩放不失真
- 可以很精细的控制SVG图标的每一部分
svg-sprite-loader
将svg文件打包成一个雪碧图,并且在页面加载的时候自动注入到document.body下,每个需要使用的地方通过use复制模板
use:在SVG文档内取得目标节点,并在别的地方复制它们
使用方式
- 下载svg格式的icon(如果同一icon在项目中有多个颜色的显示,下载完成后,将fill属性去掉,不然自己写的颜色的是无效的);
- 统一放置在目录assets/icon下
- 安装依赖: svg-sprite-loader
- 配置webpack
1 | { |
- index.jsx中对icon进行自动导入
1 | // utils/svgIcon.js |
- SvgIcon组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import React from 'react';
import PropTypes from 'prop-types';
import './index.less';
export default class SvgIcon extends React.Component {
static propTypes = {
iconClass: PropTypes.string.isRequired,
className: PropTypes.string,
}
render() {
const { iconClass, className } = this.props;
const svgClass = className ? 'svg-icon ' + className : 'svg-icon';
return (
<svg className={svgClass} aria-hidden="true">
<use xlinkHref={`#icon-${iconClass}`}></use>
</svg>
);
}
} - 引入SvgIcon
1
<SvgIcon iconClass="svg的名称" className=""/>
svg压缩工具——————svgo
我们从UI那里拿到的svg带有很多冗余信息,比方说下面这个:
1 |
|
里面包含了不必要的xml信息、编辑器信息、title、描述信息等,这些信息并不会影响svg的展示
经过压缩之后:
1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 54 45"><g fill="none" fill-rule="evenodd"><path fill="#ECF8F1" d="M3 0h48a3 3 0 013 3v39a3 3 0 01-3 3H0V3a3 3 0 013-3z"/><text fill="#43C177" font-family="PingFangSC-Regular, PingFang SC" font-size="30"><tspan x="12" y="33">换</tspan></text></g></svg> |
压缩脚本:
1 | // 压缩svg,去除冗余信息 |
参考文章: