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

来源:3-1 JS缓冲动画

尽吾志者

2015-07-10 20:57

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

写回答 关注

6回答

  • caslly
    2015-12-25 16:29:55

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

  • caslly
    2015-12-25 16:23:55

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


  • 举个栗子233
    2015-10-19 21:40:25

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

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

  • 22不小了
    2015-10-15 22:20:19

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

    慕UI818...

    为什么显示 Uncaught ReferenceError: oDiv is not defined(…)

    2015-12-16 18:46:25

    共 1 条回复 >

  • wengyaqiang
    2015-07-28 15:16:02

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

    wengya...

    明确地说,就是这样的。

    2015-07-28 15:20:23

    共 1 条回复 >

  • wengyaqiang
    2015-07-28 13:57:57

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

JS动画效果

通过本课程JS动画的学习,从简单动画开始,逐步深入各种动画框架封装

113925 学习 · 1443 问题

查看课程

相似问题