box-shadow 在我们的工作中使用以及越来越多, 伴随阴影的动画或多或少都有一点. 假设, 我们有下面这样一个盒子:
- div {
- width: 100px;
- height: 100px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
- }
希望 hover 的时候, 盒阴影从 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) 过渡到 box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3).
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) --> box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3)
OK, 最简单的方法当然是:
- div:hover {
- width: 100px;
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
- }
因为过渡动画是在两个不同的盒阴影状态在发生, 所以在过渡动画的时间内, 浏览器会不断的重绘盒阴影. 而又由于阴影属于耗性能样式, 所以这种动画给人的感觉多少有些卡顿.
这里有一个小技巧可以优化这种情况下的阴影动画.
使用伪元素及透明度进行优化
使用伪元素及透明度进行优化, 我们给上述元素添加一个 before 伪元素, 大小与父 div 一致, 并且提前给这个元素添加好所需要的最终的盒阴影状态, 但是元素的透明度为 0.
- div {
- position: relative;
- width: 100px;
- height: 100px;
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
- }
- div::before {
- content: "";
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
- opacity: 0;
- }
然后, 在 hover 的时候, 我们只需要将伪元素的透明度从 0 设置为 1 即可.
- div:hover::before {
- opacity: 1;
- }
这样做的好处是, 实际在进行的阴影变化, 其实只是透明度的变化, 而没有对阴影进行不断的重绘, 有效的提升了阴影动画的流畅程度, 让它看起来更加丝滑.
bshadow
为什么对透明度 opacity 进行动画要比对 box-shadow 进行动画性能更好呢? 可以看看这里这张表格, 列举了不同属性变换对页面重排, 重绘的影响:
image.PNG
very few CSS properties
最后, Demo 可以看看:
CodePen Demo -- 优化 box-shadow 动画
存在的问题, 另外一种方案
原文中上述这个方案其实并不算太完美, 因为最终的效果是两个阴影的叠加效果, 可能会在整体的感觉上阴影颜色更深了一点.
所以需要对最终状态的阴影进行微调一下, 削弱一点效果, 尽量让两个阴影的叠加效果与单一一个阴影效果相近.
当然, 我们可以再对上述方案进行优化, 我们再使用一个 ::after 伪元素,::after 伪元素设置为初始状态且透明度为 1,::before 伪元素设置为末尾状态且透明度为 0:
- div {
- position: relative;
- width: 100px;
- height: 100px;
- }
- div::before {
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
- opacity: 0;
- }
- div::after {
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
- }
实际 hover 的时候, 对两个伪元素进行一显一隐, 这样最终的效果只有一个阴影效果, 没有阴影的叠加, 与直接对阴影进行过渡变化效果一致:
- div:hover::before {
- opacity: 1;
- }
- div:hover::after {
- opacity: 0;
- }
1644.gif
CodePen Demo -- 优化 box-shadow 动画
年初整理了一批 web 前端教程, 帮助想要成为 Web 前端程序员的人. 从零基础到各种框架的教程都有. 只需要加入到 Web 前端学习 qun:296,212,562. 即可免费领取, 学习过程中有任何问题可以在里面问. 种一颗树最好的时间是十年前, 其次是现在. 只要想学习, 不存在早晚.
来源: http://www.jianshu.com/p/a8123986b9a1