如何使用less实现随机下雪动画详解


Posted in Javascript onJanuary 02, 2019

前言

元旦在公司撸码,想起圣诞节的摇摇乐项目有段代码挺有意思的,借着空闲的时间把代码抽出来,沉淀下经验。

冬天来了,设计师说摇摇乐的场景需要随机下落的雪花动画,第一时间就想到的方法是canvas比较好,项目非常紧急,然而小程序对canvas支持不够友好,容易在项目中出现无法预估的兼容性问题 ,马上又否定了这种想法,想了想用javascript来写随机动画成本又高。既不用canvas也不用javascript来实现,最终决定使用css预处理器less来实现随机雪花,less怎么可能实现随机雪花?对于喜欢写css的人来说,这非常有趣。

如何使用less实现随机下雪动画详解

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

1.递归调用

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

.snow(@n) when (@n > 0) {

 fn()//生成雪花函数fn()

 .snow((@n - 1));//再次执行函数fn()

}
.snow(60);//执行次数

2.避免编译JavaScript 表达式

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

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

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

left: ~"`Math.round(Math.random() * @{windowWidth})`px";
animation: ~"snowani_@{n} `(-Math.random() * 4 + 8).toFixed(2)`s linear infinite";
transform: ~"scale(`(Math.random() * 0.7 + 0.5).toFixed(2)`)";

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

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

* {
 padding: 0;
 margin: 0;
}
html, body {
 height: 100%;
}

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

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

如何使用less实现随机下雪动画详解

还有HTML,一行代码的事情

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

.snow_wrap>.snow.snow_$*60

如何使用less实现随机下雪动画详解

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
深入理解JavaScript系列(50):Function模式(下篇)
Mar 04 Javascript
JavaScript 表单处理实现代码
Apr 13 Javascript
简介AngularJS中使用factory和service的方法
Jun 17 Javascript
Javascript中的Prototype到底是什么
Feb 16 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
Jan 22 Javascript
微信小程序 扎金花简单实例
Feb 21 Javascript
JavaScript之排序函数_动力节点Java学院整理
Jun 30 Javascript
开发用到的js封装方法(20种)
Oct 12 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
jQuery实现评论模块
Aug 19 jQuery
解决Antd Table表头加Icon和气泡提示的坑
Nov 17 Javascript
React实现todolist功能
Dec 28 Javascript
详解Vue2 添加对scss的支持
Jan 02 #Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
Jan 02 #Javascript
JS中数据结构之栈
Jan 01 #Javascript
微信小程序自定义导航栏
Dec 31 #Javascript
JavaScript ES6中的简写语法总结与使用技巧
Dec 30 #Javascript
JavaScript ES6箭头函数使用指南
Dec 30 #Javascript
JavaScript创建防篡改对象的方法分析
Dec 30 #Javascript
You might like
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
PHP 第二节 数据类型之数值型
2012/04/28 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
Zend Framework教程之响应对象的封装Zend_Controller_Response实例详解
2016/03/07 PHP
PHP反射API示例分享
2016/10/08 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
jQuery实现立体式数字动态增加(animate方法)
2016/12/21 Javascript
js中开关变量使用实例
2017/02/24 Javascript
MUI  Scroll插件的使用详解
2017/04/13 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
[03:14]2014DOTA2西雅图国际邀请赛 EG战队巡礼
2014/07/07 DOTA
Python 字典(Dictionary)操作详解
2014/03/11 Python
Python中__call__用法实例
2014/08/29 Python
python查询sqlite数据表的方法
2015/05/08 Python
python实现简单socket通信的方法
2016/04/19 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
python中用logging实现日志滚动和过期日志删除功能
2019/08/20 Python
Python shutil模块用法实例分析
2019/10/02 Python
python模块常用用法实例详解
2019/10/17 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
2020/03/23 Python
Python实现疫情地图可视化
2021/02/05 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
如何用Lucene索引数据库
2016/02/23 面试题
效能监察建议书
2014/05/19 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
试用期辞职信范文
2015/03/02 职场文书
浅谈golang package中init方法的多处定义及运行顺序问题
2021/05/06 Golang
iSCSI服务器CHAP双向认证配置
2022/04/01 Servers