Skip to content

ZIcon

  • 基础的图标库。

WARNING

注意:本图标库引用自 fortawesome,为了节省包体积大小,所以它不包含在组件库中,你在使用它时需要手动安装相关库,安装方法请参考右侧的使用事项

图标库

<template>
  <div class="page">
    <div class="search">
      <input v-model="keyWords" placeholder="请输入关键词,汉字只支持部分查询,具体查询请使用图标类型的单词如:箭头 = arrow"/>
    </div>
    <div class="grid">
      <div class="grid-item" v-for="item in iconList" @click="copyItem(item)">
        <z-icon class="icon" :icon="item"></z-icon>

        <div class="name">{{item}}</div>
      </div>
    </div>
  </div>
</template>

<script setup lang="ts">
import { fas } from "@fortawesome/free-solid-svg-icons";
import { onMounted, ref, watch } from "vue";
import { Message } from "@d7ee/z-base-ui";


const keyWords = ref("");
const iconArr = ref<string[]>([]);
const iconList = ref<string[]>([]);

const dir = new Map([
  ["用户", "user"],
  ["日历", "calendar"],
  ["箭头", "arrow"],
  ["信封", "envelope"],
  ["信", "envelope"],
  ["文件", "file"],
  ["首页", "house"],
  ["家", "house"],
  ["删除", "trash"],
  ["排序", "sort"],
  ["表情", "face"],
  ["标签", "tags"],
  ["电话", "phone"],
])

let timer = 0;
watch(() => keyWords.value, (value) => {
  timer && clearInterval(timer);

  timer = setTimeout(() => {
    if (keyWords.value === value) {
      if (!keyWords.value) {
        iconList.value = iconArr.value;
        return;
      }


      let k: string | null = null;

      if (/^[\u4e00-\u9fa5]+$/.test(keyWords.value) && dir.has(keyWords.value)) k = dir.get(keyWords.value);

      if (!k) {
        iconList.value = iconArr.value.filter((item) => item.includes(keyWords.value));
        return;
      }

      iconList.value = iconArr.value.filter((item) => item.includes(k));
    }
  }, 300);
})

const copyItem = (key) => {
  const input = document.createElement("input");
  input.value = key;

  document.body.appendChild(input);
  input.select();

  document.execCommand("Copy");
  document.body.removeChild(input);

  Message.success("复制成功!")
}

onMounted(() => {
  const node = document.querySelector(".vitepress-demo-preview-description");
  if (node) {
    node.style.display = "none";
  }

  const iconArrs = [];
  Object.keys(fas).forEach(key => {
    if ("iconName" in fas[key] && !iconArrs.includes(fas[key].iconName)) {
      iconArrs.push(fas[key].iconName);
    }
  });

  iconArr.value = iconArrs;
  iconList.value = iconArrs;
})
</script>


<style scoped lang="css">
.grid {
  padding-top: 30px;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
}
.grid-item {
  font-size: 24px;
  color: #555555;
  text-align: center;
  padding: 24px 0;
  cursor: pointer;
  transition: 0.5s;
  border-radius: 6px;
}
.grid-item:hover {
  background: #1677ff;
  color: #ffffff;
}
.icon {
  transition: transform 0.5s;
}
.grid-item:hover .icon {
  transform: scale(1.3);
}
.name {
  padding-top: 6px;
  font-size: 14px;
}


.search {
  border: 1px solid #909399;
  width: 100%;
  z-index: 99;
  padding: 6px 24px;
  background-color: #f5f5f5;
  border-radius: 6px;
}
.search input {
  width: 100%;
}
</style>

使用事项

在你打算使用图标前请确保已执行如下操作。

安装

bash
npm i @fortawesome/fontawesome-svg-core -S

npm i @fortawesome/free-solid-svg-icons -S

npm i @fortawesome/vue-fontawesome -S

导入

在main.js 或 ts中添加如下代码。

typescript
import { library } from "@fortawesome/fontawesome-svg-core";
import { fas } from "@fortawesome/free-solid-svg-icons";

library.add(fas);

基础用法

使用不同属性实现不同效果或动画,对于图标的大小和颜色可以通过内置的sizecolor进行设置,也可以通过className中的字体大小和颜色进行设置。

<template>
  <div class="icon-grid">
    <z-icon icon="message" beat></z-icon>
    <z-icon icon="jet-fighter" bounce></z-icon>
    <z-icon icon="phone" shake></z-icon>
    <z-icon icon="arrow-rotate-right" spin></z-icon>
    <z-icon icon="message" fade></z-icon>
    <z-icon icon="message" beatFade></z-icon>
    <z-icon icon="arrow-rotate-right" spinPulse></z-icon>
    <z-icon icon="jet-fighter" border></z-icon>
    <z-icon icon="jet-fighter" flip="both"></z-icon>
    <z-icon icon="jet-fighter" rotation="90"></z-icon>
    <z-icon icon="message" size="2x"></z-icon>
    <z-icon icon="message" color="red"></z-icon>
  </div>
</template>

<script setup lang="ts">

</script>

<style scoped>
.icon-grid {
  grid-gap: 24px;
}
</style>

API

属性名说明类型默认值
icon组件keystring
bounce跳动booleanfalse
shake抖动booleanfalse
spin匀速旋转booleanfalse
fade褪色,颜色由淡到深booleantrue
beatFade淡入淡出booleanfalse
spinPulse脉冲旋转booleanfalse
border带边框booleanfalse
flip翻转horizontal | vertical | both
rotation旋转90 | 180 | 270
size大小,详见sizestring

size:

2xs | xs | sm | lg | xl | 2xl | 1x | 2x | 3x | 4x | 5x | 6x | 7x | 8x | 9x | 10x