方法一

窗口显示区的高度:window.innerHeight
图片到视窗上边距离的高度:getBoundingClientRect().top
获取全部图片元素,监听滚动事件,当图片到视窗顶部的距离小于可视区域的高度时,将自定义的属性赋给src属性,加载图片。

  1. // 获取所有的图片元素
  2. const images = document.querySelectorAll('img')
  3. // 监听滚动事件
  4. window.addEventListener('scroll', e => {
  5. images.forEach(image => {
  6. // 遍历图片,获取图片到视窗顶部的距离
  7. const imageTop = image.getBoundingClientRect().top
  8. // 图片到视窗顶部的距离小于可视区域的高度,显示图片
  9. if (imageTop < window.innerHeight) {
  10. // 取得自定义的 data-src 属性
  11. const data_src = image.getAttribute('data-src')
  12. // 将取得的自定义属性赋给 src 属性
  13. image.setAttribute('src', data_src)
  14. }
  15. })
  16. })

方法二

InterSectionObserver
获取全部图片元素,并对其进行监听,当图片滚动到可视区域的时候,entry.isIntersecting 的值为 true,将自定义的属性赋给src属性,加载图片,之后取消监听动作以节约性能。

  1. // 获取所有的图片元素
  2. const images = document.querySelectorAll('img')
  3. // 设置回调函数
  4. const callback = entries => {
  5. entries.forEach(entry => {
  6. // 当图片滚动到可视区域的时候,entry.isIntersecting 的值为 true
  7. if (entry.isIntersecting) {
  8. // 获取图片节点
  9. const image = entry.target
  10. // 取得自定义的 data-src 属性
  11. const data_src = image.getAttribute('data-src')
  12. // 将取得的自定义属性赋给 src 属性
  13. image.setAttribute('src', data_src)
  14. // 取消监听动作
  15. observer.unobserve(image)
  16. }
  17. })
  18. }
  19. // 创建实例并传入 callback 回调函数
  20. const observer = new IntersectionObserver(callback)
  21. // 遍历图片,对所有图片进行监听
  22. images.forEach(image => {
  23. ovserver.observe(image)
  24. })