JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

2023-11-06

我们在浏览网页的时候,大部分都有一个一键回到顶部的按钮,无论是pc端还是移动端,这个功能都很常见。我在一次面试的时候,也要求手写这个功能。

首先我们新建一个空页面,把body的高度设置为3000px。这样做的目的是让浏览器出现滚动条,不然我们还得放很多的内容把页面撑起来。

body {
    height: 3000px;
}

html部分我们写两个div,一个是标志位,放在浏览器的顶部,这样我们就能很直观的知道什么时候到了浏览器顶部。另一个div就是我们返回顶部的按钮。

<div id="top">我这里是浏览器的顶部</div>
<div id="logo">返回顶部</div>

还有它们的样式

#logo {
    background-color: rgb(129, 192, 242);
    position: fixed;
    right: 20px;
    bottom: 20px;
    text-align: center;
    width: 90px;
    height: 90px;
    line-height: 90px;
    color: #fff;
    border-radius: 50%;
    display: none;
    cursor: pointer;
}
#logo:hover {
    background-color: rgb(45, 150, 233);
}
#top {
    text-align: center;
    width: 100%;
    background-color: #f3f3f3;
    padding: 20px 0;
}

在实际的应用场景中,这个按钮肯定是滚动条出现滚动事件才会出现,也就是说,一定是当前的位置不在浏览器顶部,这个按钮才有意义,所以我们暂时给它的样式设置为display:none达到一个隐藏的效果。

现在的效果是这样的。
在这里插入图片描述

下面我们开始写核心部分的JS代码。

var oDiv = document.getElementById('logo');
window.onscroll = function() {
    oDiv.style.display = 'block';
    var height = document.documentElement.scrollTop || document.body.scrollTop;
    console.log(height);
    if(height == 0) {
        oDiv.style.display = 'none';
    }
}

首先我们先给浏览器的滚动事件加相应的事件处理函数。我们核心操作的是windowonscroll属性。

如果出现滚动事件,那么我们首先要做的操作是让按钮出现,也就是通过JS把它的display属性设置为block,让它显示出来。

然后要做的一件事是获取当前窗口距离浏览器顶部的距离,因为各个浏览器都存在自己的特性,所以我们需要做兼容处理

document.documentElement.scrollTop || document.body.scrollTop基本上可以兼容所有浏览器。

如果当前窗口距离顶部是0,说明我们已经返回了顶部,那么这个按钮就需要隐藏了,依然是将它的display设置成为none

还有一个核心事件就是这个按钮的点击事件

oDiv.onclick = function() {
    var height = document.documentElement.scrollTop || document.body.scrollTop;
    var t = setInterval(() => {
        height -= 50;
        if(height > 0) {
            window.scrollTo(0,height);
        }else {
            window.scrollTo(0,0);
            clearInterval(t);
        }
    }, 10);
}

我们依然先获取一下当前窗口距离顶部的高度

想实现回到顶部的功能,window对象依然存在一个方法可以使用,那就是scrollTo方法,我们可以都调用这个方法并且传入相应参数,来操作当前窗口滚动到某个坐标。第一个参数是X轴,第二个参数是Y轴。我们这个功能主要操作它的Y轴,所以,第一个参数均传入0即可。

这样虽然可以实现功能,但是经过测试发现,它回到顶部的时间是非常快的,几乎一瞬间就回去了,这样对用户的体验非常不好。所以我们把操作window对象的scrollTo方法写入了一个setInterval定时器中,10ms调用一次,每次滚动50。

在这里插入图片描述
通过效果图可以看到,我们现在已经实现了一个商用网站中回到顶部功能的全部内容。

关于平滑滚动的功能,如果大家不喜欢自己写定时器。可以使用API实现,可以查一下MDN文档,系统为我们提供了API可以实现平滑滚动的效果。

在这里插入图片描述
也就是说,我们可以把点击事件的内容改写为

oDiv.onclick = function() {
    window.scrollTo({
        top:0,
        behavior:"smooth"
    })
}

通过测试,和我们之前写的代码效果是一样的。

大家可能会有疑问,既然有这么好用的API,为什么我还要介绍上面的定时器实现的写法呢?

其实过度使用API并不是什么好事,API不是万能的,只是别人帮我们封装了一份业务代码,来减轻我们的工作量,上面这个behavior属性的底层实现和我们之前写的定时器代码是没有区别的。

所以大家不仅要学过使用API来完成业务功能,也要在闲暇之余要自己手写实现,API可以帮我们提高工作效率,但是并不会提高我们的编码能力我在面试的时候就遇到过很多手写API功能的要求,所以,想提升自己的竞争力,要多写原生代码多实践。

有任何问题欢迎交流!
QQ:505417246
微信:18331092918
微信公众号:Code程序人生
个人博客:https://Creator12333.github.io

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS实现一键回到顶部的功能(兼容所有浏览器,超级详细) 的相关文章

