当前位置:网站首页>锚点导航小demo
锚点导航小demo
2022-07-05 13:47:00 【wade3po】
锚点导航这种功能应该很常见,早之前就分享过移动端移动端导航简单实现,配合起来就很容易实现可移动的锚点导航,而且不是用hash模式。当然,PC端也能直接用。
先上效果:
为了方便直接用vue语法,首先要给每一个块一个唯一的ref,然后初始化的时候记录每一个块距离顶部的距离和每一个块的高度,并监听滚动:
this.$nextTick(() => {
this.firstOffsetTop = this.$refs[this.currentKey][0].offsetTop;
document.addEventListener('scroll', this.onScroll);
this.list.forEach((val) => {
this.itemOffsetTop.push({
key: val.key,
num: this.$refs[val.key][0].offsetTop - this.firstOffsetTop,
height: this.$refs[val.key][0].clientHeight
});
});
});
最重要的三个方法:
onScroll(){
const scrollTop = document.documentElement.scrollTop;
this.itemOffsetTop.forEach((val, index) => {
if(scrollTop > val.num && scrollTop - val.num > val.height / 2){
if(index == this.itemOffsetTop.length - 1){
this.currentKey = this.itemOffsetTop[index].key;
}else {
this.currentKey = this.itemOffsetTop[index + 1].key;
}
}else if(scrollTop < this.itemOffsetTop[0].height / 2){
this.currentKey = this.itemOffsetTop[0].key;
}
})
},
//点击锚点定位
changeKey(key){
document.removeEventListener('scroll', this.throttledScrollHandler);
this.currentKey = key;
let to = this.$refs[key][0].offsetTop - this.firstOffsetTop;
this.animationScrollTo(document.documentElement, to);
},
//锚点定位动画滚动
animationScrollTo(el, to) {
let scrollY = 0;
const beginY = el.scrollTop;
const raf = window.requestAnimationFrame || (func => setTimeout(func, 10));
const moveFn = () => {
if (beginY - to < 0) {
scrollY += (to - beginY) / 30;
if(scrollY <= (to - beginY)){
el.scrollTop = beginY + scrollY;
raf(moveFn);
}else {
el.scrollTop = to;
document.addEventListener('scroll', this.throttledScrollHandler);
}
}else if(beginY - to > 0){
scrollY += (beginY - to) / 30;
if(scrollY <= (beginY - to)){
el.scrollTop = beginY - scrollY;
raf(moveFn);
}else {
el.scrollTop = to;
document.addEventListener('scroll', this.throttledScrollHandler);
}
}
};
raf(moveFn);
}
先判断上滑还是下滑,每次滑动距离除以30,当作滑动的速度,这边注意一点,如果滑动距离为0的情况下是要处理的,否则滚动条会卡住,之前就是一个变量判断是否大于0,结果滚动条卡住了。滚动加点动画效果直接用requestAnimationFrame ,一般都兼容,如果不兼容就用定时器,定时器会比较不顺滑。
监听滚动计算滚动的距离是否大于记录的距离,且超过一半就算下一个,菜单上面定位到下一个。
完整demo:
https://github.com/wade3po/demoCode
锚点导航1.html是更简便,不过兼容性不一定更好。

边栏推荐
- ZABBIX monitoring
- Solution to the prompt of could not close zip file during phpword use
- FPGA learning notes: vivado 2019.1 add IP MicroBlaze
- leetcode 10. Regular expression matching regular expression matching (difficult)
- 今年上半年,通信行业发生了哪些事?
- When there are too many input boxes such as input transmitted at one time in the form, the post data is intercepted
- js 从一个数组对象中取key 和value组成一个新的对象
- MySQL - database query - sort query, paging query
- [server data recovery] a case of RAID5 data recovery stored in a brand of server
- 法国学者:最优传输理论下对抗攻击可解释性探讨
猜你喜欢

私有地址有那些

The real king of caching, Google guava is just a brother

华为推送服务内容,阅读笔记

How to deal with the Yellow Icon during the installation of wampserver

Self built shooting range 2022

研究生可以不用学英语?只要考研英语或六级分数高!

Scientific running robot pancakeswap clip robot latest detailed tutorial

南理工在线交流群

RK3566添加LED

About the problem and solution of 403 error in wampserver
随机推荐
荐号 | 有趣的人都在看什么?
The real king of caching, Google guava is just a brother
RK3566添加LED
Record in-depth learning - some bug handling
嵌入式软件架构设计-消息交互
不知道这4种缓存模式,敢说懂缓存吗?
Matlab paper chart standard format output (dry goods)
Parsing XML using Dom4j
搭建一个仪式感点满的网站,并内网穿透发布到公网 2/2
Summit review | baowanda - an integrated data security protection system driven by compliance and security
2022年机修钳工(高级)考试题模拟考试题库模拟考试平台操作
redis6主从复制及集群
How to divide a large 'tar' archive file into multiple files of a specific size
When using Tencent cloud for the first time, you can only use webshell connection instead of SSH connection.
今年上半年,通信行业发生了哪些事?
真正的缓存之王,Google Guava 只是弟弟
Jenkins installation
Interviewer soul torture: why does the code specification require SQL statements not to have too many joins?
ZABBIX monitoring
【MySQL 使用秘籍】一网打尽 MySQL 时间和日期类型与相关操作函数(三)