SVG图标,SVG symbols,SVG use标签

SVG图标,SVG symbols

项目中图标的使用,趋势是使用svg作图标的,优点如下

  1. 兼容现有图片能力前提还支持矢量

  2. 可读性好,有利于SEO与无障碍

  3. 在性能和维护性方面也比iconfont要强很多

怎么在项目中优雅的使用svg图标,下面我们将采用类似雪碧图的做法


1、普通的使用

普通的使用遇到以下的问题:

  • 下载的 svg 可能有自带的 fill 属性,添加 color 样式不生效。
  • 封装 Icon 组件时,每用到一个 svg 图标都需要引入一下,比较繁琐。
import apple from "../assets/icons/apple.svg"  // 得到一个计算之后的路径const Icon = (props) => {return (<img src={apple} />);
};export default Icon;

2、全局配置(svg-sprite-loader)

svg-sprite-loader官网
官方解释是:一个用于创建 svg 雪碧图的 Webpack 加载器。通俗的讲:svg-sprite-loader 会把你引入的 svg 塞到一个个 symbol 中,合成一个大的 svg,最后将这个大的 svg 放入 body 中。

symbol 的 id 如果不特别指定,就是你的文件名。在页面上形成这样的元素,然后我们使用use标签使用类名的形式引入。

  1. 打开webpack配置

    先看自己项目目录有没有config这个文件,如果没有就需要调出这个文件,运行这个命令: yarn eject
    注意:如果项目没有提交要先提交再运行这个命令,运行完就出现config文件,打开可以看到有一个webpack.config.js文件,反正就是暴露webpack的配置文件,方便我们去配置对应的loader

  2. 安装并配置

    yarn add --dev svg-sprite-loader yarn add --dev svgo-loader

    安装这两个依赖,然后将下面代码放进config>webpack.config.js文件里面的module>rules>oneOf里面

    {test: /\.svg$/,use: [{ loader: 'svg-sprite-loader', options: {} },{ loader: 'svgo-loader', options: {} },]
    }
    

3、 使用svg组件化Icon

完成上述配置之后,我们就可以通过指定 id 的方式使用 use 的方式使用 svg 了。但是不能使用import方式引入

不适用import的原因:import 的方式引入了 svg ,在页面上是找不到 icon 的。这是因为 import 引入的 apple 实际上是一个对象,通过 svg use 指定的 #id 的方式最终被 webpack 理解为 apple 对象没被用到,所以就 Tree Shaking 掉它,因此我们需要用 require 的方式引入(原因:CommonJS 模块的这种动态加载的性质意味着无法应用 Tree Shaking,因为在实际运行代码之前无法确定需要哪些模块)。

// 下面这种方式有坑,最终会被 Tree Shaking
// import apple from "../assets/icons/apple.svg"  // 得到一个计算之后的路径
require('../assets/icons/apple.svg')const Icon = (props) => {return (<svg fill="red"><use xlink:href="#apple"/></svg>);
};export default Icon;

而且经过 svg-sprite-loader 加载之后,不仅可以通过指定 id 的方式引入 icon,而且相比图片引入的方式,最大的优点就在于可以通过给 svg 标签添加 fill 属性来调整 icon 的颜色。

4、批量引入所有的 svg静态文件

项目中我们用到 svg 的地方,都需要手动引入一下然后使用,当 svg 多起来的时候,一遍遍的引入就显得不太聪明。能不能像 Element UI 那样,直接指定一个 name 就能使用特定的 svg ?那就需要在 Icon 组件中将所有的 svg 做批量的引入:

// require('../assets/icons/apple.svg')
// require('../assets/icons/banana.svg')
// require('../assets/icons/orange.svg') // 这样就仿佛一个不太聪明的机器人//直接引入 src/assets/icons 目录下的所有 svg
const importAll = (requireContext: __WebpackModuleApi.RequireContext) => {requireContext.keys().forEach(requireContext);
}
try {importAll(require.context('../assets/icons', true, /\.svg$/));
} catch (error) {console.log(error);
}const Icon = (props) => {return (<svg><use xlinkHref={'#' + props.name}></use></svg>);
};export default Icon;

ps:直接从网上拷贝上述代码会报错,需要 yarn add @types/webpack-env -D 一下。

5、svgo-loaderg改变 Icon组件的颜色

