当前位置: 首页 > news >正文

vue锚点导航

锚点导航在现实中经常遇到,最常见就是文档之类的网站,比如vue官网、react官网、antd官方文档等。今天就写一个锚点导航供需要的人参考,本文是基于vue + element-ui

💥基础功能

除了页面布局外,只需要几行代码就能实现一个简单的导航,通过scrollIntoView(),此方法会滚动元素的父容器,使被调用 scrollIntoView() 的元素对用户可见。效果如下:

QQ录屏20221214194954.gif

语法(更详细的介绍可以参考👉MDN Web Docs)

element.scrollIntoView(); // 等同于 element.scrollIntoView(true)
element.scrollIntoView(alignToTop); // Boolean 型参数
element.scrollIntoView(scrollIntoViewOptions); // Object 型参数

参数

alignToTop(可选):

如果为true,元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的scrollIntoViewOptions: {block: “start”, inline: “nearest”}。这是这个参数的默认值。
如果为false,元素的底端将和其所在滚动区的可视区域的底端对齐。相应的scrollIntoViewOptions: {block: “end”, inline: “nearest”}。
scrollIntoViewOptions(可选)一个包含下列属性的对象:

behavior 可选
定义动画过渡效果, "auto"或 “smooth” 之一。默认为 “auto”。

block 可选
定义垂直方向的对齐, “start”, “center”, “end”, 或 "nearest"之一。默认为 “start”。

inline 可选
定义水平方向的对齐, “start”, “center”, “end”, 或 "nearest"之一。默认为 “nearest”。

