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 相关文章推荐
让您的菜单不离网站
Oct 03 Javascript
javascript对象之内置对象Math使用方法
Apr 16 Javascript
treepanel动态加载数据实现代码
Dec 15 Javascript
现代 JavaScript 开发编程风格Idiomatic.js指南中文版
May 28 Javascript
javascript实现图像循环明暗变化的方法
Feb 25 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
原生JS下拉加载插件分享
Dec 26 Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 Javascript
vue实现的下拉框功能示例
Jan 29 Javascript
JavaScript如何实现元素全排列实例代码
May 14 Javascript
js数组的基本使用总结
Jan 18 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脚本的10个技巧(6)
2006/10/09 PHP
php 用sock技术发送邮件的函数
2007/07/21 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
TopList标签和JavaScript结合两例
2007/08/12 Javascript
javascript 控制 html元素 显示/隐藏实现代码
2009/09/01 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
最流行的Node.js精简型和全栈型开发框架介绍
2015/02/26 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
ES6 Object属性新的写法实例小结
2019/06/25 Javascript
微信小程序自定义组件实现环形进度条
2020/11/17 Javascript
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python获取linux主机ip的简单实现方法
2016/04/18 Python
python连接数据库的方法
2017/10/19 Python
Python实现上下班抢个顺风单脚本
2018/02/07 Python
pandas DataFrame数据转为list的方法
2018/04/11 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
小学科学教学反思
2014/01/26 职场文书
2014年人事科工作总结
2014/11/19 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
公司员工违法违章行为检讨书
2019/06/24 职场文书
MySQL 常见的数据表设计误区汇总
2021/06/07 MySQL
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android