图标组件

图标组件是用来负责渲染图标的。
除了Iconify SVG 原生版组件,还支持很多常用的框架版本组件,如 React 版组件、Vue 版组件等。

Iconify SVG原生

Iconify最原始简单基本用法。

使用

<script src="https://code.iconify.design/2/2.0.4/iconify.min.js"></script>
<span class="iconify-inline" data-icon="fa-solid:home"></span>

如果要更换图标,只需要修改data-icon属性即可,如改为fa-regular:home
点击图标集合,查看支持的所有的图标。

样式

1、修改颜色

<span class="iconify-inline" data-icon="fa-solid:home" style=" color:red;"></span>

官方文档更详细,点击这里查看。

2、尺寸

<span class="iconify-inline" data-icon="fa-solid:home" style="font-size:24px;"></span>

官方文档更详细,点击这里查看。

3、旋转
有两种方式可以做到旋转

<!-- svg内部转换,高度还是默认1em(16),但是宽度变成了14px,即14x16。可能会变小。 -->
<i class="iconify" data-icon="fa-solid:home" data-rotate="90deg"></i>
<!-- css整体旋转,18*16变成了16x18。 可能会与周围的元素重叠。 -->
<i class="iconify" data-icon="fa-solid:home" style="transform:rotate(90deg);"></i>

官方文档更详细,点击这里查看。

4、对齐
block 是居中对齐,inline 是基线对齐。其实这个 font 是一样的。

<head>
  <style>
    p { position: relative; font-size: 24px; line-height: 32px; }
    p:after,p:before {  content: ""; position: absolute; left: 0; right: 0; border-bottom: 1px dotted #ccc; }
    p:before { top: 6px;}
    p:after { bottom: 7px;}
  </style>
</head>
<body>
  <p> Block:
    <span class="iconify" data-icon="line-md:image-twotone"></span>
    <span class="iconify" data-icon="mdi:account-box-outline"></span>
  </p>
  <p> Inline:
    <span class="iconify-inline" data-icon="line-md:image-twotone"></span>
    <span class="iconify-inline" data-icon="mdi:account-box-outline"></span>
  </p>
  <script src="./lib/iconify.min.js"></script>
</body>

官方文档更详细,点击这里查看。

方法

使用Iconify.xxx()
1、一般方法:此类的方法就1个

const IconifyV = Iconify.getVersion(); // 获取当前 Iconify 框架版本号
console.log(IconifyV); // 2.0.4

2、获取 icon:方法有3个

iconExists(name); // 检查icon是否存在,返回布尔值.
listIcons(); // 列出可用icons, 返回 string[],可用值指的是存储在localstorage里的icon.
getIcon(name); // 返回一个 icon data, 一般json格式.

3、添加 icon:方法有2个

addIcon(); // 添加一个icon.
addCollection(); // 添加icon集.

注意,此方式添加的加载的 icon 不会缓存到 storage 中,只有 Iconify api(网络) 图标才会被缓存。

4、渲染 icon: 方法有3个

renderSVG(name, customisations?) // 返回 <svg> 元素.
renderHTML(name, customisations?) // 返回 <svg> 字符串.
renderIcon(name, customisations?) // 返回icon data

用于生成 SVG 或者 icon data,看一下返回值,大家就明白了

<span class="iconify-inline" data-icon="line-md:image-twotone"></span>
<script src="./lib/iconify.min.js"></script>
<script>
  console.log(Iconify.renderSVG("line-md:image-twotone"));
  console.log(Iconify.renderHTML("line-md:image-twotone"));
  console.log(Iconify.renderIcon("line-md:image-twotone"));
</script>

5、手动控制占位替换
使用js后期创建的图标组件,并不会被iconify 读取和替换占位符。如下

const node = document.createElement("a");
node.innerHTML = 'Home icon: <span class="iconify" data-icon="mdi:home"></span>';
console.log(node);
/**
 * 打印如下:
 * <a>
 *      Home icon: <span class="iconify" data-icon="mdi:home"></span>
 * </a>
 ** /

scan()
它会扫描文档中的图标占位符并用图标替换占位符。
此方法只执行一次。要想持续监听请用下边的方法 observe()

const node = document.createElement('a');
node.innerHTML = 'Home icon: <span class="iconify" data-icon="mdi:home"></span>';
Iconify.scan(node);
console.log(node);
/**
 * 打印如下:
 * <a>
 *      Home icon: <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--mdi" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" data-icon="mdi:home"><path d="M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8h5z" fill="currentColor"></path></svg>
 * </a>
 ** /

observe()
持续监听文档中的图标存在占位符并用图标替换占位符

const node = document.createElement("a");
setTimeout(() => {
  node.innerHTML =
    'Home icon: <span class="iconify" data-icon="mdi:home"></span>';
  console.log(node);
  /**
   * 打印如下:
   * <a>
   *      Home icon: <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--mdi" width="1em" height="1em" preserveAspectRatio="xMidYMid meet" viewBox="0 0 24 24" data-icon="mdi:home"><path d="M10 20v-6h4v6h5v-8h3L12 3L2 12h3v8h5z" fill="currentColor"></path></svg>
   * </a>
   **/
}, 1000);
Iconify.observe(node); // 如果这里换成scan,则上边打印node 则是原始占位符,并不会被替换