<template><el-row :gutter="20"><el-col :span="18"><div class="box-col" id="box"><el-card :id="item.id" class="box-card" v-for="item in navList" :key="item.value"><div slot="header" class="clearfix"><span>{{item.label}}</span></div><div v-for="o in 4" :key="o" class="text item">{{'列表内容 ' + o }}</div></el-card></div></el-col><el-col :span="6"><div class="navBox"><div @click="goAnchor(item.id, item.value)" :class="['navItem', navActive == item.value ? 'active' : '']" v-for="item in navList" :key="item.value">{{ item.label }}</div></div></el-col></el-row>
</template>
<script>
export default {name: "Anchor",data() {return {navActive: 1,navList: [{label: "卡片名称1",value: 1,id: "part1",},{label: "卡片名称2",value: 2,id: "part2",},{label: "卡片名称3",value: 3,id: "part3",},{label: "卡片名称4",value: 4,id: "part4",},{label: "卡片名称5",value: 5,id: "part5",},],};},methods: {// 锚点导航-主要代码逻辑goAnchor(keyId, val) {this.navActive = val;document.getElementById(keyId).scrollIntoView(true);},},
};
</script>
<style scoped>
html {overflow: hidden;
}
.box-col {height: 90vh;overflow-y: auto;box-sizing: border-box;scroll-behavior: smooth;
}
.box-card {height: 500px;margin-bottom: 10px;
}
.navBox {margin-left: 10px;border-left: 2px solid rgba(0, 0, 0, 0.09);
}
.navItem {font-family: PingFangSC-Regular, PingFang SC;font-weight: 400;color: #000000;padding: 10px;margin-left: -2px;cursor: pointer;border-left: 2px solid transparent;
}
.navItem:hover {color: #177be6;
}
.navItem.active {color: #177be6;border-left: 2px solid #177be6;
}
</style>

🔥进阶功能 👉在线运行

现在基础功能已经实现了,处理点击能到指定位置,我们也需要鼠标滚动的时候,锚点也跟着联动,这个有点麻烦,需要监听鼠标滚动事件,先看效果图:

2222.gif

完整js代码如下:

需要注意的一点是,navClickFlag标识,因为,点击的时候scrollIntoView(true)会触发滚动,这个时候执行滚动函数,如果不加的话,锚点active状态会出现抖动,所以添加标识,点击锚点的时候尽量避免滚动函数里的逻辑。

<script>
export default {name: "Anchor",data() {return {//锚点点击标识, 不然active就会来回抖动navClickFlag: false,// 滚动元素idscrollWrap: "box",navActive: 1,navList: [{label: "卡片名称1",value: 1,id: "part1",},{label: "卡片名称2",value: 2,id: "part2",},{label: "卡片名称3",value: 3,id: "part3",},{label: "卡片名称4",value: 4,id: "part4",},{label: "卡片名称5",value: 5,id: "part5",},],// 各锚点的高度offTopLs: [],};},mounted() {// 监听滚动window.addEventListener("scroll", this.handleScroll, true);this.$nextTick(() => {// 计算锚点的高度this.getoffTop();});},beforeDestroy() {// 销毁监听window.removeEventListener("scroll", this.handleScroll);},methods: {// 计算锚点的高度getoffTop() {let offTop = [];for (let index = 0; index < this.navList.length; index++) {const element = this.navList[index];if (document.getElementById(element.id)) {offTop.push(document.getElementById(element.id).offsetTop);}}this.offTopLs = offTop;},// 监听滚动handleScroll() {if (!this.navClickFlag && document.getElementById(this.scrollWrap)) {let scTop = document.getElementById(this.scrollWrap).scrollTop;for (let index = 0; index < this.offTopLs.length; index++) {const element = this.offTopLs[index];let offsetTop = document.getElementById(this.scrollWrap).offsetTop;if (scTop + offsetTop >= element) {this.navActive = index + 1;}}}},// 锚点导航goAnchor(keyId, val) {this.navClickFlag = true;this.navActive = val;document.getElementById(keyId).scrollIntoView(true);setTimeout(() => {this.navClickFlag = false;}, 2000);},},
};
</script>

文章转载自:

http://sN5bTc29.mpdwn.cn
http://MDLuT0vt.mpdwn.cn
http://u3aRuC2i.mpdwn.cn
http://VRfQeFU2.mpdwn.cn
http://6V2JPdAK.mpdwn.cn
http://uan6mLCp.mpdwn.cn
http://er53YYr2.mpdwn.cn
http://ptPoQ0Lv.mpdwn.cn
http://Jmin7mTV.mpdwn.cn
http://BQ30mz1n.mpdwn.cn
http://uwtts4lC.mpdwn.cn
http://3TqXhtqT.mpdwn.cn
http://fygSbkiG.mpdwn.cn
http://edReT1SB.mpdwn.cn
http://VL9WXWpT.mpdwn.cn
http://cfTi0DZo.mpdwn.cn
http://zIWtWFNH.mpdwn.cn
http://AjWRdcbS.mpdwn.cn
http://P22JloCW.mpdwn.cn
http://vDBBYCWW.mpdwn.cn
http://RuePrjhW.mpdwn.cn
http://x4HGmplN.mpdwn.cn
http://PkjjLROL.mpdwn.cn
http://E3OUM0hm.mpdwn.cn
http://1BCHAZ3f.mpdwn.cn
http://2VcwvwvY.mpdwn.cn
http://86hACgGo.mpdwn.cn
http://FSTvi4wE.mpdwn.cn
http://1E8OpKXV.mpdwn.cn
http://gfzPsS7E.mpdwn.cn
http://www.dtcms.com/a/388496.html

相关文章:

  • 软件体系结构——后端三层架构
  • Nmap 端口扫描
  • 关于青春的沉浸式回忆录-《学生时代》评测
  • 深入理解虚拟 DOM(VDOM):原理、优势与应用
  • React 18笔记
  • 模块化演进史:从 IIFE / CommonJS / AMD 到 ES Modules(含 Tree Shaking 原理)
  • Python+PyQt构建自动化定时任务执行工具
  • 前端如何终止请求
  • Ubuntu 系统 MySQL 全面管理指南(认证、用户、密码、服务及安全)
  • 《UE5_C++多人TPS完整教程》学习笔记53 ——《P54 转身(Turning in Place)》
  • 【Cyansdk 插件详细介绍文档】
  • IDEA 如何打开eclipse项目
  • linux C++ opencv 绘制中文(源码编译opencv)
  • 线性回归到 Softmax 回归
  • Python实现剑龙优化算法 (Stegosaurus Optimization Algorithm, SOA)优化函数(付完整代码)
  • 微软开始在Win11上全屏打广告了,怎么关?
  • 深度学习-线性回归与 Softmax 回归
  • OpenCV:背景建模
  • JavaScript async/await 实战秘籍 异步编程技巧 + 避坑指南 秒杀 Promise then 链
  • Next.js动态配置实时预览方案
  • 讲讲对MoE的理解
  • OpenLayers数据源集成 -- 章节十七:KML图层详解:Google Earth数据格式的完整集成与交互式展示方案
  • LInux DMA fence与其他同步机制的对比分析
  • 【Windows端口管理】快速查看和释放被系统保留的TCP端口
  • LeetCode 2349.设计数字容器系统:双哈希表(要咋查就咋映射)
  • 使用webpack进行Gzip 压缩原理与影响详解
  • 一个基于Python PyQt5开发的渗透测试报告生成工具,用于快速生成专业的渗透测试报告。
  • 使用注解封装查询相关的功能
  • 电感边上加一横和加两横代表什么?
  • Python 0915