JS移动dom对象无法停止
代码如下
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
#box{width: 200px;height: 200px;top: 300px;background-color: red;position: absolute}
#deadline{width: 1px;height: 900px;background-color: black;position: absolute;left: 1000px;}
style>
<script>
window.onload = function(){
var BTN = document.getElementById("btn");
BTN.onclick = function(){
Starmove(1000);
}
}
var timer = null;
var Starmove = function(goal){
var BOX = document.getElementById("box");
var speed = (goal - BOX.offsetLeft)/18;
clearInterval(timer);
timer = setInterval(function(){
if(BOX.offsetLeft == goal ){
clearInterval(timer);
}else{
BOX.style.left = BOX.offsetLeft + speed + "px"
}
},30)
}
script>
head>
<body>
<button id="btn">开始运动button>
<div id="box">div>
<span id="deadline">span>
body>
html>
有限2个疑问
1:当var speed = (goal - BOX.offsetLeft)/18;时,为什么box方块会出界?而设置var speed = (goal - BOX.offsetLeft)/8时不会出界?
2:已经设置了
if(BOX.offsetLeft == goal ){
clearInterval(timer);
所以我认为无论给speed设置一个怎样的数字,它都会最终停在目的地,为什么这个当我给speed = 5的时候它不会停止,而是无限运动出界?
除以18 speed会出现浮点数,浮点数四则运算时会有精度丢失问题,导致BOX.offsetLeft == goal不匹配。
除以8 speed为整数,没有精度问题,所以能停止
要改下逻辑,offsetleft大于goal就设置为goal防止浮点数计算精度丢失的问题
timer = setInterval(function () {
var left = BOX.offsetLeft + speed;
if (left > goal) {///////////////////////////
clearInterval(timer);
left = goal;////////
}
BOX.style.left = left + "px"
}, 30)
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!以下答案引用自GPT-3大模型,请合理使用:
修改示例。
1:当speed的值越大,box方块移动速度就越快,而在此例中目标位置goal固定,speed越大会在移动到一定间距时超过goal,从而造成出界。设置speed = (goal - BOX.offsetLeft)/8时,box方块移动速度变慢,则不会出界;
2:在本例中,由于计算的是BOX.offsetLeft的值,因此当BOX.offsetLeft小于goal时,会比goal多移动5px,而当BOX.offsetLeft大于goal时,会比goal少移动5px,故当给speed = 5的时候它不会停止,而是无限运动出界。
解决方法:可以通过在if判断中加入适当的精度调整来解决,如:
if(Math.abs(BOX.offsetLeft - goal) <= 1){
clearInterval(timer);
}else{
BOX.style.left = BOX.offsetLeft + speed + "px"
}
如果我的回答解决了您的问题,请采纳我的回答