2020-12-31

聊聊页面中的锚点效果和回到顶部

页面中的锚点各位想必都“了如指掌”,其基于a链接“同页面跳转”和“id属性标签的历史问题”。

可能有人不知道的是:HTML中的“id”非常神奇:id属性的元素不仅可以在js中直接使用,而不必先获取;还可以和url相关联。
直接用id访问是旧版本js遗留下来的特性,浏览器会建立window实例的id同名属性,这是为了兼容旧的网页。但不要依赖这个特性,在含有特殊字符或者和window实例的其他属性有冲突时可能失效。

我们都知道,锚点应该这样用:

<a href="这里写#号+id名">去这里a>

<div id=上面a中引用的id名>我是目的地div>

  • 1
  • 2
  • 3

如此便可。

但是这里面有两个小问题:

  1. 使用锚点后url中也会带有href中的字符串(#号+id名)
  2. 因为是类似跳转方式,所以过程非常生硬

比如有的网页中有这样的效果:点击侧边栏或顶部某一个div后整个页面滑动到相应的位置,就像这样——

以前来说用锚点肯定是不现实的,所以我们需要找到一个适合的API。

按照需求,即点击某个div后对应部分的顶部要“刚好”到窗口可视区的顶部!这里面我们要考虑的一定是“如何算div的顶部在窗口可视区顶部”。
js提供了一个有趣的API可以完成我们的需求 —— getBoundingClient() ,它相当于是封装了client API并把它应用在普通元素上,通过它我们能得到此元素距离可视区顶部、左边的距离,比如:
getBoundingClient-API

并且根据上一篇文章(点击阅读文章)中所提,document下的scrollTop API可为我们提供文档流(页面整体区域)向上滚动了多少距离。

笔者在这里再次提醒各位要区分js中inner系、page系、client系、offset系、outer系、screen系…事件,他们的含义各不相同。比如常说的offsetTop/Left,是距离上一级父元素的上/左边距,通常用 if(dom.parentElement) 做累加求的是“距离文档流顶部的距离”,就不适用于此处。

将二者结合起来使用,就可以达到:若想要展示的区域在下方,就让文档流不断向上滚动,直到此区域滑动到可视区顶端;反之若想要展示的区域已经滑过,就让文档流不断向下滚动。

/**
	leftBtn:侧边栏中所有负责页面滚动的div,都有一个class属性为left-btn
	i:left-btn所属div的下标(第几个)
	.mao1/2/3:页面中负责“滑到顶部”的div,一般是某一个区域的小标题
*/
let leftBtn=document.querySelectorAll(".left-btn")

function gotoTop(i,top){
var timer=null;
leftBtn[i].onclick=function(){
let scrollTop=document.body.scrollTop ||document.documentElement.scrollTop || window.pageYOffset
// 若目标位置在当前位置上方
if(scrollTop>top){
clearInterval(timer)
timer=null;
timer=setInterval(function(){
scrollTop=scrollTop-90<top?top:scrollTop-90;
document.body.scrollTop=document.documentElement.scrollTop=window.pageYOffset=scrollTop
if(scrollTop<=top){
clearInterval(timer);
timer=null;
}
},50)
// 目标位置在当前位置下方
}else if(scrollTop<top){
clearInterval(timer)
timer=null;
timer=setInterval(function(){
scrollTop=scrollTop+90>top?top:scrollTop+90;
document.body.scrollTop=document.documentElement.scrollTop=window.pageYOffset=scrollTop
if(scrollTop>=top){
clearInterval(timer);
timer=null;
}
},50)
}
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

使用如:

let one_top=document.querySelector(".mao1").getBoundingClientRect().top
let two_top=document.querySelector(".mao2").getBoundingClientRect().top
let thr_top=document.querySelector(".mao3").getBoundingClientRect().top
gotoTop(0,one_top);
gotoTop(1,two_top);
gotoTop(2,thr_top);

 
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这样就能达到上面展示的效果了。

这里面需要注意的是:setInterval() 定时器的清除!
如果上方代码去掉第14、15、26、27行,则页面滚动行为会发生错误。看上去似乎是clearInterval失效了!其实这个问题本身是由于js定时器特性产生的。clearInterval是根据定时器本身的标识来进行清除的,如果在期间生成了新的interval,并覆盖timer标识对象,旧有的timer定时器对象并不会被停止和清除,而且标识也会丢失导致再也无法被清除,所以写定时器时一定要注意。建议在调用某个定时器任务的函数的时候,一定一开始就把之前的定时器先清除!

这个问题到这里似乎很好的解决了。但是上面代码毕竟还是太长了,而且里面要进行严格的判断以决定开始和结束(定时器的增加和删除),似乎稍有不妥。

不过别急,js更新了另一个神器 —— scrollIntoView() ,原先这个API的作用就是让指定的div的顶部跳到窗口可视区顶部(从效果上看类似锚点),但是更新后增加了配置参数:

dom.scrollIntoView({
	behavior:"smooth"   // !
})

 
   
   
   
   
  • 1
  • 2
  • 3

这个参数的作用就是“平滑滚动”!不过由于新所以兼容性目前还不算很好,但是也无妨,毕竟它原本的作用还在,可以把新特性当做“只对少数用户更新的体验”。


说完了锚点效果,来说说页面中普遍存在的“回到顶部”。

同样的,之前笔者做社团官网的时候就采用了控制scrollTop不断--的方法。现在看来太麻烦了,用上面提到的 scrollIntoView() API就可完成:
目前大部分官网/网站都采用了在页面顶部(左上角)放一张logo的形式。针对使用这种形式的网站,若是logo所在div不是采用 position:fixed; 的方式固定在顶部的话,我们可以将img外面包裹一层a标签,然后就可以在“回到顶部”按钮的事件中这么写:

document.links[0].scrollIntoView({
	behavior:"smooth"
})
//或者 直接定位图片
document.images[0].scrollIntoView({behavior:"smooth"})

 
   
   
   
   
  • 1
  • 2
  • 3
  • 4
  • 5

这里还要提到js中后来新加入的两个原生API:scrollTo(滚动到哪里) 和 scrollBy(滚动多少距离)。这里为啥提到这俩?因为scrillTo这个API可以在ie上使用!它被支持在window上,比如:回到顶部window.scrollTo(0,0);
但这里也只是提一句让各位有个印象,非要用在本文所提场景下则大可不必。


说到这,前几天惊奇的发现CSS中多了一个控制页面滚动的属性!(去年年底开始支持的)原生平滑滚动定位 —— scroll-behavior ,它有两个值:

  1. auto:初始值。啥也没有。
  2. smooth:作用在滚动容器元素上,可以让容器内的滚动变得平滑。

比如在笔者文章中多次出现的tab框切换,如果你只设置了父容器的 overflow:hidden; 而子元素采用了相对父元素定位的方式展示(display、opacity、visibility都不行,因为他们本质上都不是通过位置移动展示元素的),那么就可以在父容器上加上一行:scroll-behavior: smooth;

效果贼好,生动了许多!

还有上面说的“回到顶部”(和“锚点”),如果不想用js实现而且又不抗拒url后面的小小“#”的话,其实你可以这么实现:

/** css样式 */
html, body { scroll-behavior:smooth; }

 
   
   
   
   
  • 1
  • 2
<a href="#">返回顶部a>

 
   
   
   
   
  • 1

包括上面的“锚点效果”也可以这么来~

perfect!


元旦将至,提前祝各位元旦快乐,溜了溜了~

行舟客 CSDN认证博客专家 ECMAScript 6 Node.js CSS
江湖人称“云小梦”。一个大前端路上还未“毕业”的“小学生”。爱好分享、执着探索、乐于开源;曾参与过中大型微信小程序项目前端开发,并主导过一些官网(原生)开发;着迷于vue、node、css以及原生js技术。热衷研究现有技术的成型创新应用。目前对前端AI和RTC感兴趣。开源且目前维护的有:微信小程序扩展组件库—— https://github.com/1314mxc/yunUI ,欢迎star!
腾讯位置服务开发应用征文大赛开启报名!大疆无人机等你来挑战!
12-28
如今与地图相关的位置服务已经成为开发者工具箱里的“标配”,不管是小程序开发、获取定位信息还是展示地图上的某个地点。现在分享你和腾讯位置服务有关的故事,可以是使用教程、案例分享、知识总结…大疆无人机、王者荣耀机器人多重好礼陪你跨年!
vue-router 页面跳转,返回到顶部的几种方式
胡聊前端的博客
12-24 274
标准答案: const router = new VueRouter({ routes, // 对于 页面跳转,全部都返 回到 页面 顶部。 scrollBehavior(to, from, savedPosition) { return { x: 0, y: 0 }; }, });

如上,简单解释一下,其实scrollBehavior这个api初衷应该是用于定位点的。也就是比如你的页面有一些

这种点,希望在跳转路由之后自动


  • <
  • 1
  • 2
  • >
对单页面应用与Router的一些思考
CSDN文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新
04-27 1278
昨晚鑫哥到我宿舍聊天,聊了很多,从各自公司用的技术到杭州和深圳的房价,从后端技术到前端技术,一直聊到凌晨一点多,直到鑫哥被室友“驱逐”出去。中间有一段聊到公司用到的React,提到了单 页面应用和Router,觉得思路很好有必要写个笔记记下来。

最开始的网页

早期的网页都是一个个独立的html页面,通过a标签从这个页面跳转到另外一个页面。但是同一个网站中的两个页面很多内容都是相同的,比如页头…


A标签使用javascript:伪协议
weixin_30693683的博客
03-15 344
一、前言 今天,遇到一个别人挖的坑,问题是这样的。 做了一个列表页,可以筛选数据,有很多筛条件。主要是有input复选框和标签两种。如图:

其中房价的筛选条件使用标签,代码如下

1 150元-300元

用javasc…


聊聊 页面 中的 效果回到 顶部_ZZ100861122的博客
12-30
聊聊 页面 中的 效果回到 顶部 页面 中的 点各位想必都“了如指掌”,其基于a链接“同 页面跳转”和“id属性标签的历史问题”。 可能有人不知道的是:HTML 中的...
采微博_chen782079048的博客
12-28
聊聊 页面 中的 效果回到 顶部 go语言开发日志系统 Sqlserver 之 CROSS APPLY 与 OUTER APPLY <--> INNER/LEFT JOIN java简单滚动字幕 python编程开发之...
iphone开发笔记和技巧总结
05-28 7775
在iphone程序中实现截屏的一种方法: //导入头文件   #importQuartzCore/QuartzCore.h //将整个self.view大小的图层形式创建一张图片imageUIGraphicsBeginImageContext(self.view.bounds.size); [self.view.layerrenderInContext:UIGraphicsGetCurren
史上最全Windows&Mac系统各种快捷键大全(1000余个)
weixin_34245082的博客
01-03 283
史上最全Windows&Mac系统各种快捷键大全(1000余个) Windows NT6.2+专用快捷键:Windows+F搜索文件或文件夹Windows+空格键切换语言或输入法(如果启用了多种语言或输入法)Windows+L锁定计算机或切换用户Windows+Tab在已打开应用程序间循环切换(开始屏幕)Windows+P选择演示显示模式Windows+E打开...
JMX学习笔记(一)_java_huashan的专栏
12-28
聊聊 页面 中的 效果回到 顶部 go语言开发日志系统 Sqlserver 之 CROSS APPLY 与 OUTER APPLY <--> INNER/LEFT JOIN java简单滚动字幕 python编程开发之...
JIRA-2-JIRA之高级搜索及分析报告_起舞的日子
12-28
聊聊 页面 中的 效果回到 顶部 go语言开发日志系统 Sqlserver 之 CROSS APPLY 与 OUTER APPLY <--> INNER/LEFT JOIN java简单滚动字幕 python编程开发之...
老男孩上海校区Python面试题
DominicJi的博客
11-08 5291
python面试题 第一章:python基础 数据类型: 1 字典: 1.1 现有字典 dict={‘a’:24,‘g’:52,‘i’:12,‘k’:33}请按字典 中的 value 值进行排序? 1. sorted(dict.items(),key = lambda x:x[1])

1.2 说一下字典和json的区别?

  1. 字典是一种数据结构,json是一种数据的表现形式,字典的key值只要是…

微信小程序踩坑集合
weixin_30326515的博客
03-07 2931
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1476434677599 3:设计指南:https://mp.weixin.qq.com/debug/wxadoc/design/index.html 4:设计...
基于用户的协同过滤算法的电影推荐系统_行者小朱的博客
12-28
聊聊 页面 中的 效果回到 顶部 go语言开发日志系统 Sqlserver 之 CROSS APPLY 与 OUTER APPLY <--> INNER/LEFT JOIN java简单滚动字幕 python编程开发之...
最大数对差_打酱油的专栏
12-28
聊聊 页面 中的 效果回到 顶部 go语言开发日志系统 Sqlserver 之 CROSS APPLY 与 OUTER APPLY <--> INNER/LEFT JOIN java简单滚动字幕 python编程开发之...
Vue的完整学习笔记(介绍,基础语法,组件开发与通信,模块化概念,webpack,vue-cli,vue-router,vuex,axios)
小莫の咕哒君
07-20 611
前端发展和架构 先聊一下前端开发模式的发展。

静态页面

最初的网页以HTML为主,是纯静态的网页。网页是只读的,信息流只能从服务端到客户端单向流通。开发人员也只关心页面的样式和内容即可。

异步刷新,操作DOM

1995年,网景工程师Brendan Eich 花了10天时间设计了JavaScript语言.
随着JavaScript的诞生,我们可以操作页面的DOM元素及样式,页面有了一些动态的效果,但是依然是以静态为主。
ajax盛行:

2005年开始,ajax逐渐被前端开发人员所重视,因为不用刷新页


揭秘用小程序裂变给公众号涨粉10w的7个案例
xinmei6的博客
08-22 1万+

2017年1月9日,张小龙宣布小程序上线,到今天,陆陆续续出现了拼多多、摩拜单车、语音红包、头脑王者、心理测试等爆款小程序。今天来和大家聊聊如何利用好这巨大的流量洼地来给公众号涨粉。

一.带你飞

「带你飞」是一款订机票的服务号,以全球免费机票为诱饵,通过“集碎片”的玩法,引导用户转发小程序到微信群,获得抽奖机会。再以获取中奖通知为理由引导用户关注「公众号」

用户路径:

1.点击微…


©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页

博主有话说

江湖人称“云小梦”。一个大前端路上还未“毕业”的“小学生”。爱好分享、执着探索、乐于开源;曾参与过中大型微信小程序项目前端开发,并主导过一些官网(原生)开发;着迷于vue、node、css以及原生js技术。目前对RTC和前端AI感兴趣。


开源项目:
  1. 已开源(并维护) ☞ 微信小程序功能组件库 至 GitHub, 欢迎star!
  2. 已开源 ☞ 纯前端图片在线处理工具 至 GitHub,欢迎体验和star!
  3. 整理、总结并开源 ☞ CSS开发实践文档 至 GitHub,欢迎阅读和star!


我的QQ(非诚勿扰,仅供技术讨论,暂时不接项目,加好友请注明来自 CSDN) 2020-12-31_第2张图片

热门文章

  • 菜鸟前路---c/c++小游戏 22007
  • 微信小程序中data-key属性:数据传输 10753
  • 前端项目分析:我是如何做图片优化的(预加载、懒加载和延迟加载) 10509
  • CSS3+JS完美实现放大镜模式 10300
  • 关于CSS3一些新属性的一些思考:夜间模式、区域阴影、透明度 10158

分类专栏

  • 高效前端:前端性能优化实践 38篇
  • 笔记
  • vue内部实现原理分析 3篇
  • 探索nodeJS 10篇
  • 笑谈网络协议 8篇
  • JavaScript设计模式与开发实践 12篇
  • 小程序的浪潮·初探 16篇
  • 奇幻CSS世界 25篇
  • 实战vue:由浅入深,透彻解读 20篇
  • 排序算法详解 2篇
  • MySQL性能优化:挑战高流量 2篇
  • mysql基础 7篇
  • mysql进阶 9篇
  • 轻松学算法 24篇
  • 算法入门与进阶 18篇
  • 每日一算 18篇
  • 代码娱乐 5篇
  • java入门与进阶 13篇
  • java-码出高效 8篇
  • C/C++详解 1篇
  • 详解c++ 1篇
  • c++课程设计 1篇
  • c++进阶 5篇
  • c/c++基础 3篇
  • Linux基础与应用
  • 前端时间 28篇
  • HTML基础 10篇
  • HTML5基础 5篇
  • js基础与进阶 11篇
  • vue.js 3篇

最新评论

  • 聊聊页面中的锚点效果和回到顶部

    qq_31182873: 表情包

  • 聊聊页面中的锚点效果和回到顶部

    不正经的kimol君: 写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!

  • 聊聊页面中的锚点效果和回到顶部

    随风丶逆风: 原生就支持scrollIntoview吧?

  • 聊聊页面中的锚点效果和回到顶部

    xun__xing: 这位仁兄高见,着实让人敬佩!

  • 聊聊页面中的锚点效果和回到顶部

    轻叹年华逝,: 感谢大佬分享,很详细。

最新文章

  • 用户体验 | 页面阅读进度提示
  • 小Tip:关于单行/多行文本溢出隐藏的一些看法
  • CSS3+JS完美实现放大镜模式
2020
12月 4篇
11月 4篇
10月 5篇
09月 5篇
08月 7篇
07月 10篇
06月 6篇
05月 2篇
04月 5篇
03月 5篇
02月 6篇
01月 11篇
2019年148篇

你可能感兴趣的:(高效前端:前端性能优化实践,css3,javascript,a链接与锚点,回到顶部效果,id)