【前端 | 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>

线上示例

滚动加载线上示例

相关推荐
zhaoyang030121 分钟前
css3笔记 (1) 自用
前端·javascript·css·vue.js·笔记·html·css3
珎珎啊26 分钟前
CSS3 常用功能详细使用指南
前端·css·css3
moxiaoran57533 小时前
uni-app萌宠案例学习笔记--页面布局和CSS样式设置
前端·css·uni-app
CrissChan4 小时前
Pycharm 函数注释
java·前端·pycharm
小小小小宇5 小时前
Vue.nextTick()笔记
前端
小约翰仓鼠6 小时前
vue3子组件获取并修改父组件的值
前端·javascript·vue.js
Lin Hsüeh-ch'in6 小时前
Vue 学习路线图(从零到实战)
前端·vue.js·学习
烛阴7 小时前
bignumber.js深度解析:驾驭任意精度计算的终极武器
前端·javascript·后端
计蒙不吃鱼7 小时前
一篇文章实现Android图片拼接并保存至相册
android·java·前端