requestAnimationFrame

2021-05-15  本文已影响0人  my木子

用 JS 实现一个循环的动画

// html
 <div id="box"></div>
// css
    #box {
      width: 100px;
      height: 100px;
      background: red;
      position: absolute;
      left: 0;
      top: 0;
      zoom: 1;
    }

定时器实现

    let box = document.getElementById("box");
    let flag = true;
    let left = 0;
    let t = null;

    function render() {
      if (flag == true) {
        if (left >= 100) {
          flag = false;
        }
        box.style.left = ` ${left++}px`;
      } else {
        if (left <= 0) {
          flag = true;
          clearInterval(t);
        }
        box.style.left = ` ${left--}px`;
      }
    };

    t = setInterval(function () {
      render()
    }, 1000 / 60);

requestAnimationFrame

    let box = document.getElementById("box");
    let flag = true;
    let left = 0;
    let t = null;

    function render() {
      if (flag == true) {
        if (left >= 100) {
          flag = false
        }
        box.style.left = ` ${left++}px`
      } else {
        if (left <= 0) {
          flag = true
        }
        box.style.left = ` ${left--}px`
      }
    };

    function animationLoop(time) {
      render();
      raf = requestAnimationFrame(animationLoop);
      if (left < 0) {
        cancelAnimationFrame(raf);
      }
    };
    animationLoop();

渲染十万条数据

    let ul = document.querySelector('ul');
    const total = 1000;
    let raf;

    // 分段渲染
    const once = 20;  // 一次渲染的条数
    const loopCount = total / once; // 全部渲染完需要的次数
    let countHasRender = 0;  //  已经渲染的次数
    let num = 0;  // 渲染条数

    function add() {
      // 创建虚拟节点,使用 createDocumentFragment 不会触发渲染
      const fragment = document.createDocumentFragment();
      for (let i = 0; i < once; i++) {
        const li = document.createElement('li');
        li.innerText = num++;
        fragment.appendChild(li);
      };
      ul.appendChild(fragment);
      countHasRender++;
      loop();
    };

    function loop() {
      if (countHasRender < loopCount) {
        raf = requestAnimationFrame(add);
      } else {
        cancelAnimationFrame(raf);
      }
    };

    add();
上一篇 下一篇

猜你喜欢

热点阅读