评论

小程序实现Icon组件的四种方式

介绍小程序中自定义icon组件的四种方式

介绍小程序中自定义icon组件的四种方式

小程序官方提供了一个icon组件,但是改组件只有10种类型。在日常开发中,难免会需要自定义一些icon组件。本文带你实现四种自定义icon组件的方式,并且概述每种方式的优劣点

一、image图片

利用小程序原生image标签就能实现一个自定义的icon组件。这种方式通过切图,然后对其设置宽高便能实现想要的icon组件。但这种图片方式无法方便的修改icon颜色,并且图片缩放过大后容易失真,并且图片会占用一次http请求
实现代码如下

<image src="./close.png" style="display: inline-block;" class="image"/>
.image {
  width: 25rpx;
  height: 25rpx;
}

二、css3方式

小程序wxss原生支持css3。所以可以通过css3方式实现自己想要的自定义icon。但这种方式实现一些比较复杂的icon比较困难,且用css的方式实现需要耗费一定的工作量
实现代码如下

<view class="icon-close"></view>
.icon-close {
  display: inline-block;
  width: 17rpx;
  height: 2rpx;
  background-color: red;
  transform: rotate(45deg);
}

.icon-close::after {
  content: "";
  display: block;
  width: 17rpx;
  height: 2rpx;
  background-color: red;
  transform: rotate(-90deg);
}

三、字体文件方式

小程序wxss支持加载远程字体文件。阿里巴巴矢量图标库(iconfont.cn)可以在线选择想要的icon图片,并且可以修改样式,然后生成cdn的字体文件。然后再通过css加载改字体文件便能实现自定义icon。这种方式比较便捷,图标种类繁多,而且修改样式也比较灵活
实现代码如下

<icon class="iconfont icon_01" />
@font-face {
  font-family: 'iconfont';
  /* Project id 2361238 */
  src: url('//at.alicdn.com/t/font_2361238_cxshqh1m3m7.woff2?t=1642320886173') format('woff2'),
    url('//at.alicdn.com/t/font_2361238_cxshqh1m3m7.woff?t=1642320886173') format('woff'),
    url('//at.alicdn.com/t/font_2361238_cxshqh1m3m7.ttf?t=1642320886173') format('truetype');
}

.iconfont {
  font-family: "iconfont" !important;
  font-size: 16px;
  font-style: normal;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}


.icon_01::before {
  content: "\e6f1";
}

四、svg方式

通过svg图片的方式也能实现自定义icon。但是相比第一种方式,svg图片可以修改颜色,并且缩放的失真率也比较低。不过小程序wxss并不支持加载本地的svg图片。我们可以通过在线(https://www.sojson.com/image2base64.html)svg转base64的方式在wxss中加载svg图片。
实现代码如下

<icon class="close-icon"></icon>
.close-icon {
  width: 20rpx;
  height: 20rpx;
  background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjU2MjM5NjM4MDE2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwNDUgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE4NDIiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjA0LjEwMTU2MjUiIGhlaWdodD0iMjAwIj48ZGVmcz48c3R5bGUgdHlwZT0idGV4dC9jc3MiPkBmb250LWZhY2UgeyBmb250LWZhbWlseTogZmVlZGJhY2staWNvbmZvbnQ7IHNyYzogdXJsKCIvL2F0LmFsaWNkbi5jb20vdC9mb250XzEwMzExNThfdTY5dzh5aHhkdS53b2ZmMj90PTE2MzAwMzM3NTk5NDQiKSBmb3JtYXQoIndvZmYyIiksIHVybCgiLy9hdC5hbGljZG4uY29tL3QvZm9udF8xMDMxMTU4X3U2OXc4eWh4ZHUud29mZj90PTE2MzAwMzM3NTk5NDQiKSBmb3JtYXQoIndvZmYiKSwgdXJsKCIvL2F0LmFsaWNkbi5jb20vdC9mb250XzEwMzExNThfdTY5dzh5aHhkdS50dGY/dD0xNjMwMDMzNzU5OTQ0IikgZm9ybWF0KCJ0cnVldHlwZSIpOyB9Cjwvc3R5bGU+PC9kZWZzPjxwYXRoIGQ9Ik0yODIuNTE3MzMzIDIxMy4zNzZsLTQ1LjM1NDY2NiA0NS4xNjI2NjdMNDg5LjQ3MiA1MTIgMjM3LjE2MjY2NyA3NjUuNDYxMzMzbDQ1LjM1NDY2NiA0NS4xNjI2NjdMNTM0LjYxMzMzMyA1NTcuMzU0NjY3bDI1Mi4wOTYgMjUzLjI2OTMzMyA0NS4zNTQ2NjctNDUuMTYyNjY3LTI1Mi4yODgtMjUzLjQ0IDI1Mi4yODgtMjUzLjQ4MjY2Ni00NS4zNTQ2NjctNDUuMTYyNjY3TDUzNC42MTMzMzMgNDY2LjYyNGwtMjUyLjA5Ni0yNTMuMjI2NjY3eiIgcC1pZD0iMTg0MyI+PC9wYXRoPjwvc3ZnPg==');
  background-position: unset;
  background-repeat: no-repeat;
  background-position: center;
  background-size: contain;
}

五、总结

上述四种方式都能实现自定义icon。每种都有其利弊。如果四种方式都可以满足需求,建议优先使用第三种方式。

最后一次编辑于  2022-06-27  
点赞 1
收藏
评论

1 个评论

  • 赵健棋
    赵健棋
    2022-07-22

    第三种方式已经挂了,阿里不提供【//at.alicdn.com】这个接口了。。。只能下载到本地,之后还有一堆的问题。。。

    2022-07-22
    赞同
    回复 1
登录 后发表内容