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下4个跨浏览器必备的函数
Mar 07 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
Aug 23 Javascript
jQuery动态添加删除select项(实现代码)
Sep 03 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
基于jquery实现图片上传本地预览功能
Jan 08 Javascript
easy ui datagrid 从编辑框中获取值的方法
Feb 22 Javascript
jQuery中map函数的两种方式
Apr 07 jQuery
jquery处理checkbox(复选框)是否被选中实例代码
Jun 12 jQuery
react-router4 嵌套路由的使用方法
Jul 24 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
JQuery Ajax跨域调用和非跨域调用问题实例分析
Apr 16 jQuery
js设计模式之代理模式及订阅发布模式实例详解
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
BBS(php &amp; mysql)完整版(三)
2006/10/09 PHP
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP 木马攻击防御技巧
2009/06/13 PHP
php正则表达式(regar expression)
2011/09/10 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
下拉框select的绑定示例
2014/09/04 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
JS验证逗号隔开可以是中文字母数字
2016/04/22 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
vue组件name的作用小结
2018/05/23 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
Vue组件化开发之通用型弹出框的实现
2020/02/28 Javascript
vue-cli设置publicPath小记
2020/04/14 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
详解Python中的各种函数的使用
2015/05/24 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
pandas带有重复索引操作方法
2018/06/08 Python
python装饰器原理与用法深入详解
2019/12/19 Python
详解Django配置JWT认证方式
2020/05/09 Python
Python 添加文件注释和函数注释操作
2020/08/09 Python
HTML5中使用json对象的实例代码
2018/09/10 HTML / CSS
荷兰电脑专场:Paradigit
2018/05/05 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
优秀中专生推荐信
2013/11/17 职场文书
博士学位自我鉴定范文
2013/12/26 职场文书
质量承诺书范文
2014/03/27 职场文书
本溪关门山导游词
2015/02/09 职场文书
世界红十字日活动总结
2015/02/10 职场文书
开展警示教育活动总结
2015/05/09 职场文书