Shimmer加载效果在Vue里怎么实现才不卡顿?
我在用Vue做列表页的骨架屏,但加了Shimmer动画后页面明显变卡,尤其在低端手机上。是不是我的写法有问题?
我试过用CSS动画配合v-for渲染多个占位块,但一滚动就掉帧。下面是我现在的代码:
<template>
<div v-if="loading">
<div v-for="i in 5" :key="i" class="shimmer-item"></div>
</div>
<div v-else>真实内容</div>
</template>
<style>
.shimmer-item {
height: 60px;
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: shimmer 1.5s infinite;
}
@keyframes shimmer { to { background-position: 200% 0; } }
</style>
关键点:
1. 改用绝对定位的伪元素做动画层,避免重绘整个元素
2. 透明度替代纯色变化,GPU渲染更友好
3. 动画属性用left而不是background-position
另外v-for的数量控制在3-5个就够了,多了照样卡。如果还不行的话...那就只能祭出终极大招:降低动画频率或者直接关掉低端机的动画,检测设备性能可以用navigator.hardwareConcurrency。