整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

如何快速的写出一个Vue的icon组件?这篇文章来教你

随着Vue的诞生,它似乎就被人寄予厚望,不仅仅是因为其轻量级的MVVM设计方式,而且其实现了组件化开发模式,所以越来越多的人会拿Vue和AngularJS、React Native做比较。具体关于它们的比较,我不做过多描述,使用哪个应该根据使用场景出发。

Vue.js

最近,因为有业务需要使用Vue去开发,所以我们需要自己封装出Vue.js的各种常用组件。今天就给大家介绍一下我封装Vue的icon组件的过程。当然这篇文章不是Vue.js,Webpack类的基础教学课程,而是在大家有些基础的情况下去看的。所以文章中只介绍了部分重点的代码,以及代码的截图,如果有不大能看懂的地方可以先学下Vue和webpack的基础。如果真的有需要可以在评论处评论,我可以出些Vue,Gulp,Webpack等基础文章。

icon组件外观

首先我们看一下icon组件运行出来后的模样

icon组件

icon组件实现过程

  • 项目搭建

icon组件实现后是一个可以直接使用的npm包,使用的是Yeoman构建工具,配和Gulp+Webpack,生成的工作目录结构如下

目录结构

(1)config文件夹下是webpack的配置文件

(2)src下是Vue组件的源文件

(3)example文件夹下是示例,刚看到的截图就是example文件夹下的文件运行后的样子

  • icon源文件编写

项目结构生成好后,编写icon组件的源文件就是最重要的了。

icon组件是一个.vue文件,其中包含template,style和script。

我实现的icon组件样式是借助于ionicons,所以要借助于ionicons的样式文件,因此会有以下的代码

引入ionicons的样式

然后考虑icon组件应该具备的几项属性,一个是样式,利用type变量去控制;一个是颜色,利用color变量去控制;一个是大小,利用size变量去控制。所以template中有以下代码

template代码

在script中有以下代码

script代码

同时预先定义好icon组件大中小的几个样式,因此在style中会有以下代码

style代码

至此icon组件的源码编写就结束了,但并不是整个工程就结束了,需要对webpack进行设置,而这也是最重要的部分。

因为我们在icon组件的源码中引入了ionicons的样式,所以需要在webpack的配置文件中加入对css文件的解析loader,而css文件中又会引入woff,svg等文件,因此又要加入对这些文件的解析loader,如果不加入的对css,tff,svg等文件解析的话会报错

在webpack.base.js文件中加入以下代码

webpack的配置

  • 样例的访问

在源文件和webpack配置好后,就可以通过在example文件夹下写demo了。

在demo.vue文件中,使用<icon>标签即可访问到自定义的icon组件

icon组件的例子

通过type,size,color三个参数来定义我们需要的icon组件的样式,运行出来后的例子就如一开始运行出来的一样,是不是很好看呢?

总结

Vue的组件还有很多,例如form表单类的,View视图类,Navigation导航类等,都需要一个个去编写,不过只要我们搞懂Vue的运行模式和Webpack的编译模式就可以很方便的写出来了。

如果喜欢的话,记得关注小编噢,小编后续会坚持出更多技术性的文章,如果有任何问题,也欢迎提问,小编都会尽力解答的。

前端的开发过程中,需要用到大量的图片,当使用这些图片一段时间后,会发现这个过程是千篇一律的,设计,切图,适配。当然,许多人也喜欢用字体图标。时间久了,这很枯燥,作为一个前端,不就是喜欢折腾吗?不折腾不舒服斯基,那么这次就来尝试用纯css绘制动画线性icon吧。

当我第一次使用纯css线性icon的时候,那感觉就像呼吸到了新鲜空气一般,它的高可扩展性、易使用、加载速度快的特定给我留下了非常深刻的印象。

线性图标使用了什么技术呢?

其实很容易猜到,它使用了svg技术。整个开始过程其实是把svg放到一个背景中,然后用一张线性渐变的背景覆盖在上方,然后使用css的mix-blend-mode的属性来裁剪、混合。最后线性渐变背景的混合模式设置为mix-blend-mode: screen后,线性渐变会渐渐消失在白色背景上。这就形成了我们的渐变图标。

下面是具体的代码实现:

一、编写背景样式

背景图可以是亮的或是暗的,如果是暗背景,那渐变层需要设置mix-blend-mode: multiply,如果背景图是亮的,那渐变的混合属性需要设置为mix-blend-mode:screen,下面,我们选择一个亮的背景:

二、添加线性图标

<divclass="icon-background"><svgxmlns="http://www.w3.org/2000/svg"viewBox="0 0 50 62"><rectx="19"y="6"width="12"height="4"/><rectx="1"y="38"width="48"height="4"/><linex1="25"y1="1"x2="25"y2="6"/><linex1="25"y1="42"x2="25"y2="58"/><lineclass="cls-1"x1="38"y1="42"x2="44"y2="61"/><linex1="12"y1="42"x2="6"y2="61"/><linex1="8.53"y1="53"x2="41.47"y2="53"/><polygonpoints="3 38 16.75 25.99 24.59 31.99 36.92 20 47 29.82 47 37.98 3 38"/><circlecx="14"cy="18"r="3"/><polygonpoints="31 8 31 10 19 10 19 8 3 8 3 38 47 38 47 8 31 8"/></svg></div>

