为了账号安全,请及时绑定邮箱和手机立即绑定

关于speed = speed>0?Math.ceil(speed):Math.floor(speed);代码的问题。

为什么在speed>0时,要选择Math.ceil(speed),在speed<0时,要选择Math.floor(speed)呢?我在这个demo中,只是使用Math.floor(speed),没有任何问题啊。。。。。求老师给予解答,谢谢!!

正在回答

6 回答

而是卡在了-19px那里,不再动了。肉眼看上去没问题,是因为当鼠标移出的时候定时器被关闭。程序不会报错,但其实逻辑已经错了。如果说定时器是一个循环体的话,程序显然在鼠标移入的时候进入了死循环。

0 回复 有任何疑惑可以回复我~

想问一下楼主的speed公式是跟老师一样吗?老师的公式是:speed=(iTarget-oDiv.offsetLeft)/20. 当鼠标移入触发onmouseover事件的时候,offsetLeft=-19时,speed=0;则oDiv.style.left不会再变化,即offsetLeft也不会再变,那么此时,定时器的if判断oDiv.offsetLeft==iTarget等式永远不成立,定时器不会被关闭,而且oDiv的offsetLeft并没有等于0,也就是说oDiv这个模块并没有被完全移出


0 回复 有任何疑惑可以回复我~

刚刚测试了一下,说下我的理解。

首先明白一点:为什么会出现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;

3 回复 有任何疑惑可以回复我~

(iTarget-context.offsetLeft)/20 分子在无线变小趋近于零却不会等于零 其整体(iTarget-context.offsetLeft)/20 无线接近零,而不是等于零,Math把他清零,关闭定时器 如果不用math定时器一直在跑,只是速度趋近零,肉眼看不到而已。 可以自己做一个测试在控制台打印出console.log(oDiv.offsetLeft==iTarget) 即使加了Math定时器也不一定停止

0 回复 有任何疑惑可以回复我~
#1

慕UI8183041

为什么显示 Uncaught ReferenceError: oDiv is not defined(…)
2015-12-16 回复 有任何疑惑可以回复我~

我现在的观点是,在speed>0时,在speed减小到0<speed<1的阶段,如果使用了Math.floor,那么speed就变成0了,那么Left就没办法达到0,而使用Math.ceil,在speed减小到0<speed<1的阶段,speed值就是取1,那么Left就能继续移动直到达到0。

4 回复 有任何疑惑可以回复我~
#1

wengyaqiang

明确地说,就是这样的。
2015-07-28 回复 有任何疑惑可以回复我~

在speed>0时,如果用Math.floor(speed),Left没办法达到0……至于原因我也想知道!

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于speed = speed>0?Math.ceil(speed):Math.floor(speed);代码的问题。

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信