随机推荐

  • 药监局网瑞数绕过与反爬学习

    药监局瑞数反爬学习 贴逆向好的js代码 剩下靠你们自己了 需要返回cookie 否则无限跳转 文件夹中带有nginx静态服务配置 使用nginx后 并在hosts中添加一行app1 nmpa gov cn 你nginx的ip 浏览器访问ht
  • 原生js实现对select下拉列表的内容过滤

    原生js实现对select下拉列表的内容过滤 场景描述 笔者在工作的过程中 经常碰到这样的业务场景 客户要求一个下拉列表框旁边要有一个输入过滤的功能 如下图所示 由于在一个项目中出现了好多这样的需求 笔者就写了个采用原生js实现的对下拉的过
  • 决策树(Decision Tree)

    Author xiaoran Email PursuitFlow 163 com xiaoranone 126 com Datawhale 简介和算法 决策树是机器学习最常用的算法之一 它将算法组织成一颗树的形式 其实这就是将平时所说的if
  • Kompose使用

    参考网址 https kubernetes io docs tools kompose user guide Kompose是一个转换工具 可以将docker compose编排docker compose yaml文件转换为kuberne
  • osgEarth的Rex引擎原理分析(一二九)地图下载器实现原理

    目标 七十二 中问题148 java版本 String iPath http online2 map bdimg com tile qt tile x 4 y 4 z 5 styles pl udt 20171031 scaler 1 p
  • 免费的crm系统部署在自己的服务器,CRM软件的三种部署方式

    企业部署CRM软件有三种不同选择 他们在成本 风险和利益上各有不同 本文将逐一介绍这三类CRM部署方式 本地部署 软件托管和服务器代管 软件即服务 一 CRM本地部署方式 这是将软件客户端 服务器部署在客户本地服务器的一种方式 这种方式为客
  • 神经网络学习小记录63——Keras 图像处理中注意力机制的代码详解与应用

    神经网络学习小记录63 Keras 图像处理中注意力机制的解析与代码详解 学习前言 什么是注意力机制 代码下载 注意力机制的实现方式 1 SENet的实现 2 CBAM的实现 3 ECA的实现 注意力机制的应用 学习前言 注意力机制是一个非
  • 關於 React 中的 Hooks - 完全上手指南

    關於 React 中的 Hooks 完全上手指南 前言 正文 什麼是 Hooks useState 自定義 Hooks useEffect useRef useLayoutEffect useCallback useMemo useRedu
  • C语言进阶——4.宏定义

    C语言进阶 4 宏定义 1 宏定义是什么 宏是用来表示一段代码的标识符 宏也是标识符 也要满足标识符的规则 但通常习惯使用大写字母和下划线命名 2 宏定义怎么用 宏定义通常有三种用法 当作常量使用 当作函数使用 编译预处理 2 1 宏定义常
  • 关于idea出现java: 无效的目标发行版: 8、9、11问题的解决方式

    1 首先Project settings 将环境设置为1 8 2 如果有多个module都要设置一下 3 都设置好了之后点击apply应用 点击ok关闭设置页面 然后点击File gt settings 进入设置页面 找到 Java Com
  • 腾讯策略协作型 AI「绝悟」升级至王者荣耀电竞职业水平

    感谢阅读腾讯AI Lab微信号第80篇文章 本文将介绍腾讯策略协作型 AI 绝悟 最新进展 达到王者荣耀电竞职业水平 长线策略及团队协作能力全面提升 腾讯 AI Lab 与王者荣耀共同探索的前沿研究项目 策略协作型 AI 绝悟 今天在吉隆坡
  • 经典排序算法:快速排序(Quick Sort)

    快速排序算法 快速排序算法被称为20世纪十大算法之一 是最重要的算法之一 是一定要掌握和熟练的 快速排序的基本思想是 分治法 1 先从数列中取出一个数作为基准数 2 分区过程 将比这个数大的数全放到它的右边 小于或等于它的数全放到它的左边
  • jdbc:mysql://127.0.0.1:3306/test_: No suitable driver found for jdbc:mysql://127.0.0.1:3306/bank

    今天遇到个很奇怪的问题 项目登录上去之后 去修改某张表的一条记录 突然报错 No suitable driver found for jdbc mysql 127 0 0 1 3306 bank 项目可以登录 那就不是数据库配置文件的问题
  • 状态压缩技巧:动态规划的降维打击

    刷题认准labuladong 东哥带你手把手撕力扣 点击下方卡片即可搜索 我们号之前写过十几篇动态规划文章 可以说动态规划技巧对于算法效率的提升非常可观 一般来说都能把指数级和阶乘级时间复杂度的算法优化成 O N 2 堪称算法界的二向箔 把
  • 史上最全的maven pom.xml文件教程详解

    原文地址 http www zuidaima com share 1781583829978112 htm
  • 部署Prometheus

    1 解压prometheus压缩包 root node5 tar xf prometheus 2 38 0 linux amd64 tar gz C usr local 2 对压缩后的文件做软连接 root node5 ln sv usr
  • 人工智能技术的应用越来越广,极大促进了无人机产业的发展

    备受关注的第二十三届中国国际高新技术成果交易会 简称 高交会 于12月27日在深圳开幕 本届高交会分别在深圳会展中心 福田 和深圳国际会展中心 宝安 同期举办 吸引了众多优秀展商一展风采 本届高交会采用了 线上 线下 联动的方式 线下展览总
  • Shell脚本基础介绍

    shell基础简介 编写脚本通常使用某种基于解释器的编程语言 而shell脚本不过就是一些文件 我们能将一系列需要执行的命令写入其中 然后通过shell来执行这些脚本 进入Linux系统 Ubuntu 打开终端Terminal 表示普通用户
  • 【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

    系列文章目录 1 文本分类与词嵌入表示 mlp来处理分类问题 2 RNN LSTM GRU三种方式处理文本分类问题 3 评论情绪分类 还是得开个坑 最近搞论文 使用lstm做的ssd的cache prefetching 意味着我不能再划水了
  • JS实现一键回到顶部的功能(兼容所有浏览器,超级详细)

    我们在浏览网页的时候 大部分都有一个一键回到顶部的按钮 无论是pc端还是移动端 这个功能都很常见 我在一次面试的时候 也要求手写这个功能 首先我们新建一个空页面 把body的高度设置为3000px 这样做的目的是让浏览器出现滚动条 不然我们