原生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 相关文章推荐
ext for eclipse插件安装方法
Apr 27 Javascript
javascript json 新手入门文档
Dec 03 Javascript
为jquery的ajaxfileupload增加附加参数的方法
Mar 04 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
简介JavaScript中getUTCMonth()方法的使用
Jun 10 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
jquery实现的回旋滚动效果完整实例【附demo源码下载】
Sep 20 Javascript
JavaScript Ajax实现异步通信
Dec 14 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
Vue-cli 使用json server在本地模拟请求数据的示例代码
Nov 02 Javascript
vue如何截取字符串
May 06 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分页查询的简单实现代码
2017/03/14 PHP
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
2015/11/19 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
使用JS正则表达式 替换括号,尖括号等
2016/11/29 Javascript
JS多文件上传的实例代码
2017/01/11 Javascript
ComboBox(下拉列表框)通过url加载调用远程数据的方法
2017/08/06 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
Python sys.argv用法实例
2015/05/28 Python
Python ftp上传文件
2016/02/13 Python
Python实现线程状态监测简单示例
2018/03/28 Python
Python函数参数操作详解
2018/08/03 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
机械专业个人求职自荐信格式
2013/09/21 职场文书
机电一体化毕业生求职信
2013/11/02 职场文书
《童年》教学反思
2014/02/18 职场文书
大学学生会竞选演讲稿
2014/04/25 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
售后服务质量承诺书
2015/04/29 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
美元符号 $
2022/02/17 杂记
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
Python简易开发之制作计算器
2022/04/28 Python
KVM基础命令详解
2022/04/30 Servers