js:锚点滚动到页面对应区域

锚点跳转到对应页面的区域使用 scrollIntoView

// anchor即你要跳转到的元素
anchor.scrollIntoView({behavior: "smooth",  block: "center",  inline: "nearest"  
});

1、behavior:定义滚动行为。它可以设置为 “auto” 或 “smooth”。默认是 “auto”。
“auto”:立即跳转到元素,没有动画。
“smooth”:平滑地滚动到元素,有动画效果。

2、block:定义垂直方向的对齐方式。它可以设置为 “start”、“center”、“end” 或 “nearest”。默认是 “start”。
“start”:元素的顶部与视口的顶部对齐。
“center”:元素的中心与视口的中心对齐。
“end”:元素的底部与视口的底部对齐。
“nearest”:滚动到最接近视口的位置。

3、inline:定义水平方向的对齐方式。它可以设置为 “start”、“center”、“end” 或 “nearest”。默认是 “nearest”。
“start”:元素的左侧与视口的左侧对齐。
“center”:元素的中心与视口的中心对齐。
“end”:元素的右侧与视口的右侧对齐。
“nearest”:滚动到最接近视口的位置。

下面代码主要是针对具体项目可能遇到的一些问题,主要是我自己做一个记录,上面其实已经给出了答案,大家酌情看下面的内容:
在这里插入图片描述

监听滚动的盒子 html 结构

<div ref="scrollFun"><div class="compute-nav-num" id="navEle1"></div><div class="compute-nav-num" id="navEle2"></div><div class="compute-nav-num" id="navEle3"></div>
</div>

监听滚动的盒子js逻辑

