当前位置: 首页 > 科技观察

CSS一步步实现烟花动画

时间:2023-03-19 18:05:20 科技观察

项目之前需要制作一个烟花动画,要求是随机大小,出现在不同的地方,先来看看效果:更进一步,还可以实现五颜六色的效果,如下1.如何选择合适的动画场景决定了使用什么样的动画。比如对于一些轻量级、装饰性的动画,CSS动画就足够了,而对于一些对动画要求高的运营活动和创意游戏,JS动画绝对是首选。如果需要,还需要一些图形库,比如Pixi。js。其次,你还需要考虑学习成本。一般来说,CSS更容易上手,上手成本也更低。如果本地需要稍微复杂的动画效果,可以直接引用已有的库,如Animate.css[1]。JS可能更复杂。原生JS没问题。如果是另外一个图形库,需要面对完全不同的API,这是一个学习成本。最后,还需要考虑工程。比如lottie-web本身就已经很大了(532k,压缩后150k,gzip后43k)。另外,设计导出的动画json文件也会很大。仅仅为了一个动画就引入整个lottie是不划算的。应该是另一种方式。综合考虑,可以用CSS2来实现烟花动画。单个烟花的实现这里我们可以通过序列帧来实现。比如我会要求设计师导出一组序列帧图片,像这样,然后把这些图片按顺序组合起来(很多工具都可以合成),得到这样的图片预览。接下来,只需要使用CSS动画函数中的steps()[2]函数符号就可以完成逐帧动画假设如下HTML结构

