JavaScript 获取滚动条位置并将页面滑动到锚点


Posted in Javascript onFebruary 08, 2021

前言

这篇来记录下最近工作中遇到的一个问题,在app原生和前端h5混合开发的过程中,其中一个页面是选择城市列表的页面,类似于美团饿了么城市选择,银行app中银行列表选择,通讯录中快速定位到联系人选择的锚点位置等这样的功能,作为刚入门不久的我来说,感觉这个功能还是有一点压力。下面我来分享一下我所查到的一些实现方法。

什么是锚点问题

对于pc端网页来说,常见的网页右侧的回到顶部按钮,点击直接跳转到网页最上面,就是锚点的实现;

对于移动端来说,打开你手机的通讯录,点击右侧的字母,页面直接跳转到对应字母的联系人,这也是锚点的实现。

常见的解决方法

1.<a>标签中href属性设置为跳转元素的id的值

<style>
    #mydiv{
      height: 1200px;
      width: 100%;
      background-color: pink;
      position: relative;
    }
    a{
      position: absolute;
      top: 1000px;
      left: 1000px;
    }
 </style>
  <div id="mydiv">
    我是网页顶部
  </div>
  <a href="#mydiv" rel="external nofollow" >回到顶部</a>

上面的办法相当于设置一个超链接,a标签直接跳转,但是这样回改变浏览器地址栏中的地址,感觉不太实用

2.原生js获取滚动条位置,并作出改变scrollTop

<style>
    body{
      position: relative;
    }
    h1{
      margin: 0 auto;
    }
    .mybtn1{
      position: fixed;
      left: 200px;
      top: 500px;
    }
    .mybtn2{
      position: fixed;
      left: 200px;
      top: 550px;
    }
  </style>
<body>
  
 <h1 id="topH1">1</h1>
  
<h1>2</h1>
  
<h1>3</h1>
  
<h1>4</h1>
  
<h1>5</h1>
  
<h1>6</h1>
  
 <h1>7</h1>
  
 <h1>1</h1>
  
<h1>2</h1>
  
 <h1>3</h1>
  
 <h1>4</h1>
  
 <h1>5</h1>
  
<h1>6</h1>
  
<h1>7</h1>
  
 <h1>1</h1>
  
<h1>2</h1>
  
<h1>3</h1>
  
<h1>4</h1>
  
<h1>5</h1>
  
<h1>6</h1>
  
 <h1 id="tobtmH1">7</h1>
  <button class="mybtn1"  onclick="toTop()">回到顶部</button>
  <script>
   function toTop(){
    var topH1 = document.getElementById("topH1")
    document.documentElement.scrollTop=topH1.offsetTop 
    window.pageYOffset=topH1.offsetTop 
    document.body.scrollTop=topH1.offsetTop ;
    
   }
  </script> 

</body>

这种方法就是给按钮添加点击事件,触发点击事件后改变滚动条位置,但是这种办法需要处理兼容型问题比较麻烦,pc端移动端亲测有效。

3.element.scrollIntoview使得滚动条根据视图发生变化

<style>
    body{
      position: relative;
    }
    .mydiv{
      margin-top: 100px;
      border: 1px solid pink;
    }
    h1{
      margin: 0 auto;
    }
    .mybtn1{
      position: fixed;
      left: 200px;
      top: 500px;
    }
    .mybtn2{
      position: fixed;
      left: 200px;
      top: 550px;
    }
</style>
<body>
  <div class="mydiv">
  <h1 id="topH1">1</h1>
  <h1>2</h1>
  <h1>3</h1>
  <h1>4</h1>
  <h1>5</h1>
  <h1>6</h1>
  <h1>7</h1>
  <h1>1</h1>
  <h1>2</h1>
  <h1>3</h1>
  <h1>4</h1>
  <h1>5</h1>
  <h1>6</h1>
  <h1>7</h1>
  <h1>1</h1>
  <h1>2</h1>
  <h1>3</h1>
  <h1>4</h1>
  <h1>5</h1>
  <h1>6</h1>
  <h1 id="tobtmH1">7</h1>
</div>
  <button class="mybtn1"  onclick="toTop()">回到顶部</button>
  <button class="mybtn2" onclick="toBtm()">去到底部</button>
  <script>
    window.onload=function(){

    }
  // 调用方法为element.scrollIntoview()
  //参数为true时,页面或者容器发生滚动,使得element的顶部与视图容器顶部对齐
  //参数为false时,使得element的底部与视图容器底部对齐
    function toTop(){
      var topH1 = document.getElementById('topH1')
      topH1.scrollIntoView(true)
    }
    function toBtm() {
      var tobtmH1 = document.getElementById('tobtmH1')
      tobtmH1.scrollIntoView(false)
    }
  </script> 
</body>

上面这种方法是将锚点跳转到视图的顶部或者底部,没有太多弊端,pc端移动端亲测有效。

进阶的解决方法

进阶的方法就是调用第三发插件better-scroll,这种方法还没有亲测,查看资料也没有太多的坑,需要的自己添加使用下。

以上就是JavaScript 获取滚动条位置并将页面滑动到锚点的详细内容,更多关于JavaScript 滚动条滑动到锚点的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript 定义新对象方法
Feb 20 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
Apr 25 Javascript
纯javascript模仿微信打飞机小游戏
Aug 20 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
原生JS实现层叠轮播图
May 17 Javascript
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
详解.vue文件中监听input输入事件(oninput)
Sep 19 Javascript
Next.js实现react服务器端渲染的方法示例
Jan 06 Javascript
JS实现的简单tab切换功能完整示例
Jun 20 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
JavaScript实现原型封装轮播图
Dec 27 Javascript
详解Vue的七种传值方式
Feb 08 #Vue.js
Handtrack.js库实现实时监测手部运动(推荐)
Feb 08 #Javascript
js 执行上下文和作用域的相关总结
Feb 08 #Javascript
微信小程序tab左右滑动切换功能的实现代码
Feb 08 #Javascript
用Javascript实现发送短信验证码间隔功能
Feb 08 #Javascript
原生js 实现表单验证功能
Feb 08 #Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 #Javascript
You might like
第五节 克隆 [5]
2006/10/09 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
php版微信公众平台回复中文出现乱码问题的解决方法
2016/09/22 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
简单实现jquery隔行变色
2017/11/09 jQuery
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
JavaScript监听一个DOM元素大小变化
2020/04/26 Javascript
[53:50]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python计算牛顿迭代多项式实例分析
2015/05/07 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
深入理解Python中的*重复运算符
2017/10/28 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
python中的常量和变量代码详解
2018/07/25 Python
对python cv2批量灰度图片并保存的实例讲解
2018/11/09 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
vscode调试django项目的方法
2020/08/06 Python
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
.NET概念性的面试题
2012/02/29 面试题
大学生通用个人的自我评价
2014/02/10 职场文书
致100米运动员广播稿
2014/02/14 职场文书
广告创意求职信
2014/03/17 职场文书
第二课堂活动总结
2014/05/07 职场文书
Redis如何实现分布式锁
2021/08/23 Redis