SVG图标,SVG symbols,SVG use标签

这篇具有很好参考价值的文章主要介绍了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 中。文章来源地址https://www.toymoban.com/news/detail-618004.html

到了这里,关于SVG图标,SVG symbols,SVG use标签的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • css 实现svg动态图标效果

    效果演示:  实现思路:主要是通过css的stroke相关属性来设置实现的。

    2024年02月12日
    浏览(36)
  • WPF使用SharpVectors显示SVG图标

    W3C SVG Working Group SVG它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。 矢量图形,不受像素影响——SVG的这个特性使得它在不同的平台或者媒体下表现良好,无论屏幕分辨率如何,适合WPF使用。 iconfont-阿里巴巴矢量图标库提供了大量的SVG图标。 但是WPF本身不支持

    2024年02月13日
    浏览(45)
  • Vue3中使用svg图标

    因为项目很多模块需要使用图标,因此把它封装为全局组件!!! 在src/components目录下创建一个SvgIcon组件:代表如下 在src文件夹目录下创建一个index.ts文件:用于注册components文件夹内部全部全局组件!!! 在入口文件引入src/index.ts文件,通过app.use方法安装自定义插件

    2024年02月05日
    浏览(41)
  • 在小程序中如何使用svg图标

    1.首先找到一个能够下载svg图标的网站,例如iconfont或iconpark。  2.选择好点击批量下载,下载一个压缩包。将下载后的压缩包解压之后就是我们选择下载的svg文件。如下图  3. 打开将svg文件转成base64的网站 ,因为在小程序中不能直接使用svg文件,得将其转成base64格式得数据作

    2024年02月12日
    浏览(61)
  • windows系统本地批量预览svg图标

            目前前端使用图标大致分为两类: iconfont方式:通过引入在线或者下载到本地的iconfont.css类文件实现显示图标 第二类是封装图标组件,通过传入指定的svg名称快速生成图标         目前第二种是比较方便的,不需要频繁替换类文件,只需要下载svg到指定文件夹即可

    2023年04月21日
    浏览(43)
  • 微信小程序 使用 echarts symbol属性不能使用自定义图标

      当我想去给 symbol  属性自定义图标时,控制台就报错 Image  is not defined !!! 原因是因为微信小程序不支持  new image() ; 下列就是echarts.js 源码,版本不同格式化后显示的 function 命名有所不同。但是全局就只有这么一个 new image ;全局搜一下就好 !!! 全局定义 canvas

    2024年02月13日
    浏览(62)
  • 【vue3+vite】使用vite-plugin-svg-icons插件显示本地svg图标

    使用vite-plugin-svg-icons插件显示本地svg图标 1.安装vite-plugin-svg-icons插件 2.使用vite-plugin-svg-icons插件 2.1 在项目根目录查找vite.config.js,进行配置 2.2 vite-plugin-svg-icons插件引入在main.js中 2.3 svg图标放入对应路径~~~~~图标路径与iconDirs设置得路径一致 项目中使用示例: //menu.icon是路径里面

    2024年02月12日
    浏览(44)
  • HTML <svg> 标签

    实例 画一个圆: 页面下方有更多 TIY 实例。 svg  标记定义 SVG 图形的容器。 SVG 有几种绘制路径、框、圆、文本和图形图像的方法。 如需了解有关 SVG 的更多信息,请阅读我们的 SVG 教程。 元素 Chrome IE Firefox Safari Opera svg 4.0 9.0 3.0 3.2 10.1 实例 画一个矩形: 实例 画一个带有圆

    2024年02月12日
    浏览(47)
  • 带你了解SVG标签

    ✍️ 作者简介: 前端新手学习中。 💂 作者主页: 在主页中查看更多前端教学,可接大学生前端作业单。 🎓 专栏分享:css重难点教学   Node.js教学 从头开始学习   ajax学习 js学习 SVG是一种图形文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基

    2024年02月15日
    浏览(63)
  • svg矢量图标在wpf中的使用

    在wpf应用程序开发中,为支持图标的矢量缩放,及在不同分辨率下界面中图标元素的矢量无损缩放,所以常常用到svg图标,那么如果完 美的将svg图标运用到wpf日常的项目开发中呢,这里分享一下我的个人使用经验和详细步骤。 1、SvgToXaml 工具 我经常使用一款开源的svg转xaml的

    2024年01月21日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包