实现图片懒加载的三种方式

3,022 阅读1分钟

实现思路

  • 在页面放置img标签
  • 给img图片加上alt, width, height 和 data-src
  • 通过js判断页面是否滚动到某张图片需要显示的位置,这时将src赋值为data-src

offsetTop方式

图片出现在视窗内的情况: offsetTop < clientHeight + scrollTop

getBoundingClientRect方式

图片出现在视窗内的情况: element.getBoundingClientRect().top < clientHeight

h5的IntersectionObserver方式

  • intersectionRatio:目标元素的可见比例,即 intersectionRect 占 boundingClientRect 的比例,完全可见时为 1 ,完全不可见时小于等于 0

具体用法如下:

function getTag(tag) {
    return Array.from(document.getElementsByTagName(tag));
}
var observer = new IntersectionObserver(
    (changes) => {
        changes.forEach((change) => {
            if (change.intersectionRatio > 0) {
                var img = change.target;
                img.src = img.dataset.src;
                observer.unobserve(img);
            }
        })
    }
)
getTag('img').forEach((item) => {
    observer.observe(item);
})

优化

  • 通过以下css可以提高性能
  # 之所以使用visibility而不是display是因为
  # visibility不会触发重绘(repaint)和重排(reflow)
  img {
    visibility: hidden;
  }
  
  img[src] {
    visibility: visible;
  }
  • 因为scroll事件的触发频率很高,频繁操作dom结点会造成很大的性能问题,所以需要做节流和防抖设计,减少scroll事件的触发频率