找回密码
 立即注册
查看: 78|回复: 0

JavaScript 图片懒加载

[复制链接]

140

积分

0

金钱

140

金币

实习版主

积分
140
    发表于 2024-3-30 16:16:14 | 显示全部楼层 |阅读模式
    本帖最后由 一度 于 2024-3-30 16:19 编辑



    监听scroll

    监听scroll这个事件。鼠标滚动就触发
    我们需要知道两个高度

    • 窗口显示区的高度 window.innerHeight
    • 图片到视窗上边的距离高度 getBoundingClientRect().top

    图片未能看见:图片距离视窗顶部的距离 > 窗口显示区的高度

    图片能看见:图片距离视窗顶部的距离 < 窗口显示区的高度

    一开始,可以将图片设置为 <img data-src=""> 其中 data- 为自定义属性,浏览器碰到这个属性的时候是不会像默认属性那样进行属性处理的

    之后,添加滚动监听事件,为img 赋值 src 属性


    1. const images = document.querySelectorAll('img')
    2. window.addEventListener('scroll', e => {
    3.   images.forEach(img => {
    4.     // 获取图片到视窗上边的距离高度
    5.     const imgTop = img.getBoundingClientRect().top
    6.     // 图片到视窗上边的距离高度 < 窗口显示区的高度 ,这时候,才需要加载
    7.     if (imgTop < window.innerHeight) {
    8.       // 获取自定义属性
    9.       const data_src = img.getAttribute('data-src')
    10.       // 将自定义属性赋值给原本的 src 属性
    11.       img.setAttribute('src', data_src)
    12.     }
    13.   })
    14. })
    复制代码
    [color=var(--routine)]缺点:会多次触发属性的赋值
    IntersectionObserver 观察属性

    IntersectionObserver 浏览器提供的构造函数,前提是浏览器能够支持

    交叉观察:目标元素和可视窗口会产生交叉区域,交叉区域发生了什么事情,我们需要执行什么程序

    1. // 拿着望远镜的人            callback: 需要触发条件,然后执行        触发两次:1 目标元素看得见 2 目标元素看不见
    2. const observer = new IntersectionObserver(callback)
    3. // 具体观察那个节点
    4. observer.observe(Dom)
    5. // 取消观察
    6. observer.unobserve(Dom)
    复制代码

    isIntersecting 是否交叉,即是否进行到可视区域

    1. const images = document.querySelectorAll('img')

    2. // 回调函数接受一个 数组参数
    3. const callback = entries => {
    4.   entries.forEach(entry => {
    5.     // 是否交叉,即是否进行到可视区域
    6.     if (entry.isIntersecting) {
    7.       // 获取图片节点
    8.       const imgae = entry.target
    9.       // 获取自定义属性
    10.       const data_src = imgae.getAttribute('data-src')
    11.       // 修改 src
    12.       imgae.setAttribute('src', data_src)
    13.       // 修改完属性之后,取消观察
    14.       observer.unobserve(imgae)
    15.     }
    16.   })
    17. }

    18. // 拿着望远镜的人            callback: 需要触发条件,然后执行        触发两次:1 目标元素看得见 2 目标元素看不见
    19. const observer = new IntersectionObserver(callback)

    20. images.forEach(imgae => {
    21.   // 具体观察那个节点
    22.   observer.observe(imgae)
    23. })
    复制代码

    isIntersecting 是否交叉,即是否进行到可视区域

    1. const images = document.querySelectorAll('img')

    2. // 回调函数接受一个 数组参数
    3. const callback = entries => {
    4.   entries.forEach(entry => {
    5.     // 是否交叉,即是否进行到可视区域
    6.     if (entry.isIntersecting) {
    7.       // 获取图片节点
    8.       const imgae = entry.target
    9.       // 获取自定义属性
    10.       const data_src = imgae.getAttribute('data-src')
    11.       // 修改 src
    12.       imgae.setAttribute('src', data_src)
    13.       // 修改完属性之后,取消观察
    14.       observer.unobserve(imgae)
    15.     }
    16.   })
    17. }

    18. // 拿着望远镜的人            callback: 需要触发条件,然后执行        触发两次:1 目标元素看得见 2 目标元素看不见
    19. const observer = new IntersectionObserver(callback)

    20. images.forEach(imgae => {
    21.   // 具体观察那个节点
    22.   observer.observe(imgae)
    23. })
    复制代码
    HTML代码
    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4.     <meta charset="UTF-8">
    5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7.     <title>Document</title>


    8. </head>
    9. <body>
    10.    
    11. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    12. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    13. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    14. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    15. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    16. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    17. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    18. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    19. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    20. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    21. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    22. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    23. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    24. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    25. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    26. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    27. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    28. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    29. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    30. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    31. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    32. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    33. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    34. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    35. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    36. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    37. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    38. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    39. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    40. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    41. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    42. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    43. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    44. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    45. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    46. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    47. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    48. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    49. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    50. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    51. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    52. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    53. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    54. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    55. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    56. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    57. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    58. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    59. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    60. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">

    61. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    62. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    63. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    64. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    65. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    66. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    67. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    68. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    69. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    70. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    71. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    72. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    73. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    74. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    75. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    76. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    77. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    78. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    79. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    80. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    81. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    82. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    83. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    84. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    85. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    86. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    87. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    88. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">
    89. <p>啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊</p>
    90. <p>哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦哦</p>
    91. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_29_48.jpg" alt="图片">
    92. <img data-src="http://sh.qemao.com/tools/tol/tu/_filew/2020-12-07-22_28_27.jpg" alt="图片">


    93.    
    94. <script src="js/index.js"></script>
    95. </body>
    96. </html>
    复制代码



    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|天天站

    GMT+8, 2024-5-12 23:50 , Processed in 0.086558 second(s), 19 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.