在学习js缓慢动画的时候,对于算法:步长为正数时,向上取整Math.ceil(step);步长为负数时向下取整Math.floor(step),对于这个取整的逻辑没有明白,自己动手操作了下
<body>
<div></div>
<span></span>
<button>点击</button>
<script>
var div = document.querySelector('div');
var button = document.querySelector('button');
//var span = document.querySelector('span');
button.addEventListener('click',function(){
animate(div,200);
});
function animate(obj,target){
clearInterval(obj.timer);
obj.timer = setInterval(function(){
var step = ( target - obj.offsetLeft ) / 10;
console.log('step--'+step);
console.log("offsetLeft--"+obj.offsetLeft);
if(obj.offsetLeft >= target){
clearInterval(obj.timer);
}
console.log(obj.style.left);
obj.style.left = obj.offsetLeft + step + "px";
},30)
}
</script>
</body>
执行之后的结果:
1.
div的移动距离并没有达到预期的目标距离200px。
2.
定时器并没有被清除,但是div却停止了运动。
百度查询了下,总结为:
1.将left与offsetLeft打印出来会发现offsetLeft会四舍五入,导致当offsetLeft为196时,200-196=4,4*0.1=0.4,196+0.4=196.4四舍五入后又是196,会无限循环下去导致移动距离一直达不到目标距离。
2.四舍五入使得小于0.5就相当于0,如果步长是正数的话,向下取整会造成后面的步长减到小于1时,之后的值都为0,所以还是会产生定位位置的误差(移动距离小于目标位置大小)。如果向上取整会将后面的小于1的步长都变成1,再慢慢的填到target,直到移动距离等于目标位置。
所以我理解的是步长为正向上取整,步长为负向下取整都是避免步长为0,导致移动距离小于目标位置大小。
参考文章链接1
参考文章链接2
相关文章
暂无评论...