图片懒加载
判断元素是否出现在界面中:
window.addEventListener('scroll', () => { const rect = elem.getBoundingClientRect(); const inViewport = rect.bottom > 0 && rect.right > 0 && rect.left < window.innerWidth && rect.top < window.innerHeight; });
上述代码的问题在于每次调用 getBoundingClientRect
时都会触发回流,严重地影响了性能。在事件处理函数中调用( getBoundingClientRect
)尤为糟糕,就算使用了函数节流(的技巧)也可能对性能没多大帮助。
在2016年后,可以通过使用 Intersection Observer 这一 API 来解决问题。它允许你追踪目标元素与其祖先元素或视窗的交叉状态。此外,尽管只有一部分元素出现在视窗中,哪怕只有一像素,也可以选择触发回调函数:
const observer = new IntersectionObserver(callback, options); observer.observe(element);
此 API 被广泛地支持,但仍有一些浏览器需要 polyfill。尽管如此,它仍是目前最好的解决方案。