CSS如何对阴影动画优化,有什么方法
Admin 2022-05-23 群英技术资讯 604 次浏览
本技巧来自这篇文章 --How to animate box-shadow with silky smooth performance
本文不是直译,因为觉得这个技巧很有意思很有用,遂起一文。
box-shaodw
在我们的工作中使用以及越来越多,伴随阴影的动画或多或少都有一点。假设,我们有下面这样一个盒子:
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; }
这样做的好处是,实际在进行的阴影变化,其实只是透明度的变化,而没有对阴影进行不断的重绘,有效的提升了阴影动画的流畅程度,让它看起来更加丝滑。
为什么对透明度opacity
进行动画要比对box-shadow
进行动画性能更好呢?可以看看这里这张表格,列举了不同属性变换对页面重排、重绘的影响:
very few CSS properties
最后,Demo 可以看看:
CodePen Demo -- 优化box-shadow动画
存在的问题,另外一种方案
原文中上述这个方案其实并不算太完美,因为最终的效果是两个阴影的叠加效果,可能会在整体的感觉上阴影颜色更深了一点。
所以需要对最终状态的阴影进行微调一下,削弱一点效果,尽量让两个阴影的叠加效果与单一一个阴影效果相近。
当然,我们可以再对上述方案进行优化,我们再使用一个::after
伪元素,::after
伪元素设置为初始状态且透明度为1,::before
伪元素设置为末尾状态且透明度为0:
实际 hover 的时候,对两个伪元素进行一显一隐,这样最终的效果只有一个阴影效果,没有阴影的叠加,与直接对阴影进行过渡变化效果一致:
CodePen Demo -- 优化box-shadow动画
总结
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
css自定义属性的继承:1、如果给定的element没有属性值,就会继承父类的元素值。2、css自定义属性的最终表现形式是computed值,子样式风格中找不到这个变量。
背景不能显示(overflow:hidden)。边框不能撑开,如果父级设置了CSS边框属性,子级里使用了float属性产生浮动,父级不能被撑开。margin padding设置值不能正确显示。
这篇文章主要介绍了HTML5 textarea高度自适应的两种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本篇文章给大家带来了关于css的相关知识,其中主要介绍了关于css的绝对定位和相对定位的相关问题,相对定位是元素在移动位置的时候,是相对于它原来的位置来说的,绝对定位是元素在移动位置的时候,是相对于它的祖先元素来说的,下面一起来看一下,希望对大家有帮助。
css中,可利用“background-image”属性和“linear-gradient()”函数来设置背景向两个方向渐变,语法为“元素{background-image:linear-gradient(方向,颜色1,颜色2,颜色3}”。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008