Vue3:横向滑动导航组件路由跳转保留滚动(条)量

server/2024/10/25 14:31:20/

导航组件,点击路由跳转到相应路由,保留当前滚动条的滚动量(滚动条位置)。通过导航宽度计算进行滚动条偏移量移动,无需缓存、存储及路由守卫等。

效果:

navigation.vue(导航组件) 

<template>
<div class="nav f18 lh56">
<ul ref="scrollContainer">
<li v-for="(nav,index) in navData" :key="index" @click="goUrl(nav.url)" :class="{active:url==nav.url}">{{nav.name}}</li>
</ul>
</div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, ref, reactive, computed, onMounted, onActivated, onDeactivated,watch} from 'vue';
import { useRoute } from 'vue-router';
const route = useRoute();
const { proxy } = getCurrentInstance()//导航数据
const navData = [{name:"首页-公告资讯",url:"/index"},{name:"课程中心",url:"/courseCenter"},{name:"新销售员培训",url:"/hireTraining"},{name:"已收藏课程",url:"/collectCourse"},{name:"大咖来支招",url:"/tycoonCounsel"},{name:"学习排行榜",url:"/studyRank"},{name:"培训证书",url:"/TrainingCertificate"},
]//检测路由变换添加样式
let url = ref()
if(route.path){url.value = route.path
}else{url.value = navData[0].url
}//点击跳转
const goUrl = (event) =>{proxy.$router.push(event)
}let scrollContainer = ref(null) //获取导航元素
onMounted(() => {//获取导航条长度(注:.nav ul设置了overflow-x:auto)并根据路由地址滚动到相应位置for(let i in navData){if(route.path == navData[i].url){scrollContainer.value.scrollLeft = i*(scrollContainer.value.scrollWidth/navData.length)}}
})
</script><style scoped>
.nav{background:#2573e9;}
.nav ul{display:flex;justify-content:space-between;}
.nav li{flex:1;text-align:center;color:#fff;cursor:pointer;}
.nav li.active,.nav li:hover{background:#0249b8;}
@media screen and (max-width:860px) {
.nav{line-height:3.4rem;font-size:1.4rem;}
.nav ul{width:100%;white-space:nowrap;display:block;overflow-x:auto;}
.nav ul::-webkit-scrollbar{width:0;height:0;}
.nav ul li{display:inline-block;padding:0 1rem;}
}
</style>

引用:

<template>
<div><!--其他代码--><navigation></navigation><!--其他代码--></div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, ref, reactive, computed, onMounted, onActivated, onDeactivated} from 'vue';//引用导航组件navigation.vue
import navigation from '@/components/navigation.vue'//其他代码</script>
<style scoped>
</style>


http://www.ppmy.cn/server/134742.html

相关文章

Clickhouse 笔记(一) 单机版安装并将clickhouse-server定义成服务

ClickHouse 是一个高性能的列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;场景。它由俄罗斯搜索引擎公司 Yandex 开发&#xff0c;并在 2016 年开源。ClickHouse 以其卓越的查询性能和灵活的扩展性而闻名&#…

VulkanTutorial(2·创建GLFWwindow*和VkInstance)

使用GLFW创建窗口 首先包含两个库的头文件 #define GLFW_INCLUDE_VULKAN #include <GLFW/glfw3.h> 定义Application的基本结构&#xff1a;run ( init(),loop(),clean() ) 在main loop创建Application obj&#xff0c;通过try catch异常处理&#xff0c;检测在程序执…

2024年网络安全(黑客)自学总结

前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 如何成为一名黑客 很多朋友在学习安全方面都会半路转行&#xff0c…

ETCD未授权访问风险基于角色认证和启用https的ca证书修复方案

ETCD未授权访问风险安全漏洞修复方案 ETCD未授权访问风险介绍基于角色认证的访问控制&#xff08;BASIC认证&#xff09;基于ca证书的https访问控制&#xff08;TLS传输&#xff09;下载cfssl认证配置工具生成ca认证证书修改etcd配置方式一方式二 访问etcd节点信息 patroni使用…

【漏洞复现】74cms v4.2.1 v4.2.129 后台getshell漏洞

漏洞描述 厂商:74cms 下载地址:http://www.74cms.com/download/index.html 关于版本: 新版的74cms采用了tp3.2.3重构了,所以可知底层是tp,74cms新版升级是后台升级的,所以先将将升级方法。 注:此漏洞不用升级至最新版本也可使用。 免责声明 技术文章仅供参考,任何个…

未来智慧城市发展的四大引领方向

随着全球城市化进程的加速和科技创新的不断推动&#xff0c;智慧城市作为未来城市发展的重要方向&#xff0c;将在多个领域引领城市实现可持续、智能、高效的发展。以下是智慧城市引领未来城市发展的四个关键方向&#xff1a; 1. 智慧交通&#xff1a; 智慧交通是智慧城市建设…

光纤传感器比传统传感器强在哪?——以大坝监测为例

应用介绍 大坝安全监测中心经常对当前工程中的大坝进行检查, 以确保水电站的安全运行。 大坝原有的观测模式是传感器加上人工观测模式&#xff0c;多数传感器经过多年运行后逐渐老化&#xff0c;出现测点损伤&#xff0c;且精度无法与现有光纤传输传感器相比&#xff0c;受现…

excel斜线表头

检验数据验证对象 鼠标放在检验数据 验证对象中间&#xff0c;altenter 之后空格 选中格子&#xff0c;右键单元格格式&#xff0c; 完成 如果是需要多分割&#xff0c;操作一样&#xff0c;在画斜线的时候会有区别&#xff0c;在插入里面用直线画斜线即可 在表格插入的时…