js多个物体运动功能实例分析


Posted in Javascript onDecember 20, 2016

本文实例分析了js实现的多个物体运动功能。分享给大家供大家参考,具体如下:

js多个物体运动功能实例分析

与单个的区别:得知道哪个在动,所以运动函数需要两个参数,出了目标iTarget之外,还要obj。另外需要多个计数器,否则当一个还没运动完就移入另一个物体会发生卡壳

window.onload=function(){
  var aDiv=document.getElementsByTagName("div");
  var timer=null;
  var i;
  for(i=0;i<aDiv.length;i++){
    aDiv[i].timer=null;
    aDiv[i].onmouseover=function(){
      startMove(this,300);
    };
    aDiv[i].onmouseout=function(){
      startMove(this,100);
    };
  }
  function startMove(obj,iTarget){
    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
      var iSpeed=(iTarget-obj.offsetWidth)/8;
      iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);  //凡是要用缓冲运动,肯定缺不了取整,为了让他能到目的点(不然无法完全贴合)
      if(obj.offsetWidth==iTarget){
        clearInterval(obj.timer);
      }
      else{
        obj.style.width=obj.offsetWidth+iSpeed+'px';
      }
    },30);
  };
};

注:多物体运动,所有东西都不能公用

属性与运动对象绑定:速度、其他属性值(如透明度等)

offsetWidth、offsetHeight、offsetLeft、offsetHeight都有一个bug,拿offsetWidth举例,他除了width还包括padding和border,比如div宽度为100,还有一像素边框,现在让div运动,div.style.width=div.offsetWidth-1+'px',没有边框的的情况下他会一直缩小直到消失,有边框的情况。width:100px,offsetWidth:102px >>>>>width:101px,offsetWidth:103px,会使得他不断变大

解决办法:

用 currentStyle  div.style.width=parseInt(getStyle(div,'width'))-1+'px'   getStyle是自己封装好的获取样式的函数,里面包括currentStyle方法。parseInt解析字符串返回整数。

扩展(任意值变化):

用同一套运动框架使得一个物体变宽,一个变高,一一个透明度变化

window.onload=function(){
  var aDiv=document.getElementsByTagName("div");
  var timer=null;
  aDiv[0].onmouseover=function(){
    startMove(this,'width',300);
  };
  aDiv[0].onmouseout=function(){
    startMove(this,'width',100);
  };
  function getStyle(obj,attr){
    if(obj.currentStyle){
      return obj.currentStyle[attr];
    }
    else{
      return getComputedStyle(obj,false)[attr];
    }
  };
  function startMove(obj,attr,iTarget){
    clearInterval(obj.timer);
    obj.timer=setInterval(function(){
      var iCur=parseInt(getStyle(obj,attr));
      var iSpeed=(iTarget-iCur)/8;
      iSpeed=iSpeed>0?Math.ceil(iSpeed):Math.floor(iSpeed);  //凡是要用缓冲运动,肯定缺不了取整,为了让他能到目的点(不然无法完全贴合)
      if(iCur==iTarget){
        clearInterval(obj.timer);
      }
      else{
        obj.style[attr]=iCur+iSpeed+'px';
      }
    },30);
  };
};

这套运动框架还有个问题,透明度没支持

1.

var iCur=parseInt(getStyle(obj,attr));

opacity取到的都是零点几,parseInt取整,所以opacity永远是0,应改为

if(attr=='opacity'){
  var iCur=parseFloat(getStyle(obj,attr))*100;  //为了其他程序不用修改,这里统一乘100
}
else{
  var iCur=parseInt(getStyle(obj,attr));
}

2.

obj.style[attr]=iCur+iSpeed+'px';

按现在写法就是

aDiv.style.opacity=50px;

应改为

if(attr=='opacity'){
  obj.style.filter='alpha(opacity:'+(iCur+iSpeed)+')';
  obj.style.opacity=(iCur+iSpeed)/100;
}
else{
  obj.style[attr]=iCur+iSpeed+'px'
}

3.计算机内部,都是模拟的来存储小数,不是实际来存储,最简单的例子

alert(0.07*100);  //输出并不是7,而是7.0000...001,不止7,很多数字(小数)都有问题

所以var iCur=parseFloat(getStyle(obj,attr))*100;就会出问题(会闪烁),解决方法就是避免使用小数

var iCur=parseInt(parseFloat(getStyle(obj,attr))*100);

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery中文入门指南,翻译加实例,jQuery的起点教程
Jan 13 Javascript
javascript 面向对象编程  function是方法(函数)
Sep 17 Javascript
js 函数调用模式小结
Dec 26 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
JavaScript作用域链示例分享
May 27 Javascript
JavaScript实现对下拉列表值进行排序的方法
Jul 15 Javascript
基于jQuery实现二级下拉菜单效果
Feb 01 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
Jul 25 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
Nov 09 Javascript
浅谈Javascript中的Label语句
Dec 14 Javascript
Webpack中雪碧图插件使用详解
May 25 Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 Javascript
JS高级运动实例分析
Dec 20 #Javascript
CSS+jQuery实现简单的折叠菜单
Dec 20 #Javascript
jQuery常见的选择器及用法介绍
Dec 20 #Javascript
JS基于面向对象实现的选项卡效果示例
Dec 20 #Javascript
解决Angular.Js与Django标签冲突的方案
Dec 20 #Javascript
AngularJS 在同一个界面启动多个ng-app应用模块详解
Dec 20 #Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 #Javascript
You might like
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
destoon网站转移服务器后搜索汉字出现乱码的解决方法
2014/06/21 PHP
php生成过去100年下拉列表的方法
2015/07/20 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
ExtJs3.0中Store添加 baseParams 的Bug
2010/03/10 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
Egret引擎开发指南之发布项目
2014/09/03 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
jQuery dataTables与jQuery UI 对话框dialog的使用教程
2016/09/02 Javascript
微信小程序 wx.request(接口调用方式)详解及实例
2016/11/23 Javascript
微信小程序日历/日期选择插件使用方法详解
2018/12/28 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
Python实现的HTTP并发测试完整示例
2020/04/23 Python
使用python为mysql实现restful接口
2018/01/05 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
tensorflow常用函数API介绍
2020/04/19 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
财务人员求职自荐书范文
2014/02/10 职场文书
目标责任书范本
2014/04/16 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
2014公安机关纪律作风整顿思想汇报
2014/09/13 职场文书
运动会开幕词
2015/01/28 职场文书
教师节大会主持词
2015/07/06 职场文书
TensorFlow的自动求导原理分析
2021/05/26 Python
优化Mysql查询的示例
2022/04/26 MySQL