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 16 Javascript
js获取IFRAME当前的URL的方法
Nov 13 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 Javascript
原生js实现addclass,removeclass,toggleclasss实例
Nov 24 Javascript
微信小程序 下拉列表的实现实例代码
Mar 08 Javascript
深入理解vue路由的使用
Mar 24 Javascript
JS/jquery实现一个网页内同时调用多个倒计时的方法
Apr 27 jQuery
从组件封装看Vue的作用域插槽的实现
Feb 12 Javascript
详解JavaScript中精度失准问题及解决方法
Feb 04 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
May 31 Javascript
基于JS实现操作成功之后自动跳转页面
Sep 25 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
PHP与MySQL交互使用详解
2006/10/09 PHP
php htmlspecialchars加强版
2010/02/16 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
去掉destoon资讯内容页keywords关键字自带的文章标题的方法
2014/08/21 PHP
基于PHP制作验证码
2016/10/12 PHP
PHP读取Excel类文件
2017/05/15 PHP
JavaScript 常用函数库详解
2009/10/21 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
jquery如何根据值设置默认的选中项
2014/03/17 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
javascript实现一个简单的弹出窗
2016/02/22 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
Angular如何由模板生成DOM树的方法
2019/12/23 Javascript
linux下安装easy_install的方法
2013/02/10 Python
python根据出生日期获得年龄的方法
2015/03/31 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
解决pandas中读取中文名称的csv文件报错的问题
2018/07/04 Python
python调用百度REST API实现语音识别
2018/08/30 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
利用python实现.dcm格式图像转为.jpg格式
2020/01/13 Python
Python异常处理机制结构实例解析
2020/07/23 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
Charlotte Tilbury美国官网:英国美妆品牌
2017/10/13 全球购物
乌克兰香水和化妆品网站:Notino.ua
2018/03/26 全球购物
GoPro摄像机美国官网:美国运动相机厂商
2018/07/03 全球购物
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
实习鉴定评语
2014/01/19 职场文书
2015年中秋节演讲稿
2015/03/20 职场文书
只需要这一行代码就能让python计算速度提高十倍
2021/05/24 Python
阿里云日志过滤器配置日志服务
2022/04/09 Servers