面试题答案
一键面试避免重排重绘
- 使用
will-change
提示浏览器 在路由组件的动画即将开始前,通过will-change
CSS 属性告诉浏览器该元素即将发生变化,让浏览器提前准备优化。例如,在即将进行位移动画的元素上提前添加:
.element {
will-change: transform;
}
在实际项目中,对于一个包含大量卡片组件的页面,在卡片进行路由切换动画(如平移进入/离开)前添加 will-change
,能让动画过渡更加流畅,减少卡顿感。
- 批量修改样式
在 Vue 组件中,避免频繁单独修改样式属性导致多次重排重绘。例如,将多个样式修改合并在一个
class
切换中。假设我们有一个路由切换动画涉及元素的opacity
和transform
变化:
<template>
<div :class="['element', active ? 'active-class' : '']"></div>
</template>
<style>
.element {
opacity: 0;
transform: translateX(-100%);
transition: opacity 0.3s, transform 0.3s;
}
.active-class {
opacity: 1;
transform: translateX(0);
}
</style>
这样通过 active
变量控制 class
的切换,一次性改变多个样式,减少重排重绘次数。在一个页面导航栏切换动画的项目场景中,使用这种方式使得动画性能得到显著提升,动画过程不再出现闪烁。
利用 GPU 加速
- 使用
transform
和opacity
动画 浏览器会将transform
和opacity
的动画操作交给 GPU 处理,而不是 CPU。在路由切换动画中尽量使用这两个属性来实现动画效果。比如制作淡入淡出和缩放的路由切换动画:
<template>
<div :style="{ opacity: active ? 1 : 0, transform: active ? 'scale(1)' :'scale(0.8)' }"></div>
</template>
<script>
export default {
data() {
return {
active: false
};
},
watch: {
'$route'() {
this.active = true;
setTimeout(() => {
this.active = false;
}, 300);
}
}
};
</script>
<style>
div {
transition: opacity 0.3s, transform 0.3s;
}
</style>
在一个图片展示页面的路由切换中,使用 transform
和 opacity
动画实现图片的缩放和淡入淡出效果,页面流畅度明显提高,即使在低端设备上也能较为顺滑地展示动画。
- 使用
backface-visibility: hidden
对于一些需要 3D 变换的路由切换动画,添加backface-visibility: hidden
可以让浏览器在渲染时忽略元素背面,减少渲染计算量,利用 GPU 更高效地渲染。例如,一个卡片翻转的路由切换动画:
.card {
backface-visibility: hidden;
transform-style: preserve-3d;
transition: transform 0.5s;
}
在实际项目中,如一个展示产品详细信息的卡片式路由切换场景,添加该属性后,卡片翻转动画更加流畅,并且减少了设备的发热和电量消耗。