您现在的位置是:网站首页> 编程资料编程资料
CSS 阴影动画优化技巧JS+css3实现带阴影可点击旋转的3D立体杯子效果源码CSS阴影效果的比较之drop-Shadow与box-ShadowCSS 翘边阴影的实现代码CSS 曲线阴影实现的示例代码css实现悬浮效果的阴影的方法示例css实现多边形和梯形盒阴影技巧CSS中使用文本阴影与元素阴影效果
2021-09-03
1021人已围观
简介 这篇文章主要介绍了CSS 阴影动画优化技巧,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
本技巧来自这篇文章 --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进行动画性能更好呢?可以看看这里这张表格,列举了不同属性变换对页面重排、重绘的影响:

最后,Demo 可以看看:
CodePen Demo -- 优化box-shadow动画
存在的问题,另外一种方案
原文中上述这个方案其实并不算太完美,因为最终的效果是两个阴影的叠加效果,可能会在整体的感觉上阴影颜色更深了一点。
所以需要对最终状态的阴影进行微调一下,削弱一点效果,尽量让两个阴影的叠加效果与单一一个阴影效果相近。
当然,我们可以再对上述方案进行优化,我们再使用一个::after伪元素,::after伪元素设置为初始状态且透明度为1,::before伪元素设置为末尾状态且透明度为0:
实际 hover 的时候,对两个伪元素进行一显一隐,这样最终的效果只有一个阴影效果,没有阴影的叠加,与直接对阴影进行过渡变化效果一致:

CodePen Demo -- 优化box-shadow动画
总结
以上所述是小编给大家介绍的CSS 阴影动画优化技巧,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
相关内容
- css 之空格处理的方法CSS中的空白效果属性使用小结使用CSS代码的空格实现中文对齐的方法CSS解决无空格的字母、数字过长不自动换行的问题CSS实现段落首行缩进两个字符不再使用空格CSS样式表中继承关系的空格与不空格CSS样式表中继承关系的空格与不空格-CSS教程-网页制作-网页教学网
- CSS3中的display:grid,网格布局介绍js和CSS3实现带详情页面的炫酷网格布局特效CSS Grid 网格布局全解析CSS网格布局的示例代码CSS Grid布局教程之什么是网格布局在CSS网格布局中的列中填充项目的实现方法
- css滚动条样式修改的代码css实现隐藏滚动条并可以滚动内容的实例代码CSS实现导航固定的、左右滑动的滚动条制作方法CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解CSS实现隐藏滚动条并可以滚动内容效果(三种方式)css3 实现滚动条美化效果的实例代码
- 利用css制作3D照片墙效果纯css实现照片墙3D效果的示例代码CSS3制作漂亮的照片墙的实现代码CSS3制作精致的照片墙特效CSS3实现漂亮的照片墙效果的简单实例(推荐)CSS3实现鼠标悬停照片墙放大特效源码纯css3实现照片墙效果CSS3简单实现照片墙CSS3实现的悬挂照片墙效果源码jquery+css3实现非常大气的瀑布流照片墙特效
- 详解CSS盒子塌陷的5种解决方法解决CCS中的margin:top塌陷问题css高度塌陷问题的解决方案浅谈CSS 高度塌陷问题关于清除浮动塌陷的几种方法总结CSS中如何解决外边距塌陷问题
- CSS实现 Google Material Design 文本输入框风格(推荐)CSS实现带箭头的提示框效果【示例代码】纯css实现输入框placeholder动效及输入校验CSS使用placeholder-shown伪类实现输入框浮动文字效果CSS实现让同一行文字和输入框对齐的方法CSS实现输入框的周围高亮效果让边框发亮
- 使用CSS3实现SVG路径描边动画效果入门教程纯CSS3代码实现文字描边简单掌握CSS3将文字描边及填充文字颜色的方法
- CSS ellipsis 与 padding 结合时的问题详解CSS中margin和padding的区别浅析关于CSS Padding那些你意想不到的用法示例css中padding和margin的异同点介绍CSS中属性Padding的参数个数定义及值的设置CSS padding属性定义边内补白CSS3教程:background-clip和background-origin-CSS教程-网页制作-网页
- CSS3 实现footer 固定在底部(无论页面多高始终在底部)CSS3实现固定网页底部半圆(弧形)展开导航特效源码基于jquery+css3的固定的网页底部的炫酷工具条
- scss使用mixin不生效(浏览器无法编译出来)的解决方法详解利用css3的var()实现运行时改变scss的变量值uni-app中使用scss的示例代码手机端用rem+scss做适配的详解前端编码规范(4)—— CSS 和 Sass (SCSS) 开发规范CSS3 真的会替代 SCSS 吗
