JS实现多物体运动的方法详解


Posted in Javascript onJanuary 23, 2018

本文实例分析了JS实现多物体运动的方法。分享给大家供大家参考,具体如下:

基本步骤

1.通过getElementsByTagName获取到要做多物体运动的元素
2.然后for循环遍历元素,添加事件
3.定义startMove函数,需要两个参数,当前“做运动”的元素,和目标值target

注意问题:在多物体运动中,所有的东西不能公用;

<script>
    window.onload = function(){
      var liTags = document.getElementsByTagName('li'); // 第一步
      for(var i=0;i<liTags.length;i++){ // 第二步
         liTags[i].onmouseover = function () {
         startMove(this,400);
         }
         liTags[i].onmouseout = function () {
         startMove(this,200);
         }
      }
    }
    var timer = null;
    function startMove(obj,iTarget) { // 第三步,2个参数
      clearInterval(timer);
      timer = setInterval(function () {
        var iSpeed = (iTarget - obj.offsetWidth)/10;
        iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);// 缓冲运动注意取整处理
        if(obj.offsetWidth == iTarget){
          clearInterval(timer);
        }else{
          obj.style.width = obj.offsetWidth+iSpeed+'px';
        }
      },30);
    }
</script>

问题:

当移入移出速度比较快的时候,就会出现有的li回不到原来的样子,卡在半路了;这是因为所有的li公用了一个定时器造成的;

当鼠标移入第一个li时,调用startMove开启一个定时器;鼠标移除li时,也需要开启一个定时器让li回到原来的位置,li走到半路上,我们移入第二个li,首先会清除定时器,这时候第一个li就卡到半路了。

JS实现多物体运动的方法详解

解决这个问题:让每个li拥有自己的timer去控制他们的变化,在for循环的时候,给每个里定义自己的一个timer

liTags[i].timer = null;// 给每个li都添加一个timer

接着在starMove里面每次用的定时器都是当前li 自己的,就不会互相干扰了。

这里由之前的timer变成了obj.timer (当前对象自己的timer);到这里就没问题了。

完整代码如下:

<body>
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>
</body>

加点样式:

<style>
    ul{list-style: none;}
    ul li{
      margin: 10px;
      width: 200px;height: 50px;
      background: lightblue;
    }
</style>

完整js代码

<script>
    window.onload = function(){
      var liTags = document.getElementsByTagName('li');
      for(var i=0;i<liTags.length;i++){
         liTags[i].timer = null;// 给每个li都添加一个timer
         liTags[i].onmouseover = function () {
         startMove(this,400);
         }
         liTags[i].onmouseout = function () {
         startMove(this,200);
         }
      }
    }
    function startMove(obj,iTarget) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
        var iSpeed = (iTarget - obj.offsetWidth)/10;
        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);
    }
</script>

接着在看一个例子:多物体运动-改变透明度

<script>
  window.onload = function () {
    var aImgs = document.getElementsByTagName('img');
    for(var i=0;i<aImgs.length;i++){
      aImgs[i].timer = null;
      aImgs[i].alpha = 100; // 把公用的alpha改成每个img对象都有的属性
      aImgs[i].onmouseover = function () {
        startMove(this,30);
      }
      aImgs[i].onmouseout = function () {
        startMove(this,100);
      }
    }
  }
  // var alpha = 100; 这里alpha在多物体运动里 不能公用
  function startMove(obj,iTarget) {
    clearInterval(obj.timer);
    var iSpeed = (iTarget - obj.alpha)/10;
      iSpeed = iSpeed>0 ? Math.ceil(iSpeed): Math.floor(iSpeed);
    obj.timer = setInterval(function(){
      if(obj.alpha == iTarget){
        clearInterval(obj.timer);
      }else{
        obj.alpha += iSpeed;
        obj.style.opacity =obj.alpha/100;
        obj.style.filter = 'alpha(opacity:'+obj.alpha+')';
      }
    },30);
  }
</script>

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

Javascript 相关文章推荐
JavaScript去除空格的几种方法
Oct 03 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
Jul 17 Javascript
js计算精度问题小结
Apr 22 Javascript
JS截取url中问号后面参数的值信息
Apr 29 Javascript
jQuery中append()方法用法实例
Dec 25 Javascript
jquery模拟进度条实现方法
Aug 03 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
Oct 30 Javascript
Bootstrap每天必学之滚动监听
Mar 16 Javascript
json的使用小结
Jun 08 Javascript
JavaScript事件学习小结(三)js事件对象
Jun 09 Javascript
vue组件之间通信方式实例总结【8种方式】
Feb 22 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 Javascript
JS运动改变单物体透明度的方法分析
Jan 23 #Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 #Javascript
基于vue cli重构多页面脚手架过程详解
Jan 23 #Javascript
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
Jan 23 #Javascript
实时监控input框,实现输入框与下拉框联动的实例
Jan 23 #Javascript
从parcel.js打包出错到选择nvm的全部过程
Jan 23 #Javascript
浅谈vue项目重构技术要点和总结
Jan 23 #Javascript
You might like
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
php实现设计模式中的单例模式详解
2014/10/11 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
JavaScript 拖拉缩放效果
2008/12/10 Javascript
javascript手工制作悬浮菜单
2015/02/12 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
QQ登录背景闪动效果附效果演示源码下载
2015/09/22 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
Vue2.0使用过程常见的一些问题总结学习
2017/04/10 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
JS面向对象编程基础篇(二) 封装操作实例详解
2020/03/03 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
Python实战购物车项目的实现参考
2019/02/20 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
英国领先的游戏零售商:GAME
2019/09/24 全球购物
C#软件工程师英语面试题
2015/06/07 面试题
电子专业毕业生自荐信
2014/05/25 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
电气工程师岗位职责
2015/02/12 职场文书
公司放假通知范文
2015/04/14 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
详解Python中下划线的5种含义
2021/07/15 Python