js运动原理

运动基础

在js中,让一个元素动起来的最简单的方式,就是点击按钮,让元素移动。下面是一个简单的案例:(下面几个案例的的html和css都是采用这个为例)

<!DOCTYPE html>
<html lang="zh">
<head>
<title></title>
<style>
#d1 {
width: 100px;
height: 100px;
background-color: red;
position: absolute;
top:100px;
left:200px;
}
</style>
</head>
<body>
<button id="btn">点击移动</button>
<div id="d1"></div>
</body>
</html>

当点击按钮之后,让一个元素动起来,并且当偏移量(元素到达页面左界的具体)达到500px时停止移动。

// 需求分析:点击按钮,让div动起来
// 获取元素
let oBtn = document.getElementById("btn");
let oDiv = document.getElementById("d1");
// 声明一个变量用来储存计时器
let iTimer = null;
// 点击按钮元素一直运动
oBtn.onclick = function(){
iTimer = setInterval(function(){
// 点击按钮之后,让元素的位置在当前的基础上每次增加10px,
//当移动距离达到500时停止运动
if(oDiv.offsetLeft === 500){
// 当元素的左偏移量(元素距离页面窗口左边的距离)===500px时,停止移动
clearInterval(iTimer);
}else{
oDiv.style.left = oDiv.offsetLeft + 10 + "px";
}
},30);
};

在上面的代码中,存在两个非常严重的问题

  • 多次点击按钮时,速度会越来越快
  • 当每次移动的距离不能被500整除时,元素将不会停止

    我们先来解决第一个问题(第二个问题在运动的封装中进行详细讲解):

    为什么速度会越来越快?原因是每点击一次按钮,就会触发一次单击事件,计时器就会发生累加,导致元素的移动速度越来越快。

    解决方法:在每次开始运动之前先清除一次定时器。
oBtn.onclick = function(){
clearInterval(iTimer);
iTimer = setInterval(function(){}

(只需要在计时器之前加一句清除计时器,其它代码与上面完全一样,不再进行重复)

总结:让一个元素动起来的基本流程是什么?下面做一个简单总结:

  • 问题的:匀速运动的元素没有办法进行在不整除的情况下在临界点停止

    (下一篇博客中的运动的封装会解决此问题)
  • 上述代码中,整个过程大致分为三个步骤:
    • 清除定时器,确保只有一个定时器在执行
    • 开启定时器
    • 开始运动。但必须判断停止条件。

(因内容较多,会分开多次进行。从浅到深,徐徐渐进)

最新文章

  1. 怎么解决tomcat占用8080端口问题
  2. BZOJ 2683 简单题 ——CDQ分治
  3. SQL 常识
  4. 最小圆覆盖(Smallest Enclosing Discs)
  5. 封装NPOI导出含下拉列表的Excel
  6. android 自定义按钮的外边框
  7. android requestWindowFeature使用详解
  8. 公众号第三方平台开发-aes解密失败
  9. vue-router路由参数刷新消失的问题
  10. Linux下如何高效删除一个几十G的文本文件的最后一行或几行
  11. MySQL时间差返回月个数
  12. hdu 5517 Triple(二维树状数组)
  13. pythonのdjango初体验
  14. ftp的主动模式和被动模式的配置和区别
  15. 初试Python语法小试牛刀之冒泡排序
  16. centos6.10搭建ELK之elasticsearch6.5.4
  17. Python paramiko ssh 在同一个session里run多个命令
  18. bzoj千题计划257:bzoj4199: [Noi2015]品酒大会
  19. AJAX跨域请求json数据的实现方法
  20. CentOS禁用笔记本touchpad

热门文章

  1. [Python] 通过采集23万条数据,对《哪吒》影评分析
  2. CF EDU 1101D GCD Counting 树形DP + 质因子分解
  3. POJ - 1741 - Tree - 点分治 模板
  4. 杭电多校第十场 hdu6432 Cyclic 打表找规律
  5. hdu 5969 最大的位或(贪心)
  6. 杭电2018暑假多校第一场 D Distinct Values hdu6301 贪心
  7. 跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由
  8. 深入SpringMVC视图解析器
  9. 009 Python基本图形绘制
  10. IDEA新建一个最简单的Maven的JavaWeb项目