svg icon集成方案
背景
在svg还不流行时,图标的通用方案是png sprite图片。随着浏览器对svg的支持程度,目前都在接入svg图标。
开源解决方案
- iconify
优点:支持按需加载,方便使用各类开源图标库。内部后台管理系最佳选择。
缺点:图标部署在iconify网站上,离线方式使用没有按需加载的优势。
- unplugin-icons
优点:支持按需加载,大量开源前端ui库都采用此方式。前台应用最佳选择。
缺点:不支持动态图标。有动态图标需求的谨慎考虑。
antfu/unplugin-icons: 🤹 Access thousands of icons as components on-demand universally. (github.com)
- vite-plugin-svg-icons
不推荐,基于vite2,已经不再维护,目前仍有一些后台管理系统基于此方案。
vbenjs/vite-plugin-svg-icons: Vite Plugin for fast creating SVG sprites. (github.com)
相关参考
CSS Sprites: What They Are, Why They're Cool, and How To Use Them | CSS-Tricks - CSS-Tricks
app内嵌h5问题合集
小程序问题合集
- 底部自定义tabbar闪烁问题
深坑,很多年没有解决。本质原因初始设计时每个页面底部tabbar不是共用的,还是不同的页面生成不同的实例。目前的解决方案有三个。
方案一:自定义导航和自定义tabbar不同时使用,需要设计上妥协,目前官方给的tabbar demo这种情况是不会出现闪烁的。
方案二:单页应用,不使用微信官方的tabbar。自己基于组件模拟一个。缺点是开发要做的工作多,首页比较简单的情况下会好点。首页多个tab过于复杂的情况会导致dom渲染太多,引起卡顿问题。
方案三: 等微信修复。。。
相关issue:自定义tabbar切换时会闪烁 | 微信开放社区 (qq.com)
- 上传文件进度条进度不准
相关issue:UploadTask.onProgressUpdate 进度秒到100 | 微信开放社区 (qq.com)
微前端解决方案
app内嵌h5页面标题动态改变
网站性能优化
vue弹窗滚动穿透
vue未知高度展开收起动画
<script lang="ts" setup>
import type { RendererElement } from 'vue'
const on = {
beforeEnter(el: RendererElement) {
if (!el.dataset) el.dataset = {}
el.dataset.oldPaddingTop = el.style.paddingTop
el.dataset.oldPaddingBottom = el.style.paddingBottom
el.style.maxHeight = 0
el.style.paddingTop = 0
el.style.paddingBottom = 0
},
enter(el: RendererElement) {
el.dataset.oldOverflow = el.style.overflow
if (el.scrollHeight !== 0) {
el.style.maxHeight = `${el.scrollHeight}px`
el.style.paddingTop = el.dataset.oldPaddingTop
el.style.paddingBottom = el.dataset.oldPaddingBottom
} else {
el.style.maxHeight = 0
el.style.paddingTop = el.dataset.oldPaddingTop
el.style.paddingBottom = el.dataset.oldPaddingBottom
}
el.style.overflow = 'hidden'
},
afterEnter(el: RendererElement) {
el.style.maxHeight = ''
el.style.overflow = el.dataset.oldOverflow
},
beforeLeave(el: RendererElement) {
if (!el.dataset) el.dataset = {}
el.dataset.oldPaddingTop = el.style.paddingTop
el.dataset.oldPaddingBottom = el.style.paddingBottom
el.dataset.oldOverflow = el.style.overflow
el.style.maxHeight = `${el.scrollHeight}px`
el.style.overflow = 'hidden'
},
leave(el: RendererElement) {
if (el.scrollHeight !== 0) {
el.style.maxHeight = 0
el.style.paddingTop = 0
el.style.paddingBottom = 0
}
},
afterLeave(el: RendererElement) {
el.style.maxHeight = ''
el.style.overflow = el.dataset.oldOverflow
el.style.paddingTop = el.dataset.oldPaddingTop
el.style.paddingBottom = el.dataset.oldPaddingBottom
},
}
</script>
<template>
<transition name="collapse-transition" v-on="on">
<slot />
</transition>
</template>
<style>
.collapse-transition {
transition: .2s height ease-in-out,
.2s padding-top ease-in-out,
.2s padding-bottom ease-in-out;
}
.collapse-transition-leave-active,
.collapse-transition-enter-active {
transition: .2s max-height ease-in-out,
.2s padding-top ease-in-out,
.2s padding-bottom ease-in-out;
}
</style>
参考文档
element-plus/collapse-transition.vue at dev · element-plus/element-plus (github.com)