如何实现平滑的“盒影”动画效果
这里有一个简单的方法来实现上述问题。如果要实现最小重绘,应该创建一个虚拟元素,并对其不透明度元素进行动画处理,这样它就可以模拟与每秒60帧动画的移动对象相同的效果。
例子
仔细观察这个例子,比较我们在其中使用的不同技巧。你说这两种效果看起来一样吗?唯一的区别是我们如何应用阴影和动画。在左边的例子中,当我们悬停鼠标时,我们将动画效果应用到框阴影中。在右边的例子中,我们添加了一个带有::after的虚拟元素,在其上设置了一个阴影,并为元素的不透明度元素制作了动画。
如果用开发工具尝试其中一个,应该会看到这样的东西(绿色条表示已经画出来了,越少越好):
当你比较悬停在左边的卡片(在方框阴影上应用动画)和悬停在右边的卡片(在其伪元素的不透明度上应用动画)时,你会明显地发现有更多的重绘。
为什么我们会看到这种效果?有几个CSS属性,即不透明度和变换,在执行动画时不会触发连续重绘每一帧。我们最好坚持在动画中只改变这两个属性,以尽量减少重绘(你的浏览器必须做的工作)。
放弃其他布局样式,这是两种技术的主要区别:
/*缓慢的方式*/
。慢慢来{
box-shadow: 0 1px 2px rgba(0,0,0,0.15);
过渡:框阴影0.3s渐出:
}
/*悬停鼠标实现较大阴影的过渡*/
。慢慢来:悬停{
box-shadow:0 5px 15px rgba(0,0,0,0.3);
}
/*捷径*/
。快速制作{
box-shadow: 0 1px 2px rgba(0,0,0,0.15);
}
/*设置更大的阴影并隐藏它*/
。快速完成::之后{
box-shadow:0 5px 15px rgba(0,0,0,0.3);
不透明度:0;
转场:不透明度0.3s渐出:
}
/*实现鼠标悬停时较大阴影的过渡显示*/
。快速制作:hover::after {
不透明度:1;
}