码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 你把 浏览器滚动事件 玩明白


    目录

    第一 :设置浏览器滚动条滚动高度

    一: 相对于页面顶部的距离 

     二:相对于滚动条的位置开始

    三:利用scrollTop设置

    第二: 设置元素在页面什么位置,滚动条就跑到哪里

      一:使用offsetTop (先获取在设置) 

    ​

               二:使用a标签 锚点

      三:利用scrollIntoView进行展示

     第三:判断是否到屏幕底部(scrollingElement)兼容移动端 pc端

     第四:函数节流绑定滚动事件

     第五:.函数防抖 

     第六:解决IOS设备局部滚动不顺畅

     第七:利用滚动写轮播

    第八:浏览器滚动条样式修改 第四条 


    ​前期回顾    ​       

    vite + vue3 + 封装axios + 封装loading + 封装返回顶部_0.活在风浪里的博客-CSDN博客目前为止我们实现了 axios封装 loading 封装 返回顶部封装!本人亲测保证能用,最后祝大家2022越来越强https://blog.csdn.net/m0_57904695/article/details/125891081?spm=1001.2014.3001.5501

    奇怪的知识又增加了 


     念及此,安排一下

    第一 :设置浏览器滚动条滚动高度

    一: 相对于页面顶部的距离 

    1. // 简写
    2. window.scrollTo(0, 0);
    3. // 完整写法
    4. window.scrollTo({
    5. left: 0,
    6. top: 100,
    7. behavior: "smooth",
    8. });
    9. // 滚动到底部
    10. window.scrollTo({
    11. left: 0,
    12. top: document.scrollingElement.scrollHeight
    13. });
    14. // 如果你实在是懒的话...
    15. window.scrollTo(0, 999999);

     二:相对于滚动条的位置开始

    1. window.scrollBy(0, 0);
    2. ||
    3. window.scrollBy({
    4. left: 0,
    5. top: 100,
    6. behavior: "smooth",
    7. });

    三:利用scrollTop设置

    document.scrollingElement.scrollTop = 100;
    

    效果

    绝对  window.scrollTo(0, 100);


    相对  window.scrollBy(0, 100);


    第二: 设置元素在页面什么位置,滚动条就跑到哪里

    一:使用offsetTop (先获取在设置) 

    1. // 获取元素的offsetTop(元素距离文档顶部的距离)
    2. let offsetTop = document.querySelector(".box").offsetTop;
    3. // 设置滚动条的高度
    4. window.scrollTo(0, offsetTop);

    二:使用a标签 锚点

    1. "#box">我是a标签
    2. <div id="box" class="box">我是box盒子div>

    点击a链接 box盒子会跑到页面顶部

    1. html,
    2. body,
    3. #app {
    4. width: 100%;
    5. height: 100%;
    6. /* 全局平滑滚动 */
    7. scroll-behavior: smooth;
    8. }
    9. /* 这里是全局css,也可以单页面加*/

     三:利用scrollIntoView进行展示

    1. // start出现在视口顶部、center出现在视口中央、end出现在视口底部
    2. document.querySelector(".box").scrollIntoView({
    3. block: "start" || "center" || "end"
    4. });
    5. // 因为设置了全局平滑滚动,所以这里直接简写,也有滚动动画

     第三:判断是否到屏幕底部(scrollingElement)兼容移动端 pc端

    该对象可以非常兼容地获取scrollTop + clientHeight + scrollHeight等属性,在移动端和PC端屡试不爽,还记得当初写这个兼容方法:

    let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
    

     现在你只需要:

    let scrollHeight = document.scrollingElement.scrollHeight;
    

    因为在MDN中是这样介绍它的:
    标准模式返回documentElement,怪异模式返回body;

    滚动到底部

    1. window.scrollTo({
    2. left: 0,
    3. top: document.scrollingElement.scrollHeight
    4. });
    5. // 如果你实在是懒的话...
    6. window.scrollTo(0, 999999);

    判断浏览器已滚动到底部

    •  思路:给window绑定scroll事件,获取滚动高度和视口高度和文档总高度,判断 当前滚动高度 + 视口高度 >= 文档总高度书写逻辑
    1. window.addEventListener("scroll", () => {
    2. let { scrollTop, scrollHeight, clientHeight } = document.scrollingElement;
    3. // 当前滚动高度 + 视口高度 >= 文档总高度
    4. if (scrollTop + clientHeight >= scrollHeight) {
    5. console.log("已到达底部");
    6. }
    7. });

    第四:函数节流绑定滚动事件

    • 节流会稀释执行频率,在规定的时间里只会执行一次,若在 规定时间内重复触发,只有一次生效,简单来说节流重复触发只会执行一次
    window.addEventListener("scroll", throttle());
    
    1. function throttle(fn, interval = 500) {
    2. let run = true;
    3. return function () {
    4. if (!run) return;// 如果正在执行则终止
    5. run = false;
    6. setTimeout(() => {
    7. fn.apply(this, arguments);
    8. run = true; //执行完打开节流阀
    9. }, interval);
    10. };
    11. }

    第五:.函数防抖 

    •  n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时,简单来说防抖若重复触发会从头开始
    window.addEventListener("scroll", debounce());
    

    如果你在监听滚动事件,假设两秒以内用户在不断的频繁的触发onScroll事件,只有用户暂停滚动后,才会去执行响应的操作,代码如下 

    1. function debounce(fn, interval = 500) {
    2. let timer = null;
    3. return function () {
    4. clearTimeout(timer ); // 清除未执行的代码,重置回初始化状态
    5. timer = setTimeout(() => {
    6. console.log("函数防抖");
    7. }, interval);
    8. };
    9. }

    第六:解决IOS设备局部滚动不顺畅

    •  除了浏览器原生滚动,自定义滚动条都会出现这个情况,比如overflow: auto || scroll; 后的滚动行为加以下属性就可以解决:
    1. .box {
    2. -webkit-overflow-scrolling: touch;
    3. }

     第七:利用滚动写轮播

      • <li>
      • <img src="">
      • li>
      • ul>
      1. ul {
      2. white-space: nowrap; // 超出不换行
      3. overflow-x: auto;
      4. width:500px;
      5. li {
      6. //默认松手最近一张图片会滚动到最右边(初始位置,对于Y轴来讲就是顶部,X轴则是右边)
      7. //也可以设置出现在中间:
      8. scroll-snap-align: center;
      9. img {
      10. display: block;
      11. width: 200px;
      12. }
      13. }
      14. }

      第八:浏览器滚动条样式修改 第四条 

      JavaScript 法术合集_0.活在风浪里的博客-CSDN博客​前期回顾 ​Vue项目实战 —— 后台管理系统( pc端 ) 第三篇_0.活在风浪里的博客-CSDN博客mock模拟数据、折线图、柱状图、饼图,一遍就懂!!~https://blog.csdn.net/m0_57904695/article/details/124861409?spm=1001.2014.3001.5501目录JavaScript 语法之创建对象的三种方法1、通过内置的构造函数创建对象2、通过字面量创建对象3、通过构造函数​编辑获取后台接口的前五........https://blog.csdn.net/m0_57904695/article/details/124885964?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165940908716780357214701%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165940908716780357214701&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-7-124885964-null-null.nonecase&utm_term=%E6%89%93%E5%8C%85&spm=1018.2226.3001.4450

    1. 相关阅读:
      Python一周小结
      99-104-Hadoop-MapReduce-排序:
      深度学习(三)之LSTM写诗
      SSD1306 oled显示屏的驱动SPI接口
      【专栏】RPC系列(理论)-协议与序列化
      嵌入式软件行业真的没前途吗?
      LINUX笔记温习
      护眼灯真能保护眼睛吗?2022双十二买什么样的护眼灯对眼睛好
      C++:继承、模板、CRTP:谈谈C++多态设计模式
      tensorrt高级2:YoloV5 模型导出、编译到推理(源码讲解)
    2. 原文地址:https://blog.csdn.net/m0_57904695/article/details/125926551
    • 最新文章
    • 沪漂五周年了:我越来越迷茫了
      Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
      MySQL-Seconds_behind_master的精度误差
      [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
      AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
      Agent OS :五种驯服不确定性的范式
      PortSwigger SQL注入LAB11
      数据库即时编译JIT
      [Begin]AI Learn Data Day 0
      深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
    • 热门文章
    • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
      奉劝各位学弟学妹们,该打造你的技术影响力了!
      五年了,我在 CSDN 的两个一百万。
      Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
      面试官都震惊,你这网络基础可以啊!
      你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
      心情不好的时候,用 Python 画棵樱花树送给自己吧
      通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
      13 万字 C 语言从入门到精通保姆级教程2021 年版
      10行代码集2000张美女图,Python爬虫120例,再上征途
    小工具 小游戏
    Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

    京公网安备 11010502049817号