【JavaScript】十八、页面加载事件和页面滚动事件

文章目录

  • 1、页面加载事件
    • 1.1 load
    • 1.2 DOMContentLoaded
  • 2、页面滚动事件
    • 2.1 语法
    • 2.2 获取滚动位置
  • 3、案例:页面滚动显示隐藏侧边栏

1、页面加载事件

script标签在html中的位置一般在</body>标签上方,这是因为代码从上往下执行,在html元素都没加载的情况下,JS去获取DOM对象,会获取不到,如下,script标签提前,button对象就获取不到

<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>const btn = document.querySelector('button')btn.addEventListener('click', function() {alert('点击了')})</script>
</head><body><button>点击</button>
</body>

此时,可以考虑加一个事件,等下面都加载完了,再来执行JS代码 ==> 页面加载事件 ==> 等页面资源全部处理完了再去做一些事情

1.1 load

  • 事件名:load
  • 作用:监听页面所有资源加载完毕,再执行回调函数
  • 示例:给 window 添加 load 事件

在这里插入图片描述

利用页面加载事件load,可以解决开篇说到的问题:

<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>// 等待页面所有资源都加载完毕了,再执行事件都回调函数// 这里给window添加load事件(window比document还大)window.addEventListener('load', function () {const btn = document.querySelector('button')btn.addEventListener('click', function () {alert('点击了')})})</script>
</head><body><button>点击</button>
</body>

不光可以监听整个页面资源加载完毕,也可以针对某个资源绑定load事件,也就是说不一定用window:

<script>// 如果我要等某个图片加载完毕,再去执行回调代码img.addEventListener('load', function () {alert('加载完成')})
</script>

1.2 DOMContentLoaded

当初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像等完全加载,只要html标签加载完就行

  • 事件名:DOMContentLoaded
  • 示例:给 document 添加 DOMContentLoaded 事件

在这里插入图片描述

2、页面滚动事件

很多网页需要检测用户把页面滚动到某个区域后做一些处理, 比如固定导航栏,比如返回顶部
在这里插入图片描述

2.1 语法

  • 事件名:scroll
  • 监听整个页面滚动(不是只能给window加,监听某个元素的内部滚动直接给某个元素加即可):

