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

边栏推荐
- PostgreSQL Usage Summary (PIT)
- [cloud resources] what software is good for cloud resource security management? Why?
- Require, require in PHP_ once、include、include_ Detailed explanation of the efficiency of repeated introduction of once class library
- Zhubo Huangyu: it's really bad not to understand these gold frying skills
- Personal component - message prompt
- 【MySQL 使用秘籍】一網打盡 MySQL 時間和日期類型與相關操作函數(三)
- Hide Chinese name
- Internal JSON-RPC error. {"code":-32000, "message": "execution reverted"} solve the error
- Pancake Bulldog robot V2 (code optimized)
- 龙芯派2代烧写PMON和重装系统
猜你喜欢

NFT value and white paper acquisition

Redis6 transaction and locking mechanism

The real king of caching, Google guava is just a brother
Jetpack compose introduction to mastery

ELFK部署

Internal JSON-RPC error. {"code":-32000, "message": "execution reverted"} solve the error

南理工在线交流群

Godson 2nd generation burn PMON and reload system
![[public class preview]: basis and practice of video quality evaluation](/img/d8/a367c26b51d9dbaf53bf4fe2a13917.png)
[public class preview]: basis and practice of video quality evaluation

Laravel框架运行报错:No application encryption key has been specified
随机推荐
内网穿透工具 netapp
French scholars: the explicability of counter attack under optimal transmission theory
【Hot100】33. Search rotation sort array
如何把大的‘tar‘存档文件分割成特定大小的多个文件
C object storage
Zhubo Huangyu: these spot gold investment skills are not really bad
leetcode 10. Regular expression matching regular expression matching (difficult)
真正的缓存之王,Google Guava 只是弟弟
leetcode 10. Regular expression matching regular expression matching (difficult)
Redis6 master-slave replication and clustering
Interviewer soul torture: why does the code specification require SQL statements not to have too many joins?
【公开课预告】:视频质量评价基础与实践
ELK 企业级日志分析系统
uplad_ Labs first three levels
Those things I didn't know until I took the postgraduate entrance examination
Apicloud studio3 WiFi real machine synchronization and WiFi real machine preview instructions
restTemplate详解
这18个网站能让你的页面背景炫酷起来
Solution to the prompt of could not close zip file during phpword use
The development of speech recognition app with uni app is simple and fast.