JS实现匀速与减速缓慢运动的动画效果封装示例


Posted in Javascript onAugust 27, 2018

本文实例讲述了JS实现匀速与减速缓慢运动的动画效果。分享给大家供大家参考,具体如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>3water.com JS匀速/减速运动</title>
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    .box1 {
      width: 100px;
      height: 100px;
      background-color: pink;
      margin-top: 10px;
      position: relative;
    }
    .box2 {
      width: 100px;
      height: 100px;
      background-color: red;
      margin-top: 10px;
      position: relative;
    }
  </style>
</head>
<body>
<button>匀速移动</button>
<button>减速移动</button>
<div class="box1" ></div>
<div class="box2" ></div>
<script>
  // 动画原理 = 盒子位置 + 步长。
  //   1.闪动。 (瞬间到达)
  //   2.匀速。 (每次走一样距离)
  //   3.缓动。 (开始特快越走越慢,步长越来越小)
  //        (类似刹车,电梯停止,压缩弹簧...)
  // 好处:
  //   1.有非常逼真的缓动效果,实现的动画效果更细腻。
  //   2.如果不清除定时器,物体永远跟着目标在移动。
  var box1 = document.getElementsByClassName("box1")[0];
  var box2 = document.getElementsByClassName("box2")[0];
  var but1 = document.getElementsByTagName("button")[0];
  var but2 = document.getElementsByTagName("button")[1];
  console.log(box1.offsetLeft);
  but1.onclick = function () {
    animate1(box1,200);
  }
  but2.onclick = function () {
    animate2(box2,500);
  }
  //匀速动画
  function animate1(ele,target){
    //要用定时器,先清除定时器
    //一个盒子只能有一个定时器,这样儿的话,不会和其他盒子出现定时器冲突
    //而定时器本身讲成为盒子的一个属性
    clearInterval(ele.timer);
    //我们要求盒子既能向前又能向后,那么我们的步长就得有正有负
    //目标值如果大于当前值取正,目标值如果小于当前值取负
    var speed = target>ele.offsetLeft?3:-3;
    ele.timer = setInterval(function () {
      //在执行之前就获取当前值和目标值之差
      var val = target - ele.offsetLeft;
      ele.style.left = ele.offsetLeft + speed + "px";
      //目标值和当前值只差如果小于步长,那么就不能在前进了
      //因为步长有正有负,所有转换成绝对值来比较
      if(Math.abs(val)<=Math.abs(speed)){
        ele.style.left = target + "px";
        clearInterval(ele.timer);
      }
    },30)
  }
  //缓动动画封装
  function animate2(ele,target) {
    clearInterval(ele.timer); //清楚历史定时器
    ele.timer = setInterval(function () {
      //获取步长 确定移动方向(正负值) 步长应该是越来越小的,缓动的算法。
      var step = (target-ele.offsetLeft)/10;
      //对步长进行二次加工(大于0向上取整,小于0项下取整)
      step = step>0?Math.ceil(step):Math.floor(step);
      //动画原理: 目标位置 = 当前位置 + 步长
      console.log(step);
      ele.style.left = ele.offsetLeft + step + "px";
      //检测缓动动画有没有停止
      if(Math.abs(target-ele.offsetLeft)<=Math.abs(step)){
        ele.style.left = target + "px"; //直接移动指定位置
        clearInterval(ele.timer);
      }
    },30);
  }
</script>
</body>
</html>

这里使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun,可得到如下运行效果:

JS实现匀速与减速缓慢运动的动画效果封装示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JQuery获取浏览器窗口内容部分高度的代码
Feb 24 Javascript
js 浏览本地文件夹系统示例代码
Oct 24 Javascript
jQuery 删除或是清空某个HTML元素示例
Aug 04 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
Jan 18 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
javascript实现的左右无缝滚动效果
Sep 19 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
EasyUI中的dataGrid的行内编辑
Jun 22 Javascript
javascript 日期相减-在线教程(附代码)
Aug 17 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
Sep 12 Javascript
微信小程序图片选择区域裁剪实现方法
Dec 02 Javascript
学习使用ExpressJS 4.0中的新Router的用法
Nov 06 Javascript
vue展示dicom文件医疗系统的实现代码
Aug 27 #Javascript
vue中子组件的methods中获取到props中的值方法
Aug 27 #Javascript
最适应的vue.js的form提交涉及多种插件【推荐】
Aug 27 #Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 #Javascript
vue.js中toast用法及使用toast弹框的实例代码
Aug 27 #Javascript
对Vue- 动态元素属性及v-bind和v-model的区别详解
Aug 27 #Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
Aug 27 #Javascript
You might like
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
JavaScript中Hoisting详解 (变量提升与函数声明提升)
2017/08/18 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
微信内置开发 iOS修改键盘换行为搜索的解决方案
2019/11/06 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
详解Vue之事件处理
2020/07/10 Javascript
Python的Flask框架中实现登录用户的个人资料和头像的教程
2015/04/20 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
使用anaconda的pip安装第三方python包的操作步骤
2018/06/11 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
python剪切视频与合并视频的实现
2020/03/03 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
使用Python实现音频双通道分离
2020/12/25 Python
Bluebella德国官网:英国性感内衣和睡衣品牌
2019/11/08 全球购物
银行业务授权委托书
2014/10/10 职场文书
2015年社区工作总结
2015/04/08 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
期中考试后的感想
2015/08/07 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
Redis Stream类型的使用详解
2021/11/11 Redis