【前端 | CSS】滚动到底部加载,滚动监听、懒加载

背景

在日常开发过程中,我们会遇到图片懒加载的功能,基本原理是,滚动条滚动到底部后再次获取数据进行渲染。

那怎么判断滚动条是否滚动到底部呢?滚动条滚动到底部触发时间的时机和方法又该怎样定义?

针对以上问题我做了以下总结:

如何判断滚动条已经滚动到底部

先看一张图片解析

从图中不难看出:

滚动条滚动的最大距离+父盒子的高度 = 子盒子的高度;

也就是说子盒子的高度-父盒子的高度>=滚动距离时,滚动条触底;

那如何获取盒子的高度和滚动距离

大多数情况下子元素的高度是不确定的,会随着图片的加载子元素的高度越来越高,

我们可以通过

elemet.scrollHeight 获取子盒子的高度;

elemet.scrollTop 获取滚动距离;

elemet .clientHeight 获取父盒子的高度;

参考

【前端 | CSS】盒模型clientWidth、clientHeight、offsetWidht、offsetHeight_好喝的西北风的博客-CSDN博客只读属性Element.clientWidth对于内联元素以及没有 CSS 样式的元素为 0;该属性包括内边距(padding),但不包括边框(border)、外边距(margin)和垂直滚动条(如果存在)offsetWidth 是测量包含元素的边框 (border)、水平线上的内边距 (padding)、竖直方向滚动条 (scrollbar)(如果存在的话)、以及 CSS 设置的宽度 (width) 的值。https://blog.csdn.net/weixin_43340372/article/details/132210911?spm=1001.2014.3001.5501

示例代码

HTML

html 复制代码
<!DOCTYPE html>
<html lang="CH-EN">
  <head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="viewport" content="width=device-width" />

    <title>flex</title>
  </head>

  <body>
    <div class="container">
      <div class="item">
        内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
        内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
      </div>
    </div>
  </body>
</html>

js

javascript 复制代码
<script>
  window.onload = () => {
    // 基本思路
    // 滚动体条所能滚动的最大高度 + continer的高度 = 子盒子(item)的高度;
    const container = document.querySelector(".container");
    console.dir(container);
    const item = document.querySelector(".item");
    container.addEventListener("scroll",() => {
        // 父盒子的高度
       const clientHeight = container.clientHeight;
       // 子盒子的高度(滚动盒子的高度)
       const scrollHeight = container.scrollHeight;
       // 滚动的最大距离
       const scrollHeight_clientHeight = scrollHeight - clientHeight;
       // 实时滚动距离
       const scrollTop = container.scrollTop;
       // 滚动的最大距离小于等于实时滚动距离时,滚动到了底部
        if(scrollHeight_clientHeight <= scrollTop){
            console.log("滚动到底部");
        }
    })
  };
</script>

style

css 复制代码
<style>
  body,
  html {
    height: 100%;
    overflow: hidden;
    margin: 0;
    padding: 0;
  }
  ::-webkit-scrollbar {
    width: 10px;
    background-color: gray;
  }
  ::-webkit-scrollbar-thumb {
    background-color: black;
    border-radius: 5px;
  }

  .container {
    height: 500px;
    width: 400px;
    margin: 100px auto;
    background-color: rgb(6, 100, 64);
    border: blue 5px solid;
    overflow: auto;
  }
  .item {
    height: 800px;
    width: 200px;
    margin: 0 auto;
    color: #fff;
    line-height: 200px;
    overflow: hidden;
    background-color: rgb(235, 77, 77);
  }
</style>

线上示例

滚动加载线上示例

相关推荐
非优秀程序员14 分钟前
第10章 千团出世|《互联网产品恩仇录》
前端
非优秀程序员18 分钟前
第11章 小高在对面|《互联网产品恩仇录》
前端
非优秀程序员19 分钟前
第14章 只剩美团|《互联网产品恩仇录》
前端
非优秀程序员20 分钟前
第09章 老乡何必为难老乡|《互联网产品恩仇录》
前端
非优秀程序员30 分钟前
第03章 三大门户,烽烟起于瀛海威|《互联网产品恩仇录》
前端
程序员大阳4 小时前
HTML+CSS+JS对话式实战(5)-活动管理页之查看报名名单的实现
javascript·css·html·查看报名名单
曦樂~5 小时前
【Web Development】02 CSS
前端·css
风骏时光牛马5 小时前
后端服务接口开发与数据逻辑处理
前端
东鹏特饮5 小时前
经典打砖块(Breakout)游戏
前端·css·css3
IT_陈寒5 小时前
Vite的HMR把我整不会了:一个生产环境的热更新坑
前端·人工智能·后端