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 相关文章推荐
JScript的条件编译
May 29 Javascript
一些javascript一些题目的解析
Dec 25 Javascript
网页打开自动最大化的js代码
Aug 22 Javascript
JQuery结合CSS操作打印样式的方法
Dec 24 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
Feb 15 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
May 24 Javascript
JavaScript正则表达式和级联效果
Sep 14 Javascript
浅谈js的解析顺序 作用域 严格模式
Oct 23 Javascript
js实现控制文件拖拽并获取拖拽内容功能
Feb 17 Javascript
vue element-ui table表格滚动加载方法
Mar 02 Javascript
vue2.0 实现富文本编辑器功能
May 26 Javascript
ES6函数实现排它两种写法解析
May 13 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/02 无线电
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP时间处理类操作示例
2018/09/05 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
基于jquery的一个图片hover的插件
2010/04/24 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
jquery实现相册一下滑动两次的方法
2015/02/09 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
jQuery插件pagewalkthrough实现引导页效果
2015/07/05 Javascript
javascript将DOM节点添加到文档的方法实例分析
2015/08/04 Javascript
轻松掌握JavaScript策略模式
2016/08/25 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
jQuery插件ajaxFileUpload使用详解
2017/01/10 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
2020/07/18 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Python下rrdtool模块的基本使用方法
2015/11/13 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
Python django框架开发发布会签到系统(web开发)
2020/02/12 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
Under Armour瑞典官方网站:美国高端运动科技品牌
2018/11/21 全球购物
美国轮胎网站:Priority Tire
2018/11/28 全球购物
工厂保洁员岗位职责
2013/12/04 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
自主招生英文自荐信
2015/03/25 职场文书
毕业生自我鉴定范文
2019/05/13 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle