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 eval和JSON之间的联系
Dec 31 Javascript
JS运行耗时操作的延时显示方法
Nov 19 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
Jan 26 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
Sep 01 Javascript
简介JavaScript中toTimeString()方法的使用
Jun 12 Javascript
jquery选择器简述
Aug 31 Javascript
详解升级react-router 4 踩坑指南
Aug 14 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
Jan 13 Javascript
详解vue中async-await的使用误区
Dec 05 Javascript
解决Vue中使用keepAlive不缓存问题
Aug 04 Javascript
如何用JavaScipt测网速
May 09 Javascript
React Fragment介绍与使用详解
Nov 11 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一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
JS cookie中文乱码解决方法
2014/01/28 Javascript
js 绑定键盘鼠标事件示例代码
2014/02/12 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
简单的Python的curses库使用教程
2015/04/11 Python
python实现简单的socket server实例
2015/04/29 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python使用多进程运行含有任意个参数的函数
2020/05/02 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
HTML5 FormData 方法介绍以及实现文件上传示例
2017/09/12 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
Shell编程面试题
2016/05/29 面试题
文员个人求职自荐信
2013/09/21 职场文书
11月升旗仪式讲话稿
2014/02/15 职场文书
房地产广告策划方案
2014/05/15 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
灵魂歌王观后感
2015/06/17 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书