停止/暂停/恢复 监听

stopObserving(); // 停止监听文档中的图标替换操作
pauseObserver(); // 暂停监听文档中的图标替换操作
resumeObserver(); // 继续监听文档中的图标替换操作

6、辅助函数:有2个
calculateSize()
根据宽(高)+宽/高比例,帮你计算出高(宽),是不是觉得很弱智!

/**
 * 计算宽或者高
 *
 * @param {string|number} 宽或高
 * @param {number}  Width/height的比例
 * @param {number} 精确度,默认两位,可以不传
 * @return 宽或高
 */
const res = Iconify.calculateSize(2, 3); // 比如宽是2,宽高的比例是3
console.log(res); // 6

replaceIDs()
此方法会生成一个随机的 uuid。
当基于renderIcon()或 getIcon 返回的数据渲染图标时,应使用它来确保每个图标内的元素具有唯一的ID。
renderSVG()和 renderHTML()生成的图标不需要此函数。 很鸡肋,除非需要否则很少使用

// 获取 icon data
const icon = Iconify.renderIcon("line-md:image-twotone");
// 创建 svg element
const svg = document.createElement("svg");
console.log(svg); // <svg></svg>
// 设置 svg内的 content
setTimeout(() => {
  svg.innerHTML = Iconify.replaceIDs(icon.body);
  console.log(svg); // <svg><g fill="none"><path d="M7 13l-4 3v3h18v-5l-5-4l-6 5l-3-2z" fill="currentColor" fill-opacity=".3" class="il-md-fill il-md-duration-0 il-md-delay-9"><path d="M3 14V5h18v14H3v-5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="il-md-length-70 il-md-duration-4 il-md-delay-0"><path d="M3 16l4-3l3 2l6-5l5 4" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" class="il-md-length-25 il-md-duration-2 il-md-delay-4"><circle cx="7.5" cy="9.5" r="1.5" fill="currentColor" class="il-md-fill il-md-delay-6"></circle></path></path></path></g></svg>
}, 1000);

7、Iconify api独占函数:有3个
disableCache()
使用在线版的icon,icon首次下载后会缓存到localstorage中。
以后再刷新页面,也不会在去请求图片资源了。如何才能禁用缓存呢?

// local|session|all
Iconify.disableCache('all'); // 实测这个无效,还是用下边的吧,反正效果一样
Iconify.enableCache('all', false);

这些函数只能用在在线版图标中,即online版的iconify lib中。
通过 addIcon() 或 addCollection()注册的icon不可以使用。
测试之前注意把本地存储清空,方便验证。

loadIcons()
提前从 Iconify API 中检索图标将资源请求下来,并存储到缓存中,默认也就是localstorage中。
当图片真的调用的时候,变不会再发起网络请求。

Iconify.loadIcons(['line-md:image-twotone'], (loaded, missing, pending, unsubscribe) => {
    console.log(loaded, missing, pending, unsubscribe);
    if (loaded.length) {
        console.log(`Icon 已经加载(即从网络请求到本地存储中)完毕,随时准备用作渲染.`);
    }
    if (missing.length) {
        console.log(`Icon 不存在.`);
    }
    if (pending.length) { // 当load多个Icons的时候会发生。
        console.log('请求中');
    }
})

8、Internal API functions
有几个比较不常用的内部api,提供给更多控制的开发人员使用
这里不在翻译和解读,想看的点此查看原文档。

React

下载依赖

yarn add --dev @iconify/react

项目中引入并使用

import { Icon } from '@iconify/react'; // 引入

function App() {
  return (
    <div className="App">
     <Icon icon="mdi-light:home" />   {/* 使用 */}
    </div>
  );
}

export default App;

组件会自动从 Iconify API检索mdi-light:home 的数据并渲染它。
Iconify API 上有超过 100,000 个来自各种免费和开源图标集的图标,包括所有最流行的图标集。

其它使用如样式、方法等使用方式和svg 框架用法基本一直,直接参考即可,或者查看官方原文档

Vue

下载依赖

yarn add --dev @iconify/vue2

项目中引入并使用

<template>
  <div id="app">
    <Icon icon="mdi-light:home" />
  </div>
</template>

<script>
import { Icon } from '@iconify/vue2';
export default {
  name: 'App',
  components: { Icon }
}
</script>

更多参考官方原文档
另外vue3版本的组件和vue2是一致的,只不过依赖包不同

yarn add --dev @iconify/vue

Vite

下载依赖

yarn add --dev @iconify/vue

项目中引入并使用

<script setup>
  // vite2+vue3
  import { Icon } from '@iconify/vue';
</script>

<template>
  <Icon icon="mdi-light:home" />
</template>

更多参考官方原文档

另外除了vue、react框架外,iconify还支持Svelte、Ember
但是没用过,不予翻译,但是仔细看了官方文档,用法和vue、react一样