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 相关文章推荐
jquery中ajax调用json数据的使用说明
Mar 17 Javascript
很棒的学习jQuery的12个网站推荐
Apr 28 Javascript
解决火狐浏览器下JS setTimeout函数不兼容失效不执行的方法
Nov 14 Javascript
javascript禁用键盘功能键让右击及其他键无效
Oct 09 Javascript
ie8下修改input的type属性报错的解决方法
Sep 16 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
AngularJS中transclude用法详解
Nov 03 Javascript
vue实现列表的添加点击
Dec 29 Javascript
微信小程序实现自定义picker选择器弹窗内容
May 26 Javascript
浅谈Vue render函数在ElementUi中的应用
Sep 06 Javascript
微信小程序12行js代码自己写个滑块功能(推荐)
Jul 15 Javascript
Vue中keep-alive组件的深入理解
Aug 23 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
使用php实现截取指定长度
2013/08/06 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
[08:08]2014DOTA2国际邀请赛中国区预选赛精彩TOPPLAY
2014/06/25 DOTA
Python3 入门教程 简单但比较不错
2009/11/29 Python
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
Python实现动态加载模块、类、函数的方法分析
2017/07/18 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
HTML5中canvas中的beginPath()和closePath()的重要性
2018/08/24 HTML / CSS
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
越南综合购物网站:Lazada越南
2019/06/10 全球购物
初中生学习的自我评价
2013/11/14 职场文书
情况说明书格式范文
2014/05/06 职场文书
房屋产权共有协议书范本
2014/11/03 职场文书
工作简报怎么写
2015/07/21 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
检讨书范文
2019/04/16 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
详解ZABBIX监控ESXI主机的问题
2022/06/21 Servers