使用less实现随机下雪动画

前端之家收集整理的这篇文章主要介绍了使用less实现随机下雪动画前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

元旦在公司撸码,想起圣诞节的摇摇乐项目有段代码挺有意思的,借着空闲的时间把代码抽出来,沉淀下经验。
冬天来了,设计师说摇摇乐的场景需要随机下落的雪花动画,第一时间就想到的方法是canvas比较好,项目非常紧急,然而小程序对canvas支持不够友好,容易在项目中出现无法预估的,马上又否定了这种想法,想了想用javascript来写随机动画成本又高。既不用canvas也不用javascript来实现,最终决定使用css预处理器less来实现随机雪花,less怎么可能实现随机雪花?对于喜欢写css的人来说,这非常有趣。

上图的雪花效果还蛮炫酷吧,怎么实现呢?因为有以下的2个特点,可以尝试使用它来实现我们的场景

1.递归调用

实际上less并没有自带类似javascript的for循环的功能,但less可以用过引导when来实现条件判断,简单的方法也可以让聪明的程序员简单实现递归调用

0) {fn()//<a href="https://www.jb51.cc/tag/shengcheng/" target="_blank" class="keywords">生成</a>雪花<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>fn() .snow((@n - 1));//再次执行<a href="https://www.jb51.cc/tag/hanshu/" target="_blank" class="keywords">函数</a>fn()

}<span style="color: #800000;">
.snow(60);//执行次数

2.避免编译JavaScript 表达式

雪花需要生成随机数,我们需要运用javascript表达式嵌入到less代码,同时也要避免javascript表达式被less错误的编译,我们需要了解两个点。

  1. 一些 LESS不认识的专有语法,可以在字符串前加上一个 ~,
  2. JavaScript 表达式在less 文件中使用,可以通过反引号的方式使用

于是有了如下随机位移、随机时间、随机大小的代码

{}{}

于是有了如下的Less代码,具体怎么实现请留意详细的代码注释

以下less代码使用构建后可生产一份随机css固定雪花文件,决定了每一个雪花有不同的大小、水平位移、垂直位移、出场位置、出场时间,不同的雪花大小,不同的下落速度,用肉眼看到的雪花就像是随机的,可以在项目上线前尝试多构建几次,得到一份均匀分布在窗口的随机雪花。

{:;:; }{:; }//浏览器窗口宽度
@windowWidth: 750;
//雪花
.snow
{<span style="color: #ff0000;">
&wrap{
position
:<span style="color: #0000ff;"> relative
;<span style="color: #ff0000;">
width
:<span style="color: #0000ff;"> ~"@{windowWidth
}<span style="color: #800000;">px";
height: 100%;
overflow: hidden;
background: rgba(14,99,69,1);
margin: 0 auto;
}
//雪花初始化大小
position: absolute;
width:20px;
height: 20px;
&:after
{<span style="color: #ff0000;">
content
:<span style="color: #0000ff;"> ''
;<span style="color: #ff0000;">
position
:<span style="color: #0000ff;"> absolute;<span style="color: #ff0000;">
left:<span style="color: #0000ff;">0;<span style="color: #ff0000;">
top:<span style="color: #0000ff;">0;<span style="color: #ff0000;">
width:<span style="color: #0000ff;">20px;<span style="color: #ff0000;">
height:<span style="color: #0000ff;"> 20px;<span style="color: #ff0000;">
background-color:<span style="color: #0000ff;">#fff;<span style="color: #ff0000;">
opacity:<span style="color: #0000ff;">1;<span style="color: #ff0000;">
border-radius:<span style="color: #0000ff;"> 100%;<span style="color: #ff0000;">
filter:<span style="color: #0000ff;">blur(5px);<span style="color: #ff0000;">//此处使用css3滤镜来画雪花
}<span style="color: #800000;">
}
//随机雪花函数
.snow(@n) when (@n > 0) {<span style="color: #ff0000;">
.snow
@{n}{<span style="color: #ff0000;">
//水平方向上的位移
left:<span style="color: #0000ff;"> ~"Math.round(Math.random() * @{windowWidth</span>}<span style="color: #800000;"&gt;)px";
//动画运行时间8~12秒,保证雪花有不同的移动速度
animation: ~"snowani_@{<span style="color: #ff0000;">n}<span style="color: #800000;"> (-Math.random() * 4 + 8).toFixed(2)s linear infinite";
//动画提前出场时间,也就是垂直方向上位移
animation-delay: ~"(-Math.random() * 8 + 0.2).toFixed(2)s";
&:after{<span style="color: #ff0000;">
//雪花大小随机,0.5~1.2
transform:<span style="color: #0000ff;"> ~"scale((Math.random() * 0.7 + 0.5).toFixed(2))";
}<span style="color: #800000;">
}
@keyframes ~"snowani_@{<span style="color: #ff0000;">n}<span style="color: #800000;">" {<span style="color: #ff0000;">
0%{
transform:<span style="color: #0000ff;"> translateY(0);
}<span style="color: #800000;">
100%{<span style="color: #ff0000;">
//垂直方向上高度,保证雪花有不同的移动速度
transform:<span style="color: #0000ff;"> ~"translateY(Math.round(Math.random() * 200 + 1600)px)";
}<span style="color: #800000;">
}
.snow((@n - 1));
}
.snow(60);//生成雪花的数量

把上面的雪花的代码构建后如下:

还有HTML,一行代码的事情

在编辑器中安装好emmet或webstorm开启emmet后,输入下面代码按下ctrl+e快捷键即可生成60个不同命名的雪花标签

.snow.snow_$*60

软件开发没有银弹,不要让经验固化了我们的思维,相信还有更多更好的实现方式,来提升我们的开发效率。

新年第一弹,新的开始,猪大家元旦快乐,抽中摇摇乐免单,身体健康,大吉大利。

原文链接:https://www.f2er.com/html5/66588.html

猜你在找的HTML5相关文章