虚拟dom与直接操作dom

虚拟dom

document.createDocumentFragment()创建虚拟dom,然后再将虚拟dom替换掉原dom

直接操作dom

直接利用innerHTML或者style改变dom结构,频繁操作则会影响性能.

逐帧操作dom

使用window.requestAnimationFrame(),浏览器在下一次重绘之前调用你传入给该方法的函数。回调函数执行次数通常是每秒60次,但在大多数遵循W3C建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配。
window.requestAnimationFrame()执行后会返回一个id,如果要清除该事件则使用cancelAnimationFrame(id)
利用raf实现动画,walking dog

dog.gif

    <div ref="dog"
         class="dog">&#128021;</div>
//raf实现
    let start = 0
    const w = window.innerWidth
    let tr = true
    let _this = this
    const raf = function () {
      if (start > w && tr) {
        tr = false
      }
      if (start < 0 && !tr) {
        tr = true
      }
      if (tr) {
        _this.$refs.dog.style.transform = 'rotateY(180deg)'
        start += 1
      }
      else {
        _this.$refs.dog.style.transform = 'rotateY(360deg)'
        start -= 1
      }
      _this.$refs.dog.style.left = start + 'px'
    }

    let fun = function () {
      raf()
      window.requestAnimationFrame(fun)
    }
    fun()
//animation实现
.dog {
  position: fixed;
  top: 0;
  left: 0;
  transform: rotateY(180deg);
  animation: run 20s linear infinite;//js实现时注释掉改行
}

@keyframes run {
  0% {
    left: 0;
  }
  49% {
    transform: rotateY(180deg);//防止0-50中间旋转
  }
  50% {
    left: 100%;
    transform: rotateY(0);
  }
  99% {
    transform: rotateY(0);//防止50-100中间旋转
  }
  100% {
    left: 0;
  }
}

因为js是逐帧改变,整个过程貌似更加流畅

性能比较

虚拟dom>raf>>直接操作
操作1000个节点,依次用时10s、70s、1200s
documentFragment VS requestAnimationFrame VS Direct DOM Access

performance.gif
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容