图片懒加载原理

电玩女神 2022-10-01 07:54 356阅读 0赞

背景

懒加载是前端重要的优化手段,尤其是对图片而言,因为非常耗资源。所以我们来了解一下原理吧~

github地址在此

准备

  • img标签的src会触发http请求,是一种通过浏览器的外部资源加载的表现,同时还有script标签等(同时可应用于jsonp)
  • 图片距离顶部高度:el.offsetTop
  • 视窗高度:window.innerHeight
  • 滚动条滚动的高度:el.scrollTop(el是滚动条所在的元素,有可能是body)

开始

创建所有图片

这里为了方便,就用div模拟了。innerTxet替换了就相当于img标签的src被替换了。

  1. let imgArr = Array(100).fill('image')
  2. let images = document.getElementsByClassName('img')
  3. let app = document.getElementById('app')
  4. imgArr.forEach((item) => {
  5. let div = document.createElement('div')
  6. div.classList = 'load img'
  7. div.innerText = '尚未出现在视窗(我是默认图片)'
  8. app.appendChild(div)
  9. })
  10. 复制代码

现实中,也是一样的。我们会把没有出现在视窗内的图片,用一张占位符图片来代替。

初始化图片状态(在视窗内和不在视窗内)

  1. let windowHeight = window.innerHeight
  2. function mountedImg() {
  3. for (let i = 0; i < images.length; i++) {
  4. let imgHeight = images[i].offsetTop
  5. if (imgHeight < windowHeight) {
  6. setTimeout(() => {
  7. images[i].innerText = '出现在视窗(这是正确的图片)'
  8. }, 500)
  9. }
  10. }
  11. }
  12. //初始化
  13. mountedImg()
  14. 复制代码

这里就初始化在视窗内的图片,就是占位符图片赋予正确的src。

滚动懒加载

监听滚动事件,同时考虑节流~

  1. //节流函数,在一定时间内不触发该函数
  2. function throttle() {
  3. //守卫标志
  4. let canRun = true
  5. return function () {
  6. if (canRun) {
  7. canRun = false
  8. let scrollTop = document.documentElement.scrollTop
  9. //懒加载
  10. for (let i = 0; i < images.length; i++) {
  11. let imgHeight = images[i].offsetTop
  12. if (imgHeight < scrollTop + windowHeight) {
  13. images[i].innerText = '出现在视窗(这是正确的图片)'
  14. }
  15. }
  16. //1s后守卫正常
  17. setTimeout(() => {
  18. canRun = true
  19. }, 1000)
  20. }
  21. }
  22. }
  23. 复制代码

节流函数就像是游戏中的cd,一段时间你再怎么按都触发不了,要等过了这个cd(联想一下王者荣耀),你的大招节流了,不能无限按!

转载于:https://juejin.im/post/5c811edc51882555a8224390

发表评论

表情:
评论列表 (有 0 条评论,356人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图片原理

    背景 懒加载是前端重要的优化手段,尤其是对图片而言,因为非常耗资源。所以我们来了解一下原理吧~ [github地址在此][github] 准备 img标签

    相关 js实现图片原理

    有时候一个网页会包含很多的图片,例如淘宝京东这些购物网站,商品图片多只之又多,页面图片多,加载的图片就多。服务器压力就会很大。不仅影响渲染速度还会浪费带宽。比如一个1M大小的图