const scrollFun = ref();
onMounted(() => {scrollFun.value.addEventListener('scroll', handleScroll);
});
onBeforeUnmount(() => {scrollFun.value.removeEventListener('scroll', handleScroll)
});
const handleScroll = () => {handleScroll();
};
const closeEventFun = () => {scrollFun.value.removeEventListener('scroll', handleScroll);
}
const openEventFun = () => {scrollFun.value.addEventListener('scroll', handleScroll);
}const handleScroll = () => {if (scrollTimer) {clearTimeout(scrollTimer);}scrollTimer = setTimeout(() => {// compute-nav-num 这个类名是为了收集所有滚动的盒子里的子集const viewList = document.querySelectorAll('.compute-nav-num');let active = 0;if (viewList.length === 0) return;for (let i = 0; i < viewList.length; i++) {const top = (scrollFun as any).value.scrollTop + 30;if (i === 0) {const next = (viewList[i + 1] as any).offsetTop;if (top < next) {active = i;break;}} else {const target = (viewList[i] as any).offsetTop;const next = (viewList[i + 1] as any).offsetTop;if (top > target || top == target) {if (top < next) {active = i;break;}}}}activeNavIndex.value = active + 1;}, 50);
};
const routerClick = (obj: any) => {// i是点亮导航栏的activeNavIndex.value = Number(obj.i);// id是固定的 是控制滚动的viewActive(obj.id);
};
const viewActive = (id: any) => {// 当点击导航栏时清除滚动监听,这是因为scrollIntoView事件,也会触发滚动监听// 关闭主要是因为,最下面总有几个特别小的盒子,滚动其实是无法点亮对应导航栏的// 点击属于最后几个小盒子对应的导航栏时,如果滚动监听也触发了,那最后算的 activeNavIndex肯定不对closeEventFun();const anchor = document.querySelector('#navEle' + id);if (anchor) {anchor.scrollIntoView({behavior: 'smooth'});}// 下面的事件既是滚动的一个事件间隔,争取在滚动结束后,再放开监听setTimeout(() => {openEventFun();}, 850);
}

导航栏组件

// 这里的数据 id之所以写这里,是为了固定id数值,这样是为了适应,导航栏有时在某些情况下
// 需要隐藏一些,这时 index 就是随机的,加上固定id,点击传出,这样 querySelector 才能找到
let navListObj: any = reactive([{name: '工单',id: '1',img: orderInfo,imgActive: orderInfoActive},{name: '来电',id: '2',img: phoneInfo,imgActive: phoneInfoActive}
]);
// 点击传出参数
const emit = defineEmits(["routerClick"]);
const routerClick = (id: any, i: any) => {emit("routerClick", {id: id, i: i});
}
<div class="affix-nav"><ul><li v-for="(obj, i) in navListObj" :key="i"><a @click="routerClick(obj.id, i + 1)" :class="activeNavIndex === i + 1 ? 'active' : ''"><img :src="activeNavIndex === (i + 1) ? obj.imgActive : obj.img" alt=""><span>{{ (obj as any).name1 }}</span><span v-if="(obj as any).name2">{{ (obj as any).name2 }}</span></a></li></ul></div>
.affix-nav {max-height: 60%;position: absolute;right: 5px;top: 0;bottom: 0;margin: auto;z-index: 1000;overflow: auto;background-color: #fff;box-shadow: -2px 2px 10px rgba(0, 0, 0, .5);padding: 20px 8px;border-radius: 5px;ul {padding-left: 0;}li a {text-align: center;display: block;font-size: 12px;margin-bottom: 10px;cursor: pointer;img {position: relative;right: 0;left: 0;margin: auto;padding-bottom: 5px;}span {color: #BBBBBB;line-height: 16px;display: block;}}.active span {color: #f00;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/412364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

51单片机_智能家居终端

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1bh4y1A7ZW/?vd_source6ff7cd03af95cd504b60511ef9373a1d 51单片机是否适合做多功能智能家居控制系统&#xff1f;51单片机的芯片是否具有与WiFi通信的能力&#xff1f;如果有的话&#xff0c;具体有哪些芯片啊&a…

如何正确使用数据库的读写分离

本文已收录至我的个人网站&#xff1a;程序员波特&#xff0c;主要记录Java相关技术系列教程&#xff0c;共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源&#xff0c;让想要学习的你&#xff0c;不再迷茫。 背景 在应用系统发展的初期&#xff0c;我们并不知…

使用Matplotlib绘制3d图形

目录 一&#xff1a;绘制一个正方体 二&#xff1a;绘制一个3*3*3魔方 为了绘制立体&#xff0c;主要用到Matplotlib中的一个函数voxels voxels([x, y, z, ], filled, facecolorsNone, edgecolorsNone, **kwargs) 绘制一组填充体素&#xff0c;所有体素在坐标轴上绘制为1x1x…

dubbo入门案例!!!

入门案例之前我们先介绍一下&#xff1a;zookeeper。 Zookeeper是Apacahe Hadoop的子项目&#xff0c;可以为分布式应用程序协调服务&#xff0c;适合作为Dubbo服务的注册中心&#xff0c;负责服务地址的注册与查找&#xff0c;相当于目录服务&#xff0c;服务提供者和消费者只…

Linux shell美化 zsh+oh-my-zsh+power10k

文章目录 安装zsh安装on-my-zsh安装power10k主题安装power10k将oh-my-zsh主题改为power10k字体 设置安装字体配置字体 power10k配置相关插件安装zsh-autosuggestionszsh-syntax-highlighting安装插件完成&#xff0c;重新加载配置文件 美化效果示意&#xff1a; 安装zsh 安装…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1&#xff1a; sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1&#xff1a; sys int g0/0/0 ip add…

动态住宅代理IP是什么?如何配置使用?

动态住宅代理IP&#xff0c;作为一种高效的网络工具&#xff0c;不仅能够为您的在线活动提供额外的保护层&#xff0c;还能增强匿名性和数据安全。接下来将深入探讨动态住宅代理IP的定义、设置步骤、以及它如何有效保护您的网络隐私和安全。 一、动态住宅代理是什么&#xff1f…

基于改进蝙蝠算法的三维航线规划算法

matlab2020a可正常运行 基于改进蝙蝠算法的三维航线规划资源-CSDN文库

BRC20通证的诞生与未来展望!如何导入bitget教程

BRC-20通证是什么&#xff1f; 嘿&#xff01;你知道BRC-20通证吗&#xff1f;这可是比特币区块链上的超级明星&#xff01;它们不依赖智能合约&#xff0c;而是把JSON代码刻在聪上&#xff0c;聪可是比特币的最小单位哦&#xff01;就像在比特币的乐高积木上盖房子&#xff0…

“重大利好”!以太坊坎昆升级临近!Layer2新玩家Blast不断蚕食市场份额,令竞品汗流浃背?

1月17日&#xff0c;坎昆升级&#xff08;Dencun&#xff09;率先在以太坊Goerli测试网启动&#xff0c;由于Goerli是参与者数量以及网络负载程度最高的测试网&#xff0c;仅次于以太坊主网&#xff0c;因此如果没什么问题&#xff0c;预示着主网升级已经不远。 而现在&#xf…

文件重命名方法:不同路径的文件名大小写如何批量转换技巧

在文件管理中&#xff0c;经常要处理文件重命名的问题&#xff0c;尤其是涉及到不同路径下的文件名大小写转换时。下面来看云炫文件管理器如何批量转换文件名的大小写的技巧&#xff0c;轻松完成这项任务。 准备多个不同路径文件夹&#xff0c;在里面各放几个文件。接下来开始…