原生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 相关文章推荐
Dojo之路:如何利用Dojo实现Drag and Drop效果
Apr 10 Javascript
JS加ASP二级域名转向的代码
May 17 Javascript
Js注册协议倒计时的小例子
Jun 24 Javascript
Javascript连接多个数组不用concat来解决
Mar 24 Javascript
JS与jQuery实现隔行变色的方法
Sep 09 Javascript
jQuery简单实现遍历单选框的方法
Mar 06 Javascript
angular十大常见问题
Mar 07 Javascript
Mongoose实现虚拟字段查询的方法详解
Aug 15 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
vue.js的computed,filter,get,set的用法及区别详解
Mar 08 Javascript
iView框架问题整理小结
Oct 16 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 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实现选择排序的解决方法
2013/05/04 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
有道JavaScript监听浏览器的问题
2010/06/23 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
浅谈javascript中createElement事件
2014/12/05 Javascript
使用javascript实现监控视频播放并打印日志
2015/01/05 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
使用ngrok+express解决本地环境中微信接口调试问题
2018/02/26 Javascript
解决vue 中 echart 在子组件中只显示一次的问题
2018/08/07 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
网易微博Web App用HTML5开发的过程介绍
2012/06/13 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
京东全球售:直邮香港,澳门,台湾,美国,澳大利亚等地区
2017/09/24 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
Sneaker Studio匈牙利:购买运动鞋
2018/03/26 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
华三通信H3C面试题
2015/05/15 面试题
活动总结报告格式
2014/05/09 职场文书
出租车拒载检讨书
2015/01/28 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
试用期解除劳动合同通知书
2015/04/16 职场文书