热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

单方向指定时间内的匀速运动

回忆匀速运动:ykx+b;这里的各参数表示的含义:k:其实是速度,总路程总时间x:表示经过的时间b:表示一开始所在的位置y:表示当经过的时间是x的时候,走过的路程用函数表示

 回忆匀速运动:
 y = kx + b;
这里的各参数表示的含义:
k:其实是速度,总路程/总时间
x:表示经过的时间
b:表示一开始所在的位置
y:表示当经过的时间是x的时候,走过的路程

用函数表示

  /**
   * @param    {[type]}   start   [开始位置]
   * @param    {[type]}   alter   [改变的距离]
   * @param    {[type]}   curTime [已运行的时间]
   * @param    {[type]}   dur     [总时间]
   * @return   {[type]}           [返回当前时间的所在位置]
   */
  function linear(start, alter, curTime, dur) {
    return start + alter / dur * curTime;
  }

现在想让一个盒子用500ms从left=10匀速运动到20.
这里有一个问题,就是如果500ms的时候,对应的距离大于20,那么则调整为等于20

先把准备工作做好

  var start = 10,
    target = 20,
    dur = 500;
  var alter = target - start,
    curTime = 0;
  var y = 0;
  // interval  影响curTime值
  var interval = 11;

然后用两种定时方式实现

setInterval:

  var timer = window.setInterval(animate, interval);
  function animate () {
      curTime += interval;
      y = linear(start, alter, curTime, dur);
      console.log(y);
      if (y >= target) {
          y = target;
          box.style.left = y + "px";
          window.clearInterval(timer);
          timer = null;
          return;
      }
      box.style.left = y + "px";
  }

 

setTimeout:

  var timer = window.setTimeout(animate, interval);
  function animate () {
      window.clearTimeout(timer);
      curTime += interval;
      y = linear(start, alter, curTime, dur);
      console.log(y);
      if (y >= target) {
          y = target;
          box.style.left = y + "px";
          timer = null;
          return;
      }
      box.style.left = y + "px";
      timer = window.setTimeout(animate, interval);
  }

但是因为setInterval有累积效应,所以为了更好的效果,一般用setTimeout ,如上述代码看到的,学会将setInterval转化为setTimeout

(回调函数第一行加清除,最后一行加启动)

以下只写setTimeout

html结构 和 css样式

 


 

 

贴下全部代码




  
  
  



  

 索性将这一套变成定义成方法,这样单方向的匀速运动基本都能用了

 




  
  
  



  

 以上情况只是 target>start,那么包含小于和等于的情况,对于最终的animate

  function animate() {
    window.clearTimeout(timer);
    way = way || linear;
    y = way(start, alter, curTime, dur);
    // 这里开始判断target和start的大小
    if (target = start) {
      return;
    }
    if (target > start) {
      curTime += interval;
      y >= target && afterTarget();
    } else if (target > start) {
      curTime -= interval;
      y <= target && afterTarget();
    } else {
      return;
    }

    console.log(y);
    // 超出范围之后,清除定时器,重置属性
    function afterTarget() {
      y = target;
      // 加单位,这里默认加px,如果是别的,加第二个参数即可
      ele.style[attr] = addPx(y);
      timer = null;
      return;
    }

    ele.style[attr] = addPx(y);
    timer = window.setTimeout(animate, interval);
  }

 


推荐阅读
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 如何在HTML中获取鼠标的当前位置
    本文介绍了在HTML中获取鼠标当前位置的三种方法,分别是相对于屏幕的位置、相对于窗口的位置以及考虑了页面滚动因素的位置。通过这些方法可以准确获取鼠标的坐标信息。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 本文介绍了一种解决PyQt界面在高分辨率下字体显示不完全的方法。通过设置High_DPI属性或应用自适应字体,可以解决在更高分辨率电脑上字体被控件遮挡的问题。同时,还提供了判断Qt版本和设置字体大小的代码示例。 ... [详细]
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
author-avatar
情人有意_119
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有