原生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 相关文章推荐
JavaScript关于select的相关操作说明
Jan 13 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
Aug 12 Javascript
javascript中的startWith和endWith的几种实现方法
May 07 Javascript
使用JS实现jQuery的addClass, removeClass, hasClass函数功能
Oct 31 Javascript
jQuery实现转动随机数抽奖效果的方法
May 21 Javascript
jQuery+css实现炫目的动态块漂移效果
Jan 28 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
Canvas实现动态的雪花效果
Feb 13 Javascript
JavaScript模块化之使用requireJS按需加载
Apr 12 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
Sep 11 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
Jan 02 Javascript
js实现提交前对列表数据的增删改查
Jan 16 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 变量定义方法
2009/06/14 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
[JS源码]超长文章自动分页(客户端版)
2007/01/09 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
使用mini-define实现前端代码的模块化管理
2014/12/25 Javascript
解决jQuery ajax请求在IE6中莫名中断的问题
2016/06/20 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
nodejs动态创建二维码的方法
2017/08/12 NodeJs
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
解决layer弹出层的内容页点击按钮跳转到新的页面问题
2019/09/14 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
JS表格的动态操作完整示例
2020/01/13 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
计算机专业大学生的自我评价
2013/11/14 职场文书
请假条范文大全
2014/04/10 职场文书
体育运动口号
2014/06/09 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
2015年三好一满意工作总结
2015/07/24 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
详解JAVA的控制语句
2021/11/11 Java/Android
SQL Server一个字符串拆分多行显示或者多行数据合并成一个字符串
2022/05/25 SQL Server