原生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 相关文章推荐
ie和firefox不兼容的解决方法集合
Apr 28 Javascript
做好七件事帮你提升jQuery的性能
Feb 06 Javascript
jQuery操作cookie方法实例教程
Nov 25 Javascript
JS自定义对象实现Java中Map对象功能的方法
Jan 20 Javascript
基于javascript实现泡泡大冒险网页版小游戏
Mar 23 Javascript
通过正则表达式获取url中参数的简单实现
Jun 07 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
基于js中的存储键值对以及注意事项介绍
Mar 30 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
Vue动态加载图片在跨域时无法显示的问题及解决方法
Mar 10 Javascript
微信小程序实现拨打电话功能的示例代码
Jun 28 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代码
2007/03/08 PHP
phpMyAdmin 安装教程全攻略
2007/03/19 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
Laravel框架实现简单的学生信息管理平台案例
2019/05/07 PHP
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
JS操作数据库的实例代码
2013/10/17 Javascript
js设置function参数默认值(适合没有传参情况)
2014/02/24 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
修改jquery中dialog的title属性方法(推荐)
2016/08/26 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
浅谈Vue数据绑定的原理
2018/01/08 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
详解Python用三种方式统计词频的方法
2019/07/29 Python
python 实现多维数组(array)排序
2020/02/28 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
英国领先的鞋类零售商:Shoe Zone
2018/12/13 全球购物
2014新年元旦活动策划方案
2014/02/18 职场文书
学习十八大报告感言
2014/02/28 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
2015年志愿者服务工作总结
2015/04/20 职场文书
客户付款通知书
2015/04/23 职场文书
医院见习总结
2015/06/24 职场文书
教师病假条范文
2015/08/17 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
承诺书的内容有哪些,怎么写?
2019/06/21 职场文书
nginx 多个location转发任意请求或访问静态资源文件的实现
2021/03/31 Servers