当前位置:网站首页>锚点导航小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是更简便,不过兼容性不一定更好。

边栏推荐
- Cloudcompare - point cloud slice
- 真正的缓存之王,Google Guava 只是弟弟
- Basic characteristics and isolation level of transactions
- Matlab paper chart standard format output (dry goods)
- Ordering system based on wechat applet
- 龙芯派2代烧写PMON和重装系统
- PHP generate Poster
- 基于微信小程序的订餐系统
- Could not set property ‘id‘ of ‘class XX‘ with value ‘XX‘ argument type mismatch 解决办法
- stm32逆向入门
猜你喜欢

What happened to the communication industry in the first half of this year?

【云资源】云资源安全管理用什么软件好?为什么?

荐号 | 有趣的人都在看什么?

Data Lake (VII): Iceberg concept and review what is a data Lake

嵌入式软件架构设计-消息交互
![[notes of in-depth study paper]transbtsv2: wider instead of deep transformer for medical image segmentation](/img/70/6de0346df8527af6c88db1ff89947b.png)
[notes of in-depth study paper]transbtsv2: wider instead of deep transformer for medical image segmentation

Record in-depth learning - some bug handling
![[cloud resources] what software is good for cloud resource security management? Why?](/img/c2/85d6b4a956afc99c2dc195a1ac3938.png)
[cloud resources] what software is good for cloud resource security management? Why?

About the problem and solution of 403 error in wampserver

Zibll theme external chain redirection go page beautification tutorial
随机推荐
Laravel框架运行报错:No application encryption key has been specified
Apicloud studio3 WiFi real machine synchronization and WiFi real machine preview instructions
Parsing XML using Dom4j
Idea remote debugging agent
What happened to the communication industry in the first half of this year?
restTemplate详解
PostgreSQL Usage Summary (PIT)
4年工作经验,多线程间的5种通信方式都说不出来,你敢信?
Network security - Novice introduction
Solution to the prompt of could not close zip file during phpword use
2022司钻(钻井)考试题库及模拟考试
Redis6 data type and operation summary
内网穿透工具 netapp
Data Lake (VII): Iceberg concept and review what is a data Lake
Prefix, infix, suffix expression "recommended collection"
[cloud resources] what software is good for cloud resource security management? Why?
Introduction to Chapter 8 proof problem of njupt "Xin'an numeral base"
How to deal with the Yellow Icon during the installation of wampserver
Integer = = the comparison will unpack automatically. This variable cannot be assigned empty
uplad_ Labs first three levels