原生JS实现萤火虫效果


Posted in Javascript onMarch 07, 2020

本文实例为大家分享了JS实现萤火虫效果的具体代码,供大家参考,具体内容如下

上代码之前,先看一下效果:

原生JS实现萤火虫效果

CSS部分(此处用元素模拟萤火虫,背景可自行设置):

<style>
 .box{width: 4px;height: 5px;background: wheat;position: absolute;border-radius: 50%;}
 body{background: url(../img/bg.jpg) ;}
</style>

JS部分:

<script>
class Glowworm{
 constructor(){
 // 获取屏幕的可视区域的宽高,用作将来的随机范围
 this.clientW = document.documentElement.clientWidth;
 this.clientH = document.documentElement.clientHeight;
 // 假设萤火虫的宽高
 this.w = 20;
 this.h = 20;
 }
 createEle(){
 var div = document.createElement("div");
 div.className = "box";
 document.body.appendChild(div);
 // 在创建元素之前一定得先生成随机坐标
 div.style.left = this.x + "px";
 div.style.top = this.y + "px";
 // 元素创建好之后,立即运动
 this.move(div);
 }
 randomPos(){
 // 随机生成坐标
 this.x = random(0,this.clientW - this.w);
 this.y = random(0,this.clientH - this.h);
 }
 move(ele){
 // 开始运动之前,还得随机生成目标
 this.randomPos();
 // 开始运动
 move(ele,{
  left:this.x,
  top:this.y
 },()=>{
  // 一个动画结束后,重复开启当前动画,即可
  this.move(ele);
 })
 }
}

for(var i=0;i<60;i++){
 // 先得到实例
 var g = new Glowworm();
 // 生成随机坐标
 g.randomPos();
 // 再创建元素
 g.createEle();
}

function random(a,b){
 return Math.round(Math.random()*(a-b)+b);
}
</script>

最后需要引入一个运动函数:
原生JS封装:带有px的css属性、透明度、且可以运动的函数。

function move(ele,obj,cb){
 clearInterval(ele.t);
 ele.t = setInterval(() => {
 var i = true;
 for(var attr in obj){
  if(attr == "opacity"){
  var iNow = getStyle(ele,attr) * 100;
  }else{
  var iNow = parseInt(getStyle(ele,attr));
  }
  let speed = (obj[attr] - iNow)/10;
  speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
  // 只要有一个属性没到目标:绝对不能清除计时器
  if(iNow !== obj[attr]){
  i = false;
  }
  if(attr == "opacity"){
  ele.style.opacity = (iNow + speed)/100;
  }else{
  ele.style[attr] = iNow + speed + "px";
  }
 }
 if(i){
  clearInterval(ele.t);
  if(cb){
  cb();
  }
  // cb && cb();
 }
 }, 30);
}

function getStyle(ele,attr){
 if(ele.currentStyle){
 return ele.currentStyle[attr];
 }else{
 return getComputedStyle(ele,false)[attr];
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS 有名函数表达式全面解析
Mar 19 Javascript
javascript中的关于类型转换的性能优化
Dec 14 Javascript
详解JavaScript中undefined与null的区别
Mar 29 Javascript
JavaScript将XML转成JSON的方法
Mar 12 Javascript
JavaScript实现表格点击排序的方法
May 11 Javascript
日常收藏的jquery技巧
Dec 02 Javascript
Web开发使用Angular实现用户密码强度判别的方法
Sep 27 Javascript
Javascript网页抢红包外挂实现分享
Jan 11 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
用node开发并发布一个cli工具的方法步骤
Jan 03 Javascript
js设置默认时间跨度过程详解
Jul 17 Javascript
node删除、复制文件或文件夹示例代码
Aug 13 Javascript
JavaScript实现轮播图片完整代码
Mar 07 #Javascript
JS实现瀑布流效果
Mar 07 #Javascript
Vue中使用better-scroll实现轮播图组件
Mar 07 #Javascript
JavaScript实现栈结构Stack过程详解
Mar 07 #Javascript
node创建Vue项目步骤详解
Mar 06 #Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
Mar 06 #Javascript
小程序跳转H5页面的方法步骤
Mar 06 #Javascript
You might like
一组PHP加密解密函数分享
2014/06/05 PHP
PHP中使用asort进行中文排序失效的问题处理
2014/08/18 PHP
PHP快速排序算法实现的原理及代码详解
2019/04/03 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
Angular2库初探
2017/03/01 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
JS中的变量作用域(console版)
2020/07/18 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
VUE和Antv G6实现在线拓扑图编辑操作
2020/10/28 Javascript
[58:11]守擂赛第二周擂主赛 DeMonsTer vs Leopard
2020/04/28 DOTA
python实现的用于搜索文件并进行内容替换的类实例
2015/06/28 Python
Python面向对象编程基础实例分析
2020/01/17 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
为什么python比较流行
2020/06/19 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
Numpy(Pandas)删除全为零的列的方法
2020/09/11 Python
HTML5+CSS3:3D展示商品信息示例
2017/01/03 HTML / CSS
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
童装店创业计划书
2014/01/09 职场文书
2014年统战工作总结
2014/12/09 职场文书
大明湖导游词
2015/02/03 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
python 实现的截屏工具
2021/05/08 Python
ant design vue的form表单取值方法
2022/06/01 Vue.js