CSS实现为.fireworks{位置:绝对;宽度:150px;高度:150px;background:url('https://imgservices-1252317822.image.myqcloud.com/image/081320210201435/e9951400.png')右上不重复;背景大小:自动150px;动画:烟花1ssteps(24)infinite;}@keyframesfireworks{to{background-position:100%;}}效果如下:Kapture2021-08-21at10.49.073.随机位置的烟花现在烟花每次出现的位置都是一样的是的,太规则了就不那么自然了,那么如何实现在这里呆一会儿和在那里呆一会儿的效果?这里可以再添加一个关键帧,随意改变几个位置(不一定要真的随机,只要看起来不那么规则即可)。@keyframesrandom{25%{transform:translate(200%,50%);}.fireworks{/*other*/animation:fireworks1ssteps(24)infinite,random4sinfinite;}transform:translate(80%,80%);}75%{转换:翻译(20%,60%);}}.fireworks{/*Other*/animation:fireworks1ssteps(24)infinite,random4sinfinite;}然后把两个动画结合起来:.fireworks{/*Others*/animation:fireworks1ssteps(24)infinite,random4sinfinite;}效果如下:是不是奇怪的动画?原因是改变位置的时候有一个平滑的过渡,所以这个地方还需要加上steps(),注意这里只需要steps(1),意思是直接跳到指定的key结束流程frame,no途中会自动创建额外的帧。.fireworks{/*Other*/animation:fireworks1ssteps(24)infinite,random4ssteps(1)infinite;}效果如下:这样是不是更自然?4.随机大小的烟花有随机位置。现在添加一些大小变化,只需将比例添加到位置变化即可。@keyframesrandom{25%{transform:translate(200%,50%)scale(0.8);}50%{transform:translate(80%,80%)scale(1.2);}75%{transform:translate(20%,60%)scale(0.65);}}效果如下:这样一个位置随机,大小随机的烟花就完成了。会有4个不同的位置,所以不需要太多的HTML结构就可以给每个位置一个不同的位置
>
效果如下:4个一起出现,太整齐了,需要加点延时动画-delayStagger发生时间这样就得到了文章开头的效果:完整代码可以通过cssfireworks访问(codepen.io)[3]六、五彩缤纷的烟花设计同学觉得白色有点太单调了,想换个颜色,比如黄色?既然我们已经做了一帧帧图片序列,不可能生成一组黄色烟花的图片,那么问题来了,如何通过CSS改变颜色?这里就得用到CSSMask[4]了,前面关于Mask的文章已经介绍了很多实用案例,这里就不多介绍了,对mask不熟悉的可以参考本客栈讲故事:CSSmaskCSS3mask/masks详细介绍?张欣旭-欣空间-欣生活(zhangxinxu.com)[5]只需稍作修改,使用原有背景作为蒙版背景,如下.fireworks{/*其他样式*/background:#FFEFAD;-webkit-mask:url('https://imgservices-1252317822.image.myqcloud.com/image/081320210201435/e9951400.png')右上角不重复;-webkit-mask-size:auto150px;}@keyframesfireworks{to{-webkit-mask-position:100%;}}效果如下:进一步可以添加颜色变化动画,比如黄色→红色→紫色→蓝色,然后定义一个关键帧}.fireworks{/*otherstyles*/animation:fireworks2ssteps(24)infinite,random8ssteps(1)infinite,random_color1sinfinite;}@keyframesrandom_color{0%{background-color:#ffefad;}25%{背景颜色:#ffadad;}50%{背景颜色:#aeadff;}75%{背景颜色:#adffd9;}}可以得到如下效果:变彩色了吗?完整代码可以通过CSSfireworkscolors(codepen.io)[6]7.IE下降级处理现代浏览器基础支持mask屏蔽,但是IE不支持,所以在IE下变成这样:因此,IE它需要降级,不需要五颜六色,只需要随意绽放。那么如何区分IE浏览器和现代浏览器呢?其实可以使用一些IE不支持的选择器,比如:default.fireworks{background:url('https://imgservices-1252317822.image.myqcloud.com/image/081320210201435/e9951400.png')对吧顶部不重复;background-size:auto150px;}/*以下现代浏览器支持*/_:default,.fireworks{-webkit-mask:url('https://imgservices-1252317822.image.myqcloud.com/image/081320210201435/e9951400.png')右上角不重复;-webkit-mask-size:auto150px;}八、动画和用户体验适当的动画可以提升用户体验,但并不是所有的用户都喜欢动画,尤其是一些装饰性的动画可能会觉得花哨是的,可能是分散注意力,可能是为了省电,甚至有些动画可能会对用户造成不良反应。因此,应该把选择权交给用户,如果用户觉得没有必要,可以直接关闭系统中的动画。当前大多数操作系统都可以在Windows10中关闭不必要的动画:设置>轻松访问>显示>在Windows中显示动画。在Windows7中:控制面板>轻松访问>让您的计算机更易于查看>关闭不必要的动画。在MacOS中:系统偏好设置>辅助功能>显示>减少运动。在iOS上:设置>通用>辅助功能>减少运动。在Android9+上:设置>辅助功能>移除动画。相应地,在CSS中,媒体查询prefers-reduced-motion[7]可以用来检测系统是否开启了动画缩减功能。因此,您可以添加另一段CSS:@mediascreenand(prefers-reduced-motion){/*禁用不必要的动画*/.fireworks{animation:none;}}效果如下(这里以macOS为例):可以看到,勾选“减弱动态效果”后,烟花动画会完全消失。虽然没有什么技术含量,但是照顾了部分人的感受,不知不觉中提升了用户体验。为什么不这样做呢?九。总结与解释以上介绍了烟花动画实现的全过程。可以看出,从简单到复杂,动画是一步步组合叠加的。这里简单总结一下选择合适的动画实现方式CSS序列帧动画实现关键是步骤可以将多个动画组合成一个新的动画。改变图形的颜色可以用遮罩来实现。IE和现代浏览器可以使用:default来区分。需要按照系统设置关闭动画。可以使用媒体查询prefers-reduced-motionCSS来实现,并不复杂,大部分同学应该都能很快上手,但是要做到完美并不容易,还有一些提升用户体验的小技巧.如果您觉得还不错,如果对您有帮助,请点赞,收藏,转发???