栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > Web开发 > JavaScript

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

JavaScript 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

window.onload=function(){
  var aDiv=document.getElementsByTagName("div");
  var timer=null;
  var i;
  for(i=0;i0?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切换特效与技巧总结》、《Javascript查找算法技巧总结》、《Javascript动画特效与技巧汇总》、《Javascript错误与调试技巧总结》、《Javascript数据结构与算法技巧总结》、《Javascript遍历算法与技巧总结》及《Javascript数学运算用法总结》

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/91724.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号