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 日期计算算法
Sep 11 Javascript
jQuery自定义事件的简单实现代码
Jan 27 Javascript
jQuery选择器源码解读(七):elementMatcher函数
Mar 31 Javascript
JavaScript对象数组排序函数及六个用法
Dec 23 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
May 19 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
JS简单实现移动端日历功能示例
Dec 28 Javascript
Node.js利用debug模块打印出调试日志的方法
Apr 25 Javascript
基于JavaScript实现淘宝商品广告效果
Aug 10 Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 Javascript
js实现点击按钮复制文本功能
Jul 20 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 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
php短域名转换为实际域名函数
2011/01/17 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jquery实现瀑布流效果分享
2014/03/26 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
Vue-cli 使用json server在本地模拟请求数据的示例代码
2017/11/02 Javascript
基于JS实现html中placeholder属性提示文字效果示例
2018/04/19 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
js实现简单页面全屏
2019/09/17 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
python 实时遍历日志文件
2016/04/12 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
python递归实现快速排序
2018/08/18 Python
对python中的高效迭代器函数详解
2018/10/18 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Python箱型图处理离群点的例子
2019/12/09 Python
Python利用pip安装tar.gz格式的离线资源包
2020/09/14 Python
Stuart Weitzman美国官网:美国奢华鞋履品牌
2016/08/18 全球购物
Skyscanner波兰:廉价航班
2017/11/07 全球购物
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
Linux内核的同步机制是什么?主要有哪几种内核锁
2016/07/11 面试题
医学检验专业个人求职信范文
2013/12/04 职场文书
平民服装店创业计划书
2014/01/17 职场文书
男方婚前保证书
2015/02/28 职场文书
论文致谢词范文
2015/05/14 职场文书
2016年党课培训学习心得体会
2016/01/07 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
MySQL 使用SQL语句修改表名的实现
2021/04/07 MySQL