Shimmer加载效果在Vue里怎么实现才不卡顿?

UP主~庆敏 阅读 3

我在用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>
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
程序猿景岩
哈,这个问题我踩过坑。MDN文档里明确提到线性渐变动画在低端设备上性能很差,尤其还配合v-for批量渲染。建议改用简单的背景色动画,标准写法是这样的:


.shimmer-item {
height: 60px;
background-color: #f0f0f0;
position: relative;
overflow: hidden;
}
.shimmer-item::after {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255,255,255,0.6),
transparent
);
animation: shimmer 1.5s infinite;
}
@keyframes shimmer {
to { left: 100%; }
}


关键点:
1. 改用绝对定位的伪元素做动画层,避免重绘整个元素
2. 透明度替代纯色变化,GPU渲染更友好
3. 动画属性用left而不是background-position

另外v-for的数量控制在3-5个就够了,多了照样卡。如果还不行的话...那就只能祭出终极大招:降低动画频率或者直接关掉低端机的动画,检测设备性能可以用navigator.hardwareConcurrency。
点赞
2026-03-09 16:00