在这里插入图片描述

  • 示例:
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>/* 平时写的html没有滚动条,因为html页面和整个浏览器窗口一样大,这里给body加个高度变的超出窗口大小,就出现滚动条了 */body {height: 3000px;}</style>
</head><body><script>window.addEventListener('scroll', function () {console.log('发生滚动了~')})</script>
</body>
  • 示例2:给div对象添加滚动事件
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {margin: 100px;width: 200px;height: 200px;/* 只要有滚动条,都可以添加滚动事件 */overflow: scroll;border: 1px solid #000;}</style>
</head><body><div>这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字这是很多文字</div><script>const div = document.querySelector('div')div.addEventListener('scroll', function () {console.log('滚动了~')})</script>
</body>

在这里插入图片描述

2.2 获取滚动位置

如下,在上面div的例子中,滚动条向下拉,文字向上走(绿色代表div盒子,红色代表文字内容),紫色线所示长度,就是被卷去的长度,即scrollTop

在这里插入图片描述

同理,如果是横向滚动条,就是scrollLeft,scrollTop和scrollLeft分别是获取元素内容往左、往上滚出去看不到的距离

在这里插入图片描述
要在scroll事件里面去获取被卷去的距离:

在这里插入图片描述

当然,一般获取的是页面滚动的距离,获取整个html页面,不是document.html,而是document.documentElement

在这里插入图片描述

由此:获取整个html页面滚动的距离:

<body><script>window.addEventListener('scroll', function () { console.log(document.documentElement.scrollTop)})</script>
</body>

在这里插入图片描述

再扩展,让这个滑动距离满足一定条件时,出现一个返回顶部👆的文字

<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>body {height: 3000px;}div {display: none;}</style>
</head><body><div>返回顶部👆</div><script>const div = document.querySelector('div')window.addEventListener('scroll', function () {// 这里用const没问题,局部变量,每触发一次scroll事件,执行一次回调函数,对应一个局部变量n// 获取整个页面滑动的距离const n = document.documentElement.scrollTopconsole.log(n)if (n >= 1) {   // 这里给个1,给太大了,等生效的时候,文字已经滑上去了,出来了也看不到效果div.style.display = 'block'} else {// 滚动条拉上去后再隐藏div.style.display = 'none'}})</script>
</body></html>

在这里插入图片描述
最后,scrollTop和scrollLeft这两个值是数值型,可读可写,可写即用于实现页面一打开就在中间,或者实现返回顶部,一点就给这个值赋0

// 实现页面一打开就在中间
<script>document.documentElement.scrollTop = 800//...
</script>

3、案例:页面滚动显示隐藏侧边栏

需求:

  • 当页面滚动大于300像素的距离时候,就显示电梯侧边栏(叫电梯是因为点击下图中的每一楼选项,会直接跳到对应位置),否则隐藏
  • 点击电梯里的“顶部”,页面回到顶部
    在这里插入图片描述
    关键代码:
//...html略</div></div><!-- 电梯 --><div class="xtx-elevator"><ul class="xtx-elevator-list"><li><a href="javascript:;" data-name="new">新鲜好物</a></li><li><a href="javascript:;" data-name="popular">人气推荐</a></li><li><a href="javascript:;" data-name="brand">热门品牌</a></li><li><a href="javascript:;" data-name="topic">最新专题</a></li><li><a href="javascript:;" id="backTop"><i class="sprites"></i>顶部</a></li></ul></div><script>const elevator = document.querySelector('.xtx-elevator')window.addEventListener('scroll', function () {const n = document.documentElement.scrollTopif (n >= 300) {elevator.style.opacity = 1  // opacity即淡入淡出,温柔版的display} else {elevator.style.opacity = 0}// elevator.style.opacity = n >= 300 ? 1 : 0// 返回顶部const backTop = document.querySelector('#backTop')backTop.addEventListener('click', function () {document.documentElement.scrollTop = 0})})</script></body></html>

补充:scrollTo() 方法可把内容滚动到指定的坐标

  • 语法:元素.scrollTo(x, y)
  • 示例:

在这里插入图片描述
对这个案例来说,这两个写法都行,scrollTo方法更灵活,还可以操作横轴位置,但一般页面都是上下滚动,所以两种实现都可:

//document.documentElement.scrollTop = 0
window.scrollTo(0, 0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/75256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux : 内核中的信号捕捉

目录 一 前言 二 信号捕捉的方法 1.sigaction()​编辑 2. sigaction() 使用 三 可重入函数 四 volatile 关键字 一 前言 如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。在Linux: 进程信号初识-CSDN博客 这一篇中已经学习到了一种信号…

分布式id生成算法(雪花算法 VS 步长id生成)

分布式ID生成方案详解:雪花算法 vs 步长ID 一、核心需求 全局唯一性:集群中绝不重复有序性:有利于数据库索引性能高可用:每秒至少生成数万ID低延迟:生成耗时<1ms二、雪花算法(Snowflake) 1. 数据结构(64位) 0 | 0000000000 0000000000 0000000000 0000000000 0 |…

函数式编程在 Java:Function、BiFunction、UnaryOperator 你真的会用?

大家好&#xff0c;我是你们的Java技术博主&#xff01;今天我们要深入探讨Java函数式编程中的几个核心接口&#xff1a;Function、BiFunction和UnaryOperator。很多同学虽然知道它们的存在&#xff0c;但真正用起来却总是不得要领。这篇文章将带你彻底掌握它们&#xff01;&am…

x265 编码器中运动搜索 ME 方法对比实验

介绍 x265 的运动搜索方法一共有 6 种方法,分别是 DIA、HEX、UMH、STAR、SEA、FULL。typedef enum {X265_DIA_SEARCH,X265_HEX_SEARCH,X265_UMH_SEARCH,X265_STAR_SEARCH,X265_SEA,X265_FULL_SEARCH } X265_ME_METHODS;GitHub

2025.4.8 dmy NOI模拟赛总结(转化贡献方式 dp, 交互(分段函数找断点),SAM上计数)

文章目录 时间安排题解T1.搬箱子(dp&#xff0c;转化贡献方式)T2.很多线。(分段函数找断点)T3.很多串。(SAM&#xff0c; 计数) 时间安排 先写了 T 3 T3 T3 60 p t s 60pts 60pts&#xff0c;然后剩下 2.5 h 2.5h 2.5h 没有战胜 T 1 T1 T1 40 p t s 40pts 40pts。 总得分…

ZYNQ笔记(四):AXI GPIO

版本&#xff1a;Vivado2020.2&#xff08;Vitis&#xff09; 任务&#xff1a;使用 AXI GPIO IP 核实现按键 KEY 控制 LED 亮灭&#xff08;两个都在PL端&#xff09; 一、介绍 AXI GPIO (Advanced eXtensible Interface General Purpose Input/Output) 是 Xilinx 提供的一个可…

CSP认证准备第二天-第36/37次CCF认证

第37次CCF认证-第三题 主要是间接赋值比较难。 自己编写的代码如下&#xff0c;但是有问题&#xff0c;没有解决间接赋值的问题&#xff0c;可以参考一下deepseek的回答。 #include <iostream> #include <bits/stdc.h> using namespace std; long long n,x; char …

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…

FFMEPG常见命令查询

基本参数 表格1&#xff1a;主要参数 参数说明-i设定输入流-f设定输出格式(format) 高于后缀名-ss开始时间-t时间长度codec编解码 表格2&#xff1a;音频参数 参数说明-aframes设置要输出的音频帧数-f音频帧深度-b:a音频码率-ar设定采样率-ac设定声音的Channel数-acodec设定…

Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌套list等场景

实体字段比较器&#xff08;对比两组对象找出发生变化的字段工具类开发&#xff09; 支持枚举映射 支持时间 支持显示对应字段中文描述 支持嵌套list等场景 下载地址&#xff1a; Java-对比两组对象找出发生变化的字段工具-支持枚举映射-支持时间-支持显示对应字段中文描述-嵌…

15. git push

基本概述 git push 的作用是&#xff1a;把本地分支的提交推送到远程仓库。推送分支需要满足快进规则&#xff08;Fast-Forward&#xff09;&#xff0c;即远程分支的最新提交必须是本地分支的直接祖先&#xff0c;这个是通过哈希值值进行判断的。 基本用法 1.完整格式 git…

训练数据清洗(文本/音频/视频)

多数据格式的清洗方法 以下是针对多数据格式清洗方法的系统性总结&#xff0c;结合Python代码示例&#xff1a; 一、数据清洗方法总览&#xff08;表格对比&#xff09; 数据类型核心挑战关键步骤常用Python工具文本非结构化噪声去噪→分词→标准化→向量化NLTK, SpaCy, Jie…

Python标准库json完全指南:高效处理JSON数据

一、json库概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;Python的json模块提供了JSON数据的编码和解码功能。该模块可以将Python对象转换为JSON字符串&#xff08;序列化&#xff09;&#xff0c;也可以将JSON字符串转换为Python对象&#xf…

微软推出首款量子计算芯片Majorana 1

全球首款拓扑架构量子芯片问世&#xff0c;2025年2月20日&#xff0c;经过近20年研究&#xff0c;微软推出了首款量子计算芯片Majorana 1&#xff0c;其宣传视频如本文末尾所示。 微软表示&#xff0c;开发Majorana 1需要创造一种全新的物质状态&#xff0c;即所谓的“拓扑体”…

【QT】QT中的文件IO

QT中的文件IO 一、有关文件IO的类二、步骤1、定义QFile的对象,与要读写的文件绑定在一起2、打开文件3、读写文件1&#xff09;读取文件2&#xff09;写入文件 4、关闭文件5、示例代码&#xff1a; 三、QString和QByteArray之间的转换1、方法2、示例代码&#xff1a; 四、QFileI…

Nginx 499 错误的原因及解决方法

Nginx 499 错误的原因及解决方法 原因 客户端超时&#xff1a; 客户端在等待服务器响应时超时&#xff0c;导致连接被关闭。 解决方法&#xff1a;优化服务端响应时间&#xff0c;或调大客户端的连接超时时间。 服务端响应过慢&#xff1a; 后端服务处理请求时间过长。 解决方法…

Smith-Waterman 算法(C++实现)

本文实现Smith-Waterman 算法案例&#xff0c;用于局部序列比对。该算法是生物信息学中用于寻找两个 DNA、RNA 或蛋白质序列之间最优局部比对的经典算法&#xff0c;广泛应用于序列相似性分析和功能预测。 问题描述 给定两个生物序列 seq1 和 seq2&#xff0c;如何找到它们的最…

安卓玩机工具-----安卓机型通用 无损备份与恢复数据的工具BackupToolkit 操作过程

常规安卓机型数据备份与恢复的方法及工具 安卓设备的数据备份与恢复是保护个人数据的重要手段之一。以下是几种常用的方法和工具&#xff1a; 方法一&#xff1a;利用内置的云服务进行备份 许多安卓设备提供了内置的云服务&#xff0c;例如华为手机可以通过“华为云空间”来…

oracle 动态性能视图

Oracle 数据库中的 V$SQLAREA 是一个动态性能视图&#xff08;Dynamic Performance View&#xff09;&#xff0c;用于记录共享池&#xff08;Shared Pool&#xff09;中所有 SQL 语句的统计信息。每个 SQL 语句在共享池中存储为一个游标&#xff08;Cursor&#xff09;&#x…

OceanBase V4.3.5 上线全文索引功能,让数据检索更高效

近日&#xff0c;OceanBase 4.3.5 BP1 版本正式推出了企业级全文索引功能。该版本在中文分词、查询效率及混合检索能力上进行了全面提升。经过自然语言模式和布尔模式在不同场景下的对比测试&#xff0c;OceanBase 的全文索引性能明显优于 MySQL。 点击下载 OceanBase 社区版…