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 相关文章推荐
用javascript获取地址栏参数
Dec 22 Javascript
js 创建快捷方式的代码(fso)
Nov 19 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
Mar 28 Javascript
浅谈jquery回调函数callback的使用
Jan 30 Javascript
JavaScript中用getDate()方法返回指定日期的教程
Jun 09 Javascript
jQuery学习之DOM节点的插入方法总结
Jan 22 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
jquery获取transform里的值实现方法
Dec 12 jQuery
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
Mar 10 Javascript
quickjs 封装 JavaScript 沙箱详情
Nov 02 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
sphinx增量索引的一个问题
2011/06/14 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
浅析php数据类型转换
2014/01/09 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
Javascript模块模式分析
2008/05/16 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
从阶乘函数对比Javascript和C#的异同
2012/05/31 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
javascript获取四位数字或者字母的随机数
2015/01/09 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
vue通过watch对input做字数限定的方法
2017/07/13 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
Vue实现拖放排序功能的实例代码
2019/07/08 Javascript
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
在 Python 中使用 7zip 备份文件的操作
2020/12/11 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
后勤人员自我评价怎么写
2013/09/19 职场文书
百度吧主申请感言
2014/01/12 职场文书
白血病捐款倡议书
2014/05/14 职场文书
节电标语大全
2014/06/23 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL