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 相关文章推荐
js 鼠标点击事件及其它捕获
Jun 04 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
Jan 12 Javascript
ajax java 实现自动完成功能
Dec 19 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 Javascript
原生javascript模仿win8等待提示圆圈进度条
Apr 24 Javascript
Javascript字符串对象的常用方法简明版
Jun 26 Javascript
jquery验证邮箱格式并显示提交按钮
Nov 07 Javascript
input点击后placeholder中的提示消息消失
Jan 15 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
js中数组常用方法总结(推荐)
Apr 09 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
简单谈谈javascript高级特性
Sep 04 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php版微信开发之接收消息,自动判断及回复相应消息的方法
2016/09/23 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
鼠标右击事件代码(asp.net后台)
2011/01/27 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
Node.js模块全局安装路径配置方法
2018/05/17 Javascript
Vue中登录验证成功后保存token,并每次请求携带并验证token操作
2020/09/08 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
python 简易计算器程序,代码就几行
2009/08/29 Python
Python实现遍历windows所有窗口并输出窗口标题的方法
2015/03/13 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
总结python中pass的作用
2019/02/27 Python
python中的句柄操作的方法示例
2019/06/20 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
如何通过python实现全排列
2020/02/11 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
linux系统都有哪些运行级别
2016/03/26 面试题
介绍一下Java中标识符的命名规则
2014/02/03 面试题
宾馆前台接待岗位职责
2015/04/02 职场文书
MySQL GTID复制的具体使用
2022/05/20 MySQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python