如何使用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 相关文章推荐
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
Dec 08 Javascript
将光标定位于输入框最右侧实现代码
Dec 04 Javascript
用js获取电脑信息(是使用与IE浏览器)
Jan 15 Javascript
jquery提交form表单时禁止重复提交的方法
Feb 13 Javascript
详解JavaScript中的构造器Constructor模式
Jan 14 Javascript
js鼠标跟随运动效果
Mar 11 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
Aug 07 Javascript
vue3.0中使用postcss-pxtorem的具体方法
Nov 20 Javascript
vue如何实现动态加载脚本
Feb 05 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
May 01 Javascript
微信小程序抽奖组件的使用步骤
Jan 11 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
php实现word转html的方法
2016/01/22 PHP
PHP实现JS中escape与unescape的方法
2016/07/11 PHP
PHP常用函数之根据生日计算年龄功能示例
2019/10/21 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
windows下更新npm和node的方法
2017/11/30 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
Django中利用filter与simple_tag为前端自定义函数的实现方法
2017/06/15 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
pygame实现简易飞机大战
2018/09/11 Python
Django使用AJAX调用自己写的API接口的方法
2019/03/06 Python
python实时检测键盘输入函数的示例
2019/07/17 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
浅谈Django前端后端值传递问题
2020/07/15 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
中学劳技课教师的自我评价
2014/02/05 职场文书
家长通知书家长评语
2014/04/17 职场文书
员工保密承诺书
2014/05/28 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
校园新闻稿范文
2015/07/18 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书