博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hash实现锚点平滑滚动定位
阅读量:4606 次
发布时间:2019-06-09

本文共 2918 字,大约阅读时间需要 9 分钟。

一、科普时间

hash

hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)。

location.hash=anchorname。

锚点

锚点是网页制作中的一种,又叫。命名锚记像一个迅速一样,是一种页面内的超级链接

二、锚点简单的栗子

      
伪锚点

锚点1

锚点2

锚点1
锚点2

解析

 访问该页面的地址:http://127.0.0.1/anchor.html(我是在本地服务器上测试的)
 点击a链接锚点1,则页面会直接跳到红色的div(锚点1),同时,浏览器地址改变为http://127.0.0.1/anchor.html#anchor1
 虽然可以直接定位到制定的位置,但是效果很差,没有平缓的过渡效果。

三、改进过渡效果

1)前期理论准备

 既然hash值是对应锚点的id值,那如果改为js动态获取hash值,然后再根据hash值获得dom对象。最后,用js进行平缓过渡。
 基于这个思路,就必须要求hash的取名有独特性,不能跟页面中的任何一个id一致,否则会触发浏览器默认的锚点定位行为。
2)确定特殊hash命名
 hash命名直接取特殊的前缀:w_,比如锚点1对应的hash值为w_anchor1

      
伪锚点

锚点1

锚点2

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

锚点1

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

锚点2

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

3)编写读取特殊hasn值的方法以及缓动方法(本示例不考虑兼容性)

(function(window, undefined){    // 监听页面加载完成后,检查是否需要定位锚点  window.onload = function(){    scrollToAnchor();  };  // 监听地址栏url的hash值改变时,检查是否需要定位锚点  window.onhashchange = function(){    scrollToAnchor();  };  // 滚动到自定义的伪锚点  function scrollToAnchor(){    var hash = getHash(), // 获取url的hash值      anchor = getAnchor(hash), // 获取伪锚点的id      anchorDom, // 伪锚点dom对象      anchorScrollTop; // 伪锚点距离页面顶部的距离    // 如果不存在伪锚点,则直接结束    if(anchor.length < 1){      return;    }    anchorDom = getDom(anchor);    anchorScrollTop = anchorDom.offsetTop;    animationToAnchor(document.body.scrollTop, anchorScrollTop);  }  /*     @function 滚动到指定位置方法    @param startNum {int} -- 开始位置    @param stopNum {int} -- 结束位置  */  function animationToAnchor(startNum, stopNum){    var nowNum = startNum + 10; // 步进为10      if(nowNum > stopNum){        nowNum = stopNum;      }      // 缓动方法      window.requestAnimationFrame(function(){        document.body.scrollTop = nowNum; // 当前示例页面,滚动条在body,所以滚动body        // 滚动到预定位置则结束        if(nowNum == stopNum){          return;        }        animationToAnchor(nowNum, stopNum); // 只要还符合缓动条件,则递归调用      });  }  // 获取锚点id  function getAnchor(str){    return checkAnchor(str) ? str.split("w_")[1] : "";  }  // 判断是否为特殊的hash值,也即是否为伪锚点  function checkAnchor(str){    return str.indexOf("w_") == 0 ? true : false;  }  // 获取hash值  function getHash(){    return window.location.hash.substring(1);  }  // 获取dom对象  function getDom(id){    return document.getElementById(id);  }})(window);

****
:https://wall-wxk.github.io/blogDemo/anchor/anchor.html

最后,附上完整示例源码

      
伪锚点

锚点1

锚点2

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

锚点1

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

锚点2

间隔1

间隔2

间隔3

间隔4

间隔5

间隔6

间隔7

间隔8

:www.jianshu.com/p/aefa75666905

转载于:https://www.cnblogs.com/walls/p/6287891.html

你可能感兴趣的文章
文本CSS
查看>>
JDK1.7新特性,语言篇
查看>>
javaScript判断手机型号
查看>>
应用程序设计:图书管理系统模板(链表+文件)
查看>>
遗传算法学习--多目标优化中的遗传算法
查看>>
Git的安装和使用教程详解
查看>>
列变位法解密----2015年百度之星程序设计大赛 - 资格赛
查看>>
[记录]Wdinwos scikit-learn 安装
查看>>
Tomcat配置多个文件夹
查看>>
Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)
查看>>
该配置节不能包含 CDATA 或文本元素
查看>>
【Matlab】正态分布常用函数normpdf_normcdf_norminv_normrnd_normfit
查看>>
SSH_框架整合4--添加员工信息
查看>>
数据适配器:Adapter
查看>>
MySQL命令行登陆,远程登陆MySQL 的方法
查看>>
mybatis pagehelper分页插件使用
查看>>
2019.3.21 网络基础知识
查看>>
设计模式相关面试问题-单例
查看>>
第四次作业
查看>>
jquery阻止冒泡事件:$('span').bind("click",function(event){event.stopPropagation();})(有用源)...
查看>>