如何在 Vue 项目中优雅地使用图标

1. 字体图标与矢量图标

目前主要有两种图标类型:字体图标和矢量图标。

字体图标是在网页打开时,下载一整个图标库,通常可以通过特定标签例如 <i> 来使用,优点是方便地实现文字混排,缺点是包体积大,且难以自定义。

矢量图标本质是 <svg> 标签,包中只含有所需的图标,且很容易自定义,也可以选用不同图标库来源的图标,甚至可以用自定义 SVG,缺点是与文字混排相对复杂。

本文推荐并主要使用矢量图标。

2. 矢量图标源

目前比较全面的图标集:

  1. Google Material Symbols (之前的 Google Icon):比较现代化的图标集,包括圆角尖角图标集、 空心实心图标集,主打交互图标,没有商标。

  2. Material Design Icons:Material 风格的另一个图标集,大而全。

  3. Iconfont:阿里的图标库,包括很多带颜色的特殊图标

  4. Iconify:一个各种图标集的收集站,我们后文使用的包可以使用其中的所有图标集。

以上基本可以满足任何使用要求了。

3. 安装图标包及其剪枝策略

为了在 Vue 中便捷地使用图标,可以使用 iconify-prerendered 库,包含了所有 iconify 中图标集的图标的组件:

# 安装 Material Symbols 包
npm i @iconify-prerendered/vue-material-symbols# 安装 Material Design Icons 包
npm i @iconify-prerendered/vue-mdi

当需要引入时,可以使用:

<script setup lang="ts">
import { IconWarningRounded } from '@iconify-prerendered/vue-material-symbols';
</script><template><IconWarningRounded />
</template>

@iconify-prerendered/vue-material-symbols 的图标一般命名格式为:

Icon + 图标名 + 可选: Outline (空心) + 可选: Rounded (圆角)

同时,这里我们需要引入各个所需的图标,而不能使用通配符:

# 不能这样
import * from '@iconify-prerendered/vue-mdi';

这是因为我们的代码需要剪枝友好。剪枝是一种代码编译策略,毕竟不可能将包中所有的图标都发往客户端浏览器,所以编译为 js 包时,只会包含已经被 import 的图标,因此最大程度地减少了包体积。

注意:当 vite 运行在 dev 模式时,iconify-prerendered 会将整个图标包 (10M) 发送到浏览器,而不会剪枝,因此首次加载会很慢,请耐心等待。build 后会自动剪枝,不会再出现这种情况。

4. 图标与文字混排

由于我们使用的图标包本质上会将图标以 <svg> 标签的形式渲染,因此需要考虑混排的问题,一般用 flex 容器先包含两个元素,然后在 icon 上使用 my-auto 以实现:

<script setup lang="ts">
import { IconWarningRounded } from '@iconify-prerendered/vue-material-symbols';
</script><template><div class="flex text-red-700 gap-2"><IconWarningRounded class="my-auto w-6 h-6" /><p class="text-lg font-semibold">Error!</p></div>
</template>

5. 自定义 SVG 图标

自定义 SVG 图标一般需要关注:viewBox(代表定义的画布范围)、fill(颜色)两个属性:

<template><svg viewBox="0 0 16 16" fill="currentColor"><pathd="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
</template>

这个 SVG 可以由 Adobe Illustrator 生成 (另存为 SVG),略微修改即可做成 Vue 组件使用。

如果需要修改图标颜色,可以直接设置 color 属性:

<script setup lang="ts">
import { IconWarningRounded } from '@iconify-prerendered/vue-material-symbols';
</script><template><IconWarningRounded class="text-red-500" />
</template>

如果需要分别设定各个路径,可以直接在 <path> 上进行修改,例如使用 fill 属性修改填充颜色:

<template><svg viewBox="0 0 16 16"><path class="fill-slate-400 hover:fill-slate-300 transition-colors duration-300"d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/><path class="fill-red-400 hover:fill-yellow-300 transition-colors duration-300"d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
</template>

