当前位置: 首页 > news >正文

判断dom元素是否滚动到底、是否在可视区域

概览

我们日常开发中,在面对懒加载、虚拟列表需求时,经常需要判断dom元素是否滚动到底、是否在可视区域。但是由于涉及的属性太多了,比如scrollTop、clientHeight、scrollHeight、getBoundingClientRect()等属性,现根据这两个场景,加深对相关的属性的认识。

一. 判断dom元素是否滚动到底

scrollTop: 元素顶部到元素可视区域顶部的像素距离(可读写)
clientHeight: 元素的像素高度,包括盒子内容content和内边距padding, 不包括边框外边距和水平滚动条(只读)
scrollHeight: 实际的内容区域,包括边框、内、外边距。

wrapper: 父元素盒子
content: 父元素包裹的内容区域

滚动前:
在这里插入图片描述

滚动中:
在这里插入图片描述

滚动到底:
在这里插入图片描述

滚动到底满足的条件:

const dom = document.querySelectorAll('.wrapper');dom[0].scrollTop + dom[0].clientHeight === dom[0].scrollHeight

总图:
在这里插入图片描述

举个例子

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><div class="wrapper"><div class="content"><span>内容区域</span></div></div>
</body>
<script>// 父节点const dom = document.querySelectorAll('.wrapper')[0];// 子节点</script>
<style>.wrapper {width: 200px;height:300px;padding: 10px;border: 1px solid gray;overflow: auto}.content {height: 600px;background-color: pink;border: 1px solid gray;margin-top: 400px;}
</style>
</html>

web界面展示:
在这里插入图片描述

归纳总结:

  1. 有滚动条的前提是内容区域的高度/宽度大于外层盒子;
  2. 滚动前,scrollTop是0,滚动到底的过程就是滚动内容区域的过程,将隐藏在可视区域外的实际内容区域区域滚动完,就滚动到底了,实际内容区域 - 可视区域 === 滚动到底时滚动的距离(scrollTop)
  3. scrollHeight和clientHeight是固定值,在滚动过程中不会发生变化。

二. 判断dom元素是否在可视区域

getBoundingClientRect方法返回一个DOMRect对象,该对象包含了元素的位置和尺寸信息。DOMRect对象具有left、top、right、bottom、width、height等属性,可以用来计算元素在视口中的位置和大小。

检查dom元素是否在视口

 const rect = element.getBoundingClientRect();const viewportWidth = window.innerWidth || document.documentElement.clientWidth;const viewportHeight = window.innerHeight || document.documentElement.clientHeight;const inViewport = rect.top < viewportHeight && rect.bottom > 0 &&rect.left < viewportWidth && rect.right > 0;

总结:

  1. getBoundingClientRect方法返回的top、left、bottom、right是相对于可视区域的视口中的位置,现以top和scrollTop来举例

比如:

top > 0  
// 说明dom元素还没到视口的顶部0<top < clientHeight 
// 说明dom元素还没到视口的顶部,但是已经在可视区域了top > clientHeight  
// 说明dom元素还没到视口的顶部,且不在可视区域了top < 0// 说明dom元素已经超过视口的顶部了。
// 要判断是否在可视区域,需要结合bottom值

要判断dom元素完全暴露在可视区域,需要结合getBoundingClientRect方法返回的top、bottom、left、right四个属性和可视属性来对比确定。

拓展:

scrollIntoView: 将某个元素滚动到可视区域
比如代码

lastMessage.scrollIntoView({ behavior: 'smooth' })

lastMessage.scrollIntoView({ behavior: ‘smooth’ }); 这段代码用于将页面滚动到 lastMessage 这个元素上,并确保它可见在视口(viewport)中。

三. 总结

此篇文章主要是针对特定场景加深对scrollTop、clientHeight、scrollHeight、getBoundingClientRect()等属性的认识,实际场景以上的方案可能并非最佳,
比如

判断dom元素是否滚动到底,可以使用IntersectionObserver浏览器api.
其用法可参考往期文章:IntersectionObserver监听滚动事件

虚拟列表的最佳尝试可以使用requestAnimationFrame浏览器api,
其用法可参考往期文章:
requestAnimationFrame用法解析

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Linux查看某个用户使用总内存脚本
  • Spring Boot集成sharding-jdbc快速入门Demo
  • 一套最完整的无人值守配电站房智能辅助监控系统(实用收藏版)
  • [ C++ ] 类和对象( 下 )
  • ES数据导出成csv文件
  • .NET技术成长路线架构图
  • 免费,Python蓝桥杯等级考试真题--第13级(含答案解析和代码)
  • JAVA学习-练习试用Java实现“Excel表列名称”
  • Spring AOP:使用Spring AOP进行切面编程的实例,解释不同类型的advice(advice类型)以及何时使用它们
  • Git 学习笔记
  • 国内市场有哪些创意交互性强,重视用户体验的APP/小程序?
  • 821. 字符的最短距离 - 力扣
  • SSL函数01-数组函数Array Functions
  • MySQL——内置函数
  • [STM32-HAL库]ADC采集-DMA中断采集-平均值滤波-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • CentOS6 编译安装 redis-3.2.3
  • CSS 专业技巧
  • CSS实用技巧
  • es6
  • ES6系列(二)变量的解构赋值
  • Git的一些常用操作
  • java2019面试题北京
  • Java多线程(4):使用线程池执行定时任务
  • pdf文件如何在线转换为jpg图片
  • python_bomb----数据类型总结
  • react-native 安卓真机环境搭建
  • 初探 Vue 生命周期和钩子函数
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 服务器之间,相同帐号,实现免密钥登录
  • 高性能JavaScript阅读简记(三)
  • 基于HAProxy的高性能缓存服务器nuster
  • 理清楚Vue的结构
  • 智能合约开发环境搭建及Hello World合约
  • 阿里云ACE认证学习知识点梳理
  • # Redis 入门到精通(七)-- redis 删除策略
  • #include<初见C语言之指针(5)>
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (30)数组元素和与数字和的绝对差
  • (4)Elastix图像配准:3D图像
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (STM32笔记)九、RCC时钟树与时钟 第二部分
  • (二十四)Flask之flask-session组件
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (简单) HDU 2612 Find a way,BFS。
  • (七)Flink Watermark
  • (十六)视图变换 正交投影 透视投影
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转)大型网站架构演变和知识体系
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET多线程执行函数
  • .NET序列化 serializable,反序列化
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...