svg-sprite-loader可以帮助我们通过 svg use + 指定 id 的方式引入 svg,虽然可以通过给 svg 添加内联 fill 属性的方式修改 icon 的颜色,但是并不建议这样做,而是通过 class 样式的方式指定 icon 的颜色,这就需要用到 svgo-loader 先把 svg 自带的 fill 属性给清除掉,为我们后续指定 icon 的颜色扫清障碍。

    [svgo-loader](https://github.com/svg/svgo "svgo-loader") 是基于 SVG Optimizer 的一个加载器,而 SVG Optimizer 是一个基于node.js 的工具,用于优化 SVG 矢量图形文件,它可以删除和修改SVG元素,折叠内容,移动属性等。
// 配置 webpack.config.js
// 配置之前需要安装该 loader
// npm install --dev svgo-loader
// yarn add --dev svgo-loader{ loader: 'svg-sprite-loader', options: {} },
{ loader: 'svgo-loader', options: {plugins: [{name: 'removeAttrs', // 必须指定name!params: {attrs: 'fill'}}]}
}

通过上述配置,引入项目中的 svg 文件会先经过 svgo-loader 清楚 fill 属性,然后再通过 svg-sprite-loader 将你引入的 svg 塞到一个个 symbol 中,合成一个大的 svg,最后将这个大的 svg 放入 body 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/12997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

minus(Oracle)集合减运算符

mysql不支持minus运算符 minus集合减运算符&#xff0c;即两个集合进行相减 举例&#xff1a;显示表格中第3-5行的内容 Oracle: select * from class01 where rownum<5 minus (select *from class01where rownum<2); 但是mysql可以使用join来模拟minus mysql使用jo…

We are the Lights 2023牛客暑期多校训练营4-L

登录—专业IT笔试面试备考平台_牛客网 题目大意&#xff1a;有n*m盏灯&#xff0c;q次操作&#xff0c;每次可以将一整行或一整列的等打开或关闭 1<n,m<1e6;1<q<1e6 思路&#xff1a;对于同一行或者同一列来说&#xff0c;只要最后一次操作时开或者关&#xff0…

PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案

PHP使用Redis实战实录系列 PHP使用Redis实战实录1&#xff1a;宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案PHP使用Redis实战实录2&#xff1a;Redis扩展方法和PHP连接Redis的多种方案 Redis扩展方法和PHP连接Redis的多种方案 一、Redis扩展方法二、php操作Redis语…

算法练习(2):牛客在线编程03 二叉树

package jz.bm;import jz.TreeNode;import java.util.*;public class bm3 {/*** BM23 二叉树的前序遍历*/public int[] preorderTraversal (TreeNode root) {ArrayList<Integer> list new ArrayList<>();preOrder(root, list);int[] res new int[list.size()];fo…

C++设计模式::代理模式(combination)-可运行

实现: 1) cImage:抽象类; cImageReal:派生类, 不可直接实例化; cImageProxy:派生代理类, 可直接实例化用来代理cImageReal; NOTICE:派生代理类用来简化对特定派生类的使用. 使用: 实例化代理类, 然后使用. 1) 设计框架 /*image.hpp*/ #pragma once #…

java8 listmap聚合后内容顺序不变

学习了groupingBy的用法&#xff0c;在处理List<Map>的数据&#xff0c;顺序会发生变化&#xff1a; 直接聚合 public static void main(String[] args){String data "[{\"codeType\":\"ALRAM\",\"code\":\"1\",\"n…

MySQL笔记——表的分组查询、表的分页查询、表的约束、数据库设计

系列文章目录 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库&#xff0c;对MySQL数据库的简单操作&#xff0c;MySQL的外接应用程序使用说明 MySQL笔记——表的修改查询相关的命令操作 MySQL案例——多表查询以及嵌套查询​​​​​​ MySQL笔记——数据库当…

【Kafka】消息队列Kafka进阶

目录 Kafka分区机制生产者分区写入策略轮询策略随机策略&#xff08;不用&#xff09;按key分配策略乱序问题自定义分区策略 消费者组Rebalance机制消费者分区分配策略Range范围分配策略RoundRobin轮询策略Stricky粘性分配策略 Kafka副本机制producer的ACKs参数acks配置为0acks…

three.js入门二:相机的zoom参数

环境&#xff1a; threejs&#xff1a;129 &#xff08;在浏览器的控制台下输入&#xff1a; window.__THREE__即可查看版本&#xff09;vscodewindowedge 透视相机或正交相机都有一个zoom参数&#xff0c;它可以用来将相机排到的内容在canvas上缩放显示。 要点&#xff1a;…

Mysql- 存储引擎

目录 1.Mysql体系结构 2.存储引擎简介 3.存储引擎特点 InnoDB MyISAM Memory 4.存储引擎选择 1.Mysql体系结构 MySQL整体的逻辑结构可以分为4层&#xff1a; 连接层&#xff1a;进行相关的连接处理、权限控制、安全处理等操作 服务层&#xff1a;服务层负责与客户层进行…

C++设计模式笔记

设计模式 如何解决复杂性&#xff1f; 分解 核心思想&#xff1a;分而治之&#xff0c;将大问题分解为多个小问题&#xff0c;将复杂问题分解为多个简单的问题。 抽象 核心思想&#xff1a;从高层次角度讲&#xff0c;人们处理复杂性有一个通用的技术&#xff0c;及抽象。…

博客迁移说明

后续博客的迁移说明 终于&#xff0c;我还是选择了迁移博客&#xff0c;本来只想改在简介的&#xff0c;但是被官方拒了&#xff0c;遂水此篇 C某N的限制太多&#xff0c;属实被恶心到了&#xff0c;不愿继续发博客在这上面学了使用Github Page搭建自己的博客&#xff0c;后续…

redis总结

1.redis redis高性能的key-value数据库&#xff0c;支持持久化&#xff0c;不仅仅支持简单的key-value&#xff0c;还提供了list&#xff0c;set&#xff0c;zset&#xff0c;hash等数据结构的存储&#xff0c;支持数据的备份&#xff08;master-slave模式&#xff09; redis&…

ShardingSphere-Proxy水平分片详解与实战

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

【Sql】Sql Server 2008 数据库附加,错误:9004

【问题描述】 数据库文件存在异常状况&#xff0c;有可能是因为硬盘有坏区引起的。 附加数据库的时候&#xff0c;提示错误9004。 【解决方法】 假设数据库名称为&#xff1a;UFDATA_001_2023 请按顺序执行以下步骤&#xff1a; 1、将数据库的文件名&#xff1a;UFDATA_001_2…

Python爬虫时遇到SSL证书验证错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到SSL证书验证错误是常见的问题之一。SSL证书验证是为了确保与服务器建立的连接是安全和可信的&#xff0c;但有时候可能会由于证书过期、不匹配或未受信任等原因导致验证失败。为了解决这个问题&#xff0c;本文将提供一些实用的解决办法…

【电路效应】信号处理和通信系统模型中的模拟电路效应研究(SimulinkMatlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、Simulink仿真实现 &#x1f4a5;1 概述 在信号处理和通信系统模型中&#xff0c;模拟电路效应研究是指考虑到实际电路的特性对信号进行建模和分析的过程。模拟电路效应…

ffplay播放器剖析(6)----音视频同步分析

文章目录 1. 音视频同步基础1.1 音视频同步策略1.2 音视频同步概念1.3 FFmpeg中的时间单位1.4 不同结构体的time_base/duration分析1.5 不同结构体的pts/dts分析1.6 ffplay中Frame结构体分析1.7 Vidoe Frame PTS获取及矫正1.8 Audio Frame PTS的获取 2.以音频为基准3.以视频为基…

excel绘制折线图或者散点图

一、背景 假如现在通过代码处理了一批数据&#xff0c;想看数据的波动情况&#xff0c;是不是还需要写个pyhon代码&#xff0c;读取文件&#xff0c;绘制曲线&#xff0c;看起来也简单&#xff0c;但是还有更简单的方法&#xff0c;就是直接生成csv文件&#xff0c;csv文件就是…

Python 列表详解:从基础到进阶

Python是一种广泛使用的高级编程语言&#xff0c;它的设计强调代码的可读性和简洁的语法。Python支持多种编程范式&#xff0c;包括过程、面向对象和函数式编程。在Python中&#xff0c;列表是一种非常重要的数据类型&#xff0c;它可以包含各种类型的元素&#xff0c;如数字、…