js回到页面指定位置的三种方式


Posted in Javascript onDecember 17, 2020

以前大部分时间都是在做b端相关的项目,在实现此类需求时,通常都是直接借助 a 标签搞定,现在做c端了,对交互性的要求一下就提升了,此时 a 标签就远远不能满足要求了,需要借助js来实现此类需求,特此记录。

a 标签

首先放出html

<body>
  <contain class="test1">
    <a name="topAnchor"></a>
    <div id="top">我是顶部</div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
  </contain>
  <footer>
    <button id="backTop1">第一种方式回到顶部</button>
    <button id="backTop2">第二种方式回到顶部</button>
    <button id="backTop3">第三种方式回到顶部</button>
  </footer>
</body>

然后具体操作步骤如下

  • 将a标签放到指定元素的附近
  • 然后通过点击事件生成 a 标签
  • 触发a标签事件
  • 删除a标签

代码如下

const backTop1 = document.getElementById("backTop1")

  backTop1.addEventListener("click", function (e) {
    let a = document.createElement("a")
    a.href = "#topAnchor"
    e.target.appendChild(a)
    a.onclick = function (e) {
      e.stopPropagation()
    }
    a.click()
    e.target.removeChild(a)
  })

效果如下图所示

js回到页面指定位置的三种方式

效果很明显,在事件触发之后,页面立马跑到的顶部,在交互性没啥要求的时候,这种做法确实没啥问题,不过要求高了之后就不行了,会显得有些突兀。

经大佬提示,可以在style中设置 html, body { scroll-behavior:smooth; },可以达到和下面两个api的behavior 参数为 smooth 的效果是一样的

scrollTo()

此 api 需要传递 DOM元素相对于window的 left 和 top 的距离,此例子仅展示简单demo,只考虑 top 坐标

当然它还有一个 behavior 参数,将其设置为 smooth 后,将会出现滑动效果 步骤如下:

  • 计算目标元素距离顶部的距离
  • 通过事件触发

代码如下:

const backTop2 = document.getElementById("backTop2")
  const TOP = document.getElementById("top")
  const y = TOP.offsetTop
  const backTop3 = document.getElementById("backTop3")
  backTop3.addEventListener("click", function (e) {
    window.scrollTo({ top: y, left: 0, behavior: 'smooth' })
  })

效果如下图所示

js回到页面指定位置的三种方式

从效果上来看,相较于 a 标签,该api支持动画,使得页面更丝滑 不过它对iframe的支持度不够,在我所遇到的项目中iframe的占比还不小,还请谨慎使用

Element.scrollIntoView()

该 api 相较于上一个,节点信息更加的明确,操作方法也更加的简洁,更利于后续的维护

代码如下

const backTop2 = document.getElementById("backTop2")
  const TOP = document.getElementById("top")
  backTop2.addEventListener("click", function (e) {
    TOP.scrollIntoView({ behavior: "smooth" })
  })

效果如下图所示

js回到页面指定位置的三种方式

从效果上来看,该api和scrollTo的作用是一致的,但是从代码结构上来说,scrollIntoView会更加的简洁且在iframe中表现也很优秀,基本上被用到的频率更高

以上三种方法是我目前比较常用的,更多相关js回到指定位置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
js实现在页面上弹出蒙板技巧简单实用
Apr 16 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
Jun 02 Javascript
javascript打印输出json实例
Nov 11 Javascript
javascript分页代码实例分享(js分页)
Dec 13 Javascript
表单提交前触发函数返回true表单才会提交
Mar 11 Javascript
JavaScript日期选择功能示例
Jan 16 Javascript
JS数组交集、并集、差集的示例代码
Aug 23 Javascript
js禁止浏览器页面后退功能的实例(推荐)
Sep 01 Javascript
vue组件之Alert的实现代码
Oct 17 Javascript
vue 组件 全局注册和局部注册的实现
Feb 28 Javascript
微信小程序实现发红包功能
Jul 11 Javascript
IE浏览器下JS脚本提交表单后,不能自动提示问题解决方法
Jun 04 Javascript
javascript 数组(list)添加/删除的实现
Dec 17 #Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
Dec 16 #Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
Dec 16 #Javascript
原生JS实现拖拽功能
Dec 16 #Javascript
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 #Vue.js
You might like
Laravel框架中扩展函数、扩展自定义类的方法
2014/09/04 PHP
discuz图片顺序混乱解决方案
2015/07/29 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
在Laravel 的 Blade 模版中实现定义变量
2019/10/14 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
Javascript 兼容firefox的一些问题
2009/05/21 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
自己编写的类似JS的trim方法
2013/10/09 Javascript
jQuery制作的别致导航有阴影背景高亮模式窗口
2014/04/15 Javascript
简介JavaScript中Math.LOG10E属性的使用
2015/06/14 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
jQuery选择器用法实例详解
2015/12/17 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
详解react-native-fs插件的使用以及遇到的坑
2017/09/12 Javascript
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
简单掌握Python的Collections模块中counter结构的用法
2016/07/07 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
2018/12/14 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
python 从list中随机取值的方法
2020/11/16 Python
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
毕业生就业推荐信范文
2013/12/01 职场文书
2014年手术室工作总结
2014/11/26 职场文书
工作失误检讨书范文
2015/01/26 职场文书
出国留学自荐信模板
2015/03/06 职场文书
丧事主持词
2015/07/02 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Redis持久化与主从复制的实践
2021/04/27 Redis
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers