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

发布时间 - 2026-01-10 21:57:34    点击率:

本文实例分析了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切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

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


# js  # 多个物体  # 运动  # JavaScript实现多个物体同时运动  # JS实现多物体运动的方法详解  # JS运动改变单物体透明度的方法分析  # JS实现物体带缓冲的间歇运动效果示例  # JS多物体实现缓冲运动效果示例  # javascript多物体运动实现方法分析  # Javascript 多物体运动的实现  # JS实现多物体缓冲运动实例代码  # JS多物体 任意值 链式 缓冲运动  # JS实现多物体运动  # 都是  # 都有  # 让他  # 多个  # 要用  # 能到  # 有一  # 就会  # 还没  # 有个  # 相关内容  # 出了  # 遍历  # 感兴趣  # 他会  # 数据结构  # 给大家  # 这套  # 最简单  # 更多关于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  Thinkphp 中 distinct 的用法解析  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  如何快速搭建二级域名独立网站?  Python面向对象测试方法_mock解析【教程】  php485函数参数是什么意思_php485各参数详细说明【介绍】  Swift中循环语句中的转移语句 break 和 continue  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel storage目录权限问题_Laravel文件写入权限设置  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  javascript中闭包概念与用法深入理解  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  ,网页ppt怎么弄成自己的ppt?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  JS去除重复并统计数量的实现方法  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何使用withoutEvents方法临时禁用模型事件  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  如何撰写建站申请书?关键要点有哪些?  深圳网站制作的公司有哪些,dido官方网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  如何在万网自助建站平台快速创建网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel定时任务怎么设置_Laravel Crontab调度器配置  北京网站制作公司哪家好一点,北京租房网站有哪些?  C语言设计一个闪闪的圣诞树  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  C++用Dijkstra(迪杰斯特拉)算法求最短路径  JavaScript数据类型有哪些_如何准确判断一个变量的类型  如何快速搭建自助建站会员专属系统?  如何快速搭建高效香港服务器网站?  QQ浏览器网页版登录入口 个人中心在线进入  如何将凡科建站内容保存为本地文件?  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  php打包exe后无法访问网络共享_共享权限设置方法【教程】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何有效防御Web建站篡改攻击?  高端云建站费用究竟需要多少预算?  Laravel如何实现数据库事务?(DB Facade示例)  个人网站制作流程图片大全,个人网站如何注销?  详解MySQL数据库的安装与密码配置  JS中对数组元素进行增删改移的方法总结