长列表优化

173 阅读1分钟

1. 什么是虚拟列表

长列表优化一般采用虚拟列表。在页面上创建一个容器作为可视区,在这个可视区内展示长列表中的一部分,也就是在可视区渲染列表。

虚拟列表简单模拟

<body>
  <div id="container" style="height:150px; overflow:auto">
    <ul id="list"></ul>
    <div id="content-placeholder"></div>
  </div>
</body>
<script>
  const ITEM_HEIGHT = 30;
  const ITEM_COUNT = 100;

  window.onload = function(){
    const container = document.querySelector("#container")
    const containerHeight = container.clientHeight
    const list = document.querySelector('#list')
    list.style.height = containerHeight + 'px'
    const visibleCount = Math.ceil(containerHeight/ITEM_HEIGHT)
    const placeholder = document.querySelector('#content-placeholder')
    list.appendChild(renderNodes(0,visibleCount))
    placeholder.style.height = (ITEM_COUNT * ITEM_HEIGHT-containerHeight) + 'px'
    container.addEventListener('scroll',function(){
      list.style.webkitTransform = `translateY(${container.scrollTop}px)`
      list.innerHTML = ""
      const firstIndex = Math.floor(container.scrollTop/ITEM_HEIGHT)
      list.appendChild(renderNodes(firstIndex, firstIndex + visibleCount))
    })
  };

  function renderNodes(from, to){
    const fragment = document.createDocumentFragment();
    for(let i = from; i<to; i++){
      const el = document.createElement('li')
      el.style.height = ITEM_HEIGHT + 'px'
      el.innerText = i+1
      fragment.appendChild(el)
    }
    return fragment
  }
</script>