6. 案例分析


上述方式已经使用在开源项目 GithubStar.Pro 中,你可以进入网站体验。该项目的源码在:Github,提供了一个 Vue 3.0 + Tailwind CSS + Iconify-Prerendered 的使用案例。

也欢迎各位使用 GithubStar.Pro 互赞平台,提高您的开源项目知名度,收获更多用户。

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

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

相关文章

帝国cms标签模板与模板标签的区别

标签模板:是为ecmsinfo标签服务,用于制作显示样式模板标签:如[ecmsinfo],[phomenews]等都是模板标签本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18299816

易优cms links 友情链接

【基础用法】 标签:links 描述:用于获取友情链接列表。 用法: {eyou:links type=text loop=30 titlelen=15} <a href={$field.url} {$field.target} {$field.nofollow}>{$field.title}</a> {/eyou:links} 属性: type= 链接类型,text为文字链接,image为图片链…

帝国CMS移动端两种方案区别

1、多终端访问功能:支持N种访问端制作,需要复制多份帝国,然后制作各端独立的访问端模板,并且各端页面都是独立,支持浏览与动态互动,全面性高。2、WAP手机访问功能:如果移动端只提供浏览信息功能,用WAP更方便点,不需要复制多份帝国,制作WAP模板即可。本文来自博客园,…

帝国CMS网站会员空间在哪开启或关闭?

会员空间在哪开启或关闭?答:后台>系统>系统参数设置>用户设置:会员空间 选开启或关闭。本文来自博客园,作者:黄文Rex,转载请注明原文链接:https://www.cnblogs.com/hwrex/p/18299794

关于面向对象的方法并行执行的问题

这几天跟同事讨论到LabVIEW的面向对象编程中,如果我设计的一个类有一个方法比较耗时,那么当我实例化多个对象时,那么这个耗时的方法是怎么执行的呢?是各自并行执行还是,必须等某一个对象的方法调用完,接下来调用第二个对象的该方法呢? 接下来,我们直接来做个试验吧! 试…

ARMv8中non-shareable inner-shareable outer-shareable属性

如果将block的内存属性配置成Non-cacheable,那么数据就不会被缓存到cache,那么所有observer看到的内存是一致的,也就说此时也相当于Outer Shareable。 其实官方文档,也有这一句的描述: 在B2.7.2章节 “Data accesses to memory locations are coherent for all observers …

「代码随想录算法训练营」第十天 | 栈与队列 part2

150. 逆波兰表达式求值题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/ 题目难度:中等 文章讲解:https://programmercarl.com/0150.逆波兰表达式求值.html 视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on 题目状态:多次修改 bug 后通过…

【触想智能】安卓工控一体机在自助终端设备上的应用分析

随着科技的发展和人们对自动化系统的需求不断增强,自助终端设备已经成为日常生活非常常见的设备之一,例如自助售货机、自助点餐机、自助银行服务等。这些设备在使用中都需要一个可靠的、稳定的操作系统来支持其各项功能的实现。因此,安卓工控一体机在自助终端设备上的应用越…

[HarekazeCTF2019]encode_and_encode 1

json绕过,waf绕过 打开之后可以直接看到源码<?php error_reporting(0);if (isset($_GET[source])) {show_source(__FILE__);exit(); }function is_valid($str) {$banword = [// no path traversal\.\.,// no stream wrapper(php|file|glob|data|tp|zip|zlib|phar):,// no …

Windows 11 中使用 Win10的文件资源管理器!速度立马起飞

Windows 11的文件资源管理器功能丰富,但性能略逊于Windows 10版本。新版本增加了选项卡、现代UI和预览窗格等功能,但也导致运行速度变慢。因此,一些用户更偏好旧版本的简洁和快速,甚至怀念经典的Ribbon界面。 好消息是,有一种方法可以永久恢复Windows 10的文件资源管理器。只需…