开头
作为最常见的优化页面的一种手段,记录一下学习笔记
正文
什么是懒加载
- 也叫延迟加载,即让页面依赖的一些非关键资源,先不加载,在后期达到某些触发条件时,在加载
 - 这里的关键资源指决定和影响当前访问页面的一些资源;非关键资源,比如针对页面某一部分的一些脚本、动态切换的样式等
 
目的
减少资源加载带来的响应时间过长,造成用户体验不好
具体表现
- 在页面滚动到某一部分,加载当前位置需要显示的图片和相关资源
 - 面板切换,要切换时,在加载将要显示的资源
 - 等等
 
实现
- 对上述第一种情况进行一个简单的效果实现
 - 页面有3部分,每一部分都占满整个屏幕,显示一张图片
 
思路
- 对一部分的图片不作处理
 - 对剩下的2部分的图片的src不先不设置,把资源路径添加到data-src里
 - 对整个文档添加一个滚动事件
 - 每次滚动事件的函数触发时,获取当前文档滚动的height
 - 当滚动的位置达到我们指定的值后,通过js给图片的src添加资源路径
 
用到的api
- data-***:不具有表现意义的一个属性,用于给dom添加自定的片段数据
 - 滚动事件:mousewheel
 - 获取文档滚动的高度:scrollTop
 
代码
<!-- CSS&HTML -->
<style>
  body {
    margin: 0;
    overflow-x: hidden;
  }
  .box > div {
    width: 100vw;
    height: 100vh;
    margin: 0 auto;
  }
  img {
    width: 100%;
    height: 100%;
  }
  .two,
  .three {
    visibility: hidden;
    opacity: 0;
    transition: all 0.5s;
  }
</style>
<!-- HTML -->
<div class="box" id="box">
  <div class="one">
    <img src="./img/a.jpg" alt="" />
  </div>
  <div class="two">
    <img src="" data-src="./img/b.jpg" alt="" />
  </div>
  <div class="three">
    <img src="" data-src="./img/c.jpg" alt="" />
  </div>
</div>
<script>
  let box = document.querySelector("#box");
  box.addEventListener("mousewheel", () => {
    if (document.documentElement.scrollTop > 10) {
      document.querySelector(".two").style.visibility = "visible";
      document.querySelector(".two").style.opacity = "1";
      document.querySelector(".two img").src = document
        .querySelector(".two img")
        .getAttribute("data-src");
    }
    if (document.documentElement.scrollTop > 722) {
      document.querySelector(".three").style.visibility = "visible";
      document.querySelector(".three").style.opacity = "1";
      document.querySelector(".three img").src = document
        .querySelector(".three img")
        .getAttribute("data-src");
    }
  });
</script>
- 打开chrome调试工具,查看network,发现页面一开始只加载了a图片
 - 当滚动到指定位置后,才开始加载需要后面的资源
 
关于获取dom的大小、位置
提到了scrollTop,顺带总结一下这几个api的区别
clientHeight、clientWidth
- 获取dom的height(width)+padding(如果没设置,为0)
 - 这里还有一个同样功能的api:getClientRects
 - 两者的区别:前者对小数取整;后者保留
 
clientTop、clientLeft
- 获取dom的border-top(left)
 
scrollHeight、scrollWidth
- 获取dom的整个内容长度(比如div的height是100px,并设置了overflow-y:scroll后,div内部内容的height长度)
 - 后者同理
 
scrollTop、scrollLeft
- 获取dom滑动出可视区域的部分的height(width)
 
offsetheight、offsetWidth
- 获取dom的height(width)+padding+border
 
offsetTop、offsetLeft
- 获取目标dom离最近的已定位元素的margintop(left)
 - 这里还有个api,offsetParent用来获取离目标元素最近的已定位的元素