svg的颜色需要设置为黑色:

svg{ color:#000; position:relative; opacity:.9; width:100%; height:100%; display:block; transition:transform .3s ease;}

三、制作渐变层

该层需要紧跟着icon层,并且需要设置渐变属性



四、添加动画效果

该步骤非常简单,只要使用keyframes并配以旋转动画即可。

Vue3 已切换到默认版本,现在新做的项目基本都直接用 Vue3 了, 但是升级到 Element Plus 后很多人都感觉 icon 的使用方式不习惯、不好用,今天就跟大家分享一个简单又方便的方法,用熟悉的方法使用 icon。

只需要用到 UnoCSS

UnoCSS 是 antfu 开发的一个原子化 CSS 引擎,这里就不详细说了,大家感兴趣可以去读一下他的文章【重新构想原子化CSS - 知乎】。

  • antfu 为 Vue3 生态写了很多优秀的工具,牛逼Plus。

正文开始

以下教程都是只针对 Vite,VueCli 的要自己研究下。

安装依赖

# @iconify-json/ep 是 Element Plus 的图标库
npm i -D unocss @iconify-json/ep

修改 vite.config.ts 配置

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import Unocss from 'unocss/vite'
import { presetIcons } from 'unocss'

export default defineConfig({
  plugins: [
    vue(),

    // 添加以下配置
    Unocss({
      presets: [
        presetIcons({
          scale: 1.2,
          warn: true
        }),
      ],
      // 以下配置是为了可以直接使用标签 <i-ep-edit />
      variants: [
        {
          match: (s) => {
            if (s.startsWith('i-')) {
              return {
                matcher: s,
                selector: (s) => {
                  return s.startsWith('.') ? `${s.slice(1)},${s}` : s
                },
              }
            }
          },
        },
      ],
    })
  ]
})

修改 main.ts

// 在 main.ts 里添加以下代码
import 'uno.css'

可以开始写代码

  • 使用方法:前缀 i-ep- + "图标名", "i-ep-lock"
<template>
  <div style="margin: 50px;">
    <el-space direction="vertical" alignment="left">
      <!-- 直接使用 -->
      <el-space>
        <!-- 使用class -->
        <div class="i-ep-lock"></div>
        <!-- 使用标签 -->
        <i-ep-edit />
      </el-space>

      <!-- 组件里使用 -->
      <el-button icon="i-ep-avatar">Button</el-button>

      <el-input prefix-icon="i-ep-search" suffix-icon="i-ep-pointer" ></el-input>

      <el-menu>
        <el-menu-item >
          <el-icon class="i-ep-menu"></el-icon>
          <span>Navigator Two</span>
        </el-menu-item>
      </el-menu>

    </el-space>
  </div>
</template>

运行效果

使用注意

UnoCSS 是关键词匹配按需生成的,所以要注意以下使用方法

<!-- 错误 -->
<script steup>
const icon = 'lock';
</script>

<div :class="`i-ep-${icon}`"></div>
<div :class="`i-ep-${isLock ? 'lock' : 'menu'}`"></div>
<!-- 正确 -->
<script steup>
const icon = 'i-ep-lock';
</script>

<div :class="icon"></div>
<div :class="isLock ? 'i-ep-lock' : 'i-ep-menu'"></div>

如果你的 icon 变量是从接口获取的,要修改 UnoCSS 的配置

Unocss({
  // 添加以下配置, safelist 是预生成 i-ep-lock 的样式不管代码有没有使用这个图标
  safelist: ['i-ep-lock', 'i-ep-menu']
})

快速把整个图标库载入

import epIcons from '@iconify-json/ep'

Unocss({
  // 修改成以下配置
  safelist: [
    ...Object.keys(epIcons.icons.icons).map(name => `i-${epIcons.icons.prefix}-${name}`),
  ],
})

使用任意的图标集

Icônes 可以在这个找自己喜欢的图标集,我们挑 ant design 来说一下。

# 安装依赖
npm i @iconify-json/ant-design -D
<template>
  <div style="margin: 50px;">
    <el-space direction="vertical" alignment="center">

      <!-- 直接使用 -->
      <el-space>
        <div class="i-ant-design:account-book-filled"></div>
        <i-ant-design:carry-out-twotone />
      </el-space>

      <!-- 组件里使用 -->
      <el-button icon="i-ant-design:percentage-outlined">Button</el-button>

      <el-input prefix-icon="i-ant-design:search-outlined" suffix-icon="i-ant-design:heart-filled" ></el-input>

      <el-menu>
        <el-menu-item >
          <el-icon class="i-ant-design:align-center-outlined"></el-icon>
          <span>Navigator Two</span>
        </el-menu-item>
      </el-menu>

    </el-space>

  </div>
</template>

完美配合


ant Design 图片完美配合

最后

大家开始愉快地写代码吧。更多的使用配置大家可以去看一下文档也参考一下我写的一个后台模板里的配置MDAdmin(基于 Vue3 + Ts + Element Plus)。