尽吾志者
2015-07-10 20:57
为什么在speed>0时,要选择Math.ceil(speed),在speed<0时,要选择Math.floor(speed)呢?我在这个demo中,只是使用Math.floor(speed),没有任何问题啊。。。。。求老师给予解答,谢谢!!
而是卡在了-19px那里,不再动了。肉眼看上去没问题,是因为当鼠标移出的时候定时器被关闭。程序不会报错,但其实逻辑已经错了。如果说定时器是一个循环体的话,程序显然在鼠标移入的时候进入了死循环。
想问一下楼主的speed公式是跟老师一样吗?老师的公式是:speed=(iTarget-oDiv.offsetLeft)/20. 当鼠标移入触发onmouseover事件的时候,offsetLeft=-19时,speed=0;则oDiv.style.left不会再变化,即offsetLeft也不会再变,那么此时,定时器的if判断oDiv.offsetLeft==iTarget等式永远不成立,定时器不会被关闭,而且oDiv的offsetLeft并没有等于0,也就是说oDiv这个模块并没有被完全移出
刚刚测试了一下,说下我的理解。
首先明白一点:为什么会出现left = -190.5/…,这种小数,是因为speed的值为小数。
oDiv.style.left = oDiv.offsetLeft + speed + 'px';
【使用Math方法,不管是向上取整ceil(),还是向下取整floor(),都是为了去整,不让left值出现小数】。
其次:在一次一次执行
var speed = (iT - oDiv.offsetLeft)/20;
这句代码时,speed的值会越来越小,最后无限接近与0。
最后:再来看这句代码
speed = speed>0?Math.ceil(speed):Math.floor(speed);
假设:1、speed>0 ----> speed = 0.5;执行后 speed = Math.ceil(0.5) = 1;
left = oDivoffsetLeft + 1;注意这里直接加了1,而不是0.5或是下一轮会更小的speed(0.25/0.025等)
2、 speed<0 ----> speed = -0.5;执行后 speed = Math.floor(0.5) = -1;
left = oDivoffsetLeft - 1;注意这里直接减了1,而不是0.5或是下一轮会更小的speed(0.25/0.025等)
所以,我认为,向上去整还是向下去整都是为了,让left的改变更加的快刀斩乱麻,不会造成无限趋近于0/-200,却永远变不成0/-200;
(iTarget-context.offsetLeft)/20 分子在无线变小趋近于零却不会等于零 其整体(iTarget-context.offsetLeft)/20 无线接近零,而不是等于零,Math把他清零,关闭定时器 如果不用math定时器一直在跑,只是速度趋近零,肉眼看不到而已。 可以自己做一个测试在控制台打印出console.log(oDiv.offsetLeft==iTarget) 即使加了Math定时器也不一定停止
我现在的观点是,在speed>0时,在speed减小到0<speed<1的阶段,如果使用了Math.floor,那么speed就变成0了,那么Left就没办法达到0,而使用Math.ceil,在speed减小到0<speed<1的阶段,speed值就是取1,那么Left就能继续移动直到达到0。
在speed>0时,如果用Math.floor(speed),Left没办法达到0……至于原因我也想知道!
JS动画效果
113925 学习 · 1443 问题
相似问题