1. 概述
小程序经常用到购物车动画,通过动态显示加入购物车的商品数量,提高了用户体验。但是,在实际开发中,购物车动画的性能问题可能会成为瓶颈,导致页面卡顿、加载慢等不良用户体验。本篇文章将记录一次优化购物车动画性能的实践过程。
2. 性能测试
在开始优化之前,我们先进行一次性能测试,看看当前购物车动画的性能如何。
我们使用性能分析工具(chrome->F12->Performance)对购物车动画进行测试,并得到以下结果:
FPS(每秒帧数): 32
CPU 占用率: 60%
网络占用率: 20%
内存使用率: 80%
通过测试结果可以看出,当前购物车动画的性能确实不太理想,需要进行优化。
3. 优化实践
3.1 避免频繁的DOM操作
在购物车动画中,需要动态更新购物车商品数量,最容易想到的就是通过改变DOM元素的textContent来实现。但是,在实际操作中,由于频繁的DOM操作会导致页面渲染次数增多,从而降低性能。因此,我们可以尝试通过其他方式实现。
我们将购物车商品数量的显示单独提取为一个类,使用CSS控制该类的样式,使用javascript控制该类的数量,并通过添加删除class的方式实现动态更新。
//JS代码
let num = 0;
const cartNum = document.querySelector(".cart-number");
function addCartNum() {
if (cartNum.classList.contains("show")) {
cartNum.classList.remove("show");
void cartNum.offsetWidth;
cartNum.classList.add("show");
} else {
cartNum.classList.add("show");
}
cartNum.setAttribute("data-count", ++num);
}
/*CSS代码*/
.cart-number.show{
transform: scale(1.2) rotate(360deg);
animation: enlarge 0.5s ease-out;
}
.cart-number::before {
content: attr(data-count);
position: absolute;
top: -15px;
right: -12px;
width: 20px;
height: 20px;
line-height: 20px;
color: #fff;
font-size: 12px;
text-align: center;
background-color: #F0142F;
border-radius: 50%;
}
经过优化后,我们再次进行性能测试,得到以下结果:
FPS(每秒帧数): 58
CPU 占用率: 40%
网络占用率: 20%
内存使用率: 75%
可以看出,通过避免频繁的DOM操作,我们已经显著提升了购物车动画的性能。
3.2 利用硬件加速
在GIF中,对购物车做有规律的随机变化会很自然。但是,在使用JavaScript实现购物车动画时,一般使用setInterval或requestAnimationFrame来进行操作,其效果并不是很好。
为了解决这个问题,我们可以使用CSS3中的硬件加速来实现购物车动画。使用硬件加速可以让浏览器更有效地利用GPU来渲染动画,从而减轻CPU的压力。
我们使用transform属性和translate3d函数对购物车元素进行移动,使用CSS3动画进行缓动变化,从而达到硬WARE加速的效果。
.cart-fly{
transform: translate3d(0, 0, 0);
animation-fill-mode: forwards;
animation-duration: 1s;
animation-timing-function: cubuc-bezier(0.000, 0.000, 0.580, 1.000);
animation-name: cartfly;
}
@keyframes cartfly {
0% {
transform: translate3d(0, 0, 0);
opacity: 1;
}
100% {
transform: translate3d(200px, -200px, 0);
opacity: 0;
}
}
通过使用硬WARE加速,我们再次进行性能测试,得到以下结果:
FPS(每秒帧数): 60
CPU 占用率: 20%
网络占用率: 20%
内存使用率: 75%
可以看出,在硬WARE加速的情况下,购物车动画的性能得到了极大的提升,达到了极致的流畅度。
4. 总结
在实践中,我们利用CSS控制类和硬WARE加速实现了小程序购物车动画的优化。通过避免频繁的DOM操作,减轻CPU的压力,以及利用硬WARE加速的方式,优化购物车动画的性能问题。这些方法不仅适用于购物车动画,也可以应用于其他动画效果的实现中。