调用window.requestAnimationFrame(step);传入一个回调函数,回调函数接收到一个动画触发时间,在回调函数里可以再次调用window.requestAnimationFrame(step);
    它是一个宏任务,但是相较于其他平行宏任务的执行时间不确定

    1. <body>
    2. <div id="box"></div>
    3. <button onclick="handleToggle()">toggle</button>
    4. <script>
    5. const element = document.getElementById('box');
    6. let start;
    7. let r = true
    8. function handleToggle() {
    9. r = !r
    10. console.log(r);
    11. }
    12. function step(timestamp) {
    13. if (start === undefined)
    14. start = timestamp;
    15. const elapsed = timestamp - start;
    16. //这里使用`Math.min()`确保元素刚好停在 200px 的位置。
    17. element.style.transform = `rotate(${elapsed * 1}deg)`
    18. // element.style.transform = 'translateX(' + Math.min(0.1 * elapsed, 200) + 'px)';
    19. // if (elapsed < 2000) { // 在两秒后停止动画
    20. // window.requestAnimationFrame(step);
    21. // }
    22. if (r) {
    23. window.requestAnimationFrame(step);
    24. }
    25. }
    26. window.requestAnimationFrame(step);
    27. </script>
    28. </body>