让小球做圆周运动你有几种方法?

Javascript方法

方法: requestAnimationFrame + Dom
我们来到了JavaScript环节,通过万能的JS我们只需要掌握一点点数学知识和定时器知识即可实现我们的小球运动啦~
这里实现时有2个需要注意的点:

实现动画播放时,为什么用requestAnimationFrame不用setInterval?
改变圆的位置时,为什么不直接修改top和left,而是要修改transform?

问题1: 实现动画播放时,为什么用requestAnimationFrame不用setInterval?
为了保证动画运行流畅性,我们需要尽量保持动画的播放帧率大于等于60Hz,即1000 / 60 = 16.67ms播放一次动画,requestAnimationFrame和setInterval都可以控制动画渲染的间隔。
但是,setInterval本身是基于时间来设置,它仅仅是将需要执行的事件定期插入到需要执行的队列中,不管,前面的事件是否已经执行了。因此,可能存在多次定时器之间的间隔可能小于我们设定的值,导致动画执行过快或者直接跳帧。
而requestAnimationFrame则是告知浏览器在刷新下一帧时需要执行那些函数。确保我们的动画的播放帧率和屏幕的刷新帧率一致。
问题2: 改变圆的位置时,为什么不直接修改top和left,而是要修改transform?
直接修改top和left会触发浏览器的重排和重绘,而修改tranform仅仅会触发重绘。而频繁的重排对动画性能影响极大,具体原因大家可以百度一下浏览器 重排 重绘,相关的文章非常多。
另外想要查看自己的页面是否触发了重排、重绘,大家可以借助chrome的rendering面板来查看
在这里插入图片描述
说了这么多,我们来看一下使用requestAnimationFrame怎么实现圆周运动的动画,具体实现代码如下:
html:

<div class="container">
    <div id="ball" class="ball"></div>
</div>

javascript:

let $ball = document.querySelector('#ball');
let angle = 0;
let getPosition = ((centerX, centerY, radius) => {
    return (angle) => {
        return {
            x: +centerX + Math.cos(angle) * radius,
            y: +centerY + Math.sin(angle) * radius,
        };
    };
})(275, 275, 275);

run();

function run() {
    // 角度加1
    angle += 1;
    let position = getPosition((angle * Math.PI) / 180);
    $ball.style.transform = `translate(${position.x}px, ${position.y}px)`;
    window.requestAnimationFrame(run);
}

在这里插入图片描述
方法5: requestAnimationFrame + canvas
除了通过Dom来控制元素之外,我们还可以通过canvas直接在页面上画圆。canvas做动画的原理就是快速的重复“擦除->移动位置画圆”的这个步骤。这里就不解释为啥了,直接上代码
具体实现代码如下:
html:

<div class="container">
    <canvas id="canvas" width="600px" height="600px"></canvas>
</div>

javascript:

let angle = 0;
let getPosition = ((centerX, centerY, radius) => {
    return (angle) => {
        return {
            x: +centerX + Math.cos(angle) * radius,
            y: +centerY + Math.sin(angle) * radius,
        };
    };
})(300, 300, 275);

let $canvas = document.querySelector('#canvas');
let ctx = $canvas.getContext('2d');
// 设置填充色
ctx.fillStyle = 'coral';

run();

function run() {
    angle += 1;
    let position = getPosition((angle * Math.PI) / 180);

    //清空画布
    ctx.clearRect(0, 0, 600, 600);
    ctx.beginPath();
    // 画圆
    ctx.arc(position.x, position.y, 25, 0, 2 * Math.PI, true);
    //填充
    ctx.fill();
    ctx.closePath();

    window.requestAnimationFrame(run);
}

在这里插入图片描述
好啦,收工,这里就是我能想到的让小球做圆周运动的 javascript 的方法。

如果还有别的方法可以留言交流一下,一起涨涨姿势啦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值