time 0m

time 2m05s

  1. <div id="box" style="width: 100px;height: 100px;background-color: red"></div>
  2. <script !src="">
  3. const element = document.getElementById('box');
  4. let start;
  5. function step(timestamp) {
  6. if (start === undefined)
  7. start = timestamp;
  8. const elapsed = timestamp - start;
  9. //这里使用`Math.min()`确保元素刚好停在 200px 的位置。
  10. element.style.transform = 'translateX(' + Math.min(0.1 * elapsed, 200) + 'px)';
  11. if (elapsed < 2000) { // 在两秒后停止动画
  12. window.requestAnimationFrame(step);
  13. }
  14. }
  15. window.requestAnimationFrame(step);
  16. </script>

分析代码

  1. <div id="box" style="width: 100px;height: 100px;background-color: red"></div>
  2. <script !src="">
  3. const element = document.getElementById('box');
  4. let start;
  5. function step(timestamp) {
  6. /*时间戳*/
  7. // console.log(timestamp);
  8. if (start === undefined){
  9. start = timestamp;
  10. }
  11. /*startstep第一次执行的时间,都是一样的*/
  12. // console.log(start);
  13. /*时间戳在增加,时间戳减去第一次执行的时间,可以得出到底流失了多少时间*/
  14. const elapsed = timestamp - start;
  15. //这里使用`Math.min()`确保元素刚好停在 200px 的位置。
  16. element.style.transform = 'translateX(' + Math.min(0.1 * elapsed, 200) + 'px)';
  17. if (elapsed < 2000) { // 在两秒后停止动画
  18. window.requestAnimationFrame(step);
  19. }
  20. }
  21. /**
  22. * 调用了requestAnimationFrame,会执行step函数
  23. */
  24. window.requestAnimationFrame(step);
  25. // step()//不会运动
  26. </script>

setInterval与requestAnimationFrame

time 13m07s

  1. <div id="box" style="width: 100px;height: 100px;background-color: red"></div>
  2. <script !src="">
  3. const element = document.getElementById('box');
  4. let px = 0;
  5. let t = null;
  6. function step() {
  7. px++;
  8. element.style.transform = 'translateX(' + px + 'px)';
  9. if (px > 200) {
  10. clearInterval(t);
  11. t = null;
  12. }
  13. }
  14. // 刷新率1s刷新60
  15. t = setInterval(step, 1000 / 60);
  16. </script>

time 16m36s

  1. <script !src="">
  2. let t = null,
  3. i = 0,
  4. j = 0;
  5. t = setInterval(() => {
  6. console.log(i++);
  7. }, 1000)
  8. </script>

即使浏览器最小化,在后台,也可以运行

requestAnimationFrame在后台,不可以运行,这样可以节省性能

  1. <script !src="">
  2. let t = null,
  3. i = 0,
  4. j = 0;
  5. t = setInterval(() => {
  6. console.log(i++);
  7. }, 1000);
  8. function step() {
  9. setTimeout(()=>{
  10. window.requestAnimationFrame(step);
  11. console.log('requestAnimationFrame:',j++);
  12. },1000);
  13. }
  14. window.requestAnimationFrame(step);
  15. </script>

image.png

image.png