vue 实现滚动导航

效果

在这里插入图片描述

实现

css 使用了 unocss

使界面滚动到给定元素的指定坐标位置

window.scrollTo({ top: 0 })

使用了内边距避免最后数据高度不够

<main class="pb-100vh"></main>

完整代码

<script lang="ts" setup>
defineOptions({ name: 'DemoView' })
/** dom */
const itemRefs = ref<HTMLElement[]>([])

/** 导航列表数据 */
const navList = ['导航一', '导航二', '导航三', '导航四', '导航五']

/** 导航的索引 */
const activeIndex = ref(0)

/**
 * 切换导航
 * @param index 点击的索引
 */
function handleNav(index: number) {
  activeIndex.value = index
  scrollTo({ top: itemRefs.value[index]?.offsetTop })
}

/**
 * 监听滚动方法
 */
function onScroll() {
  const offsetTopArr: number[] = []
  itemRefs.value?.forEach((item) => {
    offsetTopArr.push((item as HTMLElement)?.offsetTop)
  })

  const scrollTop = document.documentElement.scrollTop || document.body.scrollTop

  let navIndex = 0
  for (let n = 0; n < offsetTopArr.length; n++) {
    // 如果 scrollTop 大于等于第n个元素的 offsetTop 则说明 n-1 的内容已经完全不可见
    // 那么此时导航索引就应该是n了
    if (scrollTop >= offsetTopArr[n]) {
      navIndex = n
    }
  }
  activeIndex.value = navIndex
}

onMounted(() => {
  window.addEventListener('scroll', onScroll, false)
})
onUnmounted(() => {
  window.removeEventListener('scroll', onScroll)
})

/**
 * 封装滚动到指定位置的方法
 * @param param0
 */
function scrollTo({
  top = 0,
  behavior = 'smooth'
}: {
  top?: number | undefined
  behavior?: ScrollBehavior
}) {
  window.scrollTo({
    top,
    behavior
  })
}
</script>

<template>
  <div class="pl-150px">
    <nav class="fixed left-0px top-80px">
      <ul>
        <template v-for="(nav, index) of navList" :key="index">
          <li
            class="py-30px text-[#666] cursor-pointer"
            :class="{ active: activeIndex === index }"
            @click="handleNav(index)"
          >
            {{ nav }}
          </li>
        </template>
      </ul>
    </nav>

    <main class="pb-100vh">
      <template v-for="(nav, index) of navList" :key="index">
        <div ref="itemRefs" class="h-200px w-200px mb-20px pb-30px bg-blue-700 text-white">
          {{ nav }}
        </div>
      </template>
    </main>
  </div>
</template>

<style lang="scss" scoped>
li {
  list-style: none;
}

.active {
  @apply text-blue-700 font-bold;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掌握Go语言:深入encoding/gob包的高效数据序列化

掌握Go语言&#xff1a;深入encoding/gob包的高效数据序列化 引言理解Gob和它的使用场景Gob的概念和设计目标Gob的适用场景和优势 开始使用Gob基本的Gob编码和解码示例代码编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09; Gob编码高级应用自定义类型的…

Minecraft 1.20.1 Forge服务器保姆级搭建教程 (使用mcsm面板 | 两种启动方式)

MC Forge 服务器部署 使用 Linux 云服务器部署 Minecraft 1.20.1 Forge 服务器 目录 MC Forge 服务器部署看这篇教程之前&#xff0c;你需要准备好这篇教程的目标前期准备1. 环境需求&#xff1a;腾讯云、CentOS 7.9&#xff08;对于其他云服务商和 Linux 系统&#xff0c;操作…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

重磅!2014-2023七大顶刊中国学者排行榜出炉,施一公、颜宁位列前二

在科学领域&#xff0c;Cell、Nature和Science被公认为最顶尖的期刊&#xff0c;简称CNS。而在医学方面&#xff0c;新英格兰医学杂志(NEJM)、柳叶刀(Lancet)、美国医学会杂志(JAMA)以及英国医学期刊(BMJ)被誉为“四大医学顶刊”。这七大期刊上发表的论文&#xff0c;往往被看作…

平台工程:构建企业数字化转型的基石

有人说&#xff0c;平台工程&#xff08;Platform Engineering&#xff09;&#xff0c;不过是新瓶装旧酒&#xff08;DevOps&#xff09;。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…

2024年软考计划开始了,你准备好了吗?

目录标题 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划计算机软考中级科目哪个含金量最高&#xff1f;报考流程和说明 2024年度计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试工作计划 一、2024年度计算机软件资格考试(初级…

数学建模-多目标规划算法(美赛建模)

单目标优化的情况下&#xff0c;只有一个目标&#xff0c;任何两解都可以依据单一目标比较其好坏&#xff0c;可以得出没有争议的最优解。 多目标化与传统的单目标优化相对。多目标优化的概念是在某个情景中在需要达到多个目标时&#xff0c;由于容易存在目标间的内在冲突&…

MO干货 | shuffle执行计划解析(下篇)

作者&#xff1a;倪涛 MO产品布道师 目录 Part 1.如何处理不均匀数据&#xff1f; Part 2.Hybrid shuffle Part 3.Shuffle resue Part 4.Join reorder Part 5.总结 在《MO干货&#xff5c;shuffle执行计划解析&#xff08;上篇&#xff09;》中&#xff0c;我们分享了shu…

选课模块-01添加免费/收费选课

添加选课 界面原型 第一步&#xff1a;用户通过搜索课程、课程推荐等信息进入课程详情页面&#xff0c;点击马上学习进行学习 第二步&#xff1a;课程免费时可以直接加入我的课程表并且免费课程可以直接在线学习&#xff0c;免费课程默认一年有效期&#xff0c;到期需要申请续…

148个Chatgpt关键词汇总-有爱AI实战教程(二)

演示站点&#xff1a; https://ai.uaai.cn 技能模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如…

C语言经典算法学习-4

文章目录 21.最大访客数22.中序式转后序式&#xff08;前序式&#xff09;23.后序式的运算24.洗扑克牌&#xff08;乱数排列&#xff09;25.Craps赌博游戏 21.最大访客数 说明&#xff1a;现将举行一个餐会&#xff0c;让访客事先填写到达时间与离开时间&#xff0c;为了掌握座…

2024年Vue3 面试题小总结

Vue3 面试题小总结 1. OptionsAPI 与 CompositionAPI 的区别&#xff1f; OptionsAPI&#xff1a; 选项式API&#xff0c;通过定义data、computed、watch、method等属性与方法&#xff0c;共同处理页面逻辑&#xff1b;缺点&#xff1a; 当组件变得复杂的时候&#xff0c;导致…

视频分割软件,到底哪一款才适合你?

在当今充满创意的数字时代&#xff0c;视频编辑已成为许多人表达想法、分享故事的重要手段。而在视频编辑的过程中&#xff0c;分割视频是一项关键而常见的任务&#xff0c;它能够让我们更精细地处理内容&#xff0c;使得最终的作品更为生动和引人入胜。然而&#xff0c;要想高…

揭秘财务数据分析的五力分析,轻松实现从会计财务到管理财务的华丽转身

在这个信息爆炸的时代&#xff0c;财务数据分析已经成为了企业和个人成功的关键。今天&#xff0c;就让我们一起揭开财务数据分析的神秘面纱&#xff0c;让你轻松掌握财务秘籍&#xff0c;成为财务高手&#xff01; 一、财务数据分析&#xff0c;为何如此重要&#xff1f; 财…

访客到了官网就跳走,概率是官网颜值和体验出了问题。

很多小伙伴反馈官网ip不错&#xff0c;但是pv太少了&#xff0c;停留时间更少&#xff0c;这大概率是网站颜值和体验出问题了。 如果访客到了官网后就跳走&#xff0c;有可能是因为官网的颜值和用户体验出了问题。这种情况可能会导致访客对网站的第一印象不佳&#xff0c;从而选…

【spring】使用阿里Spring Initailiz创建项目

网络原因使用Spring Initailiz会出现超时。 那我们就换成阿里的 先看看spring官网的 网址&#xff1a;https://start.spring.io 使用一下阿里的 网址&#xff1a;https://start.aliyun.com/ 填写信息 都是java开发者&#xff0c;具体信息部介绍了。 选择组件 lombok spri…

OKHttpRetrofit

完成一个get请求 1.导入依赖 implementation("com.squareup.okhttp3:okhttp:3.14.")2.开启viewBinding android.buildFeatures.viewBinding true 3.加网络权限 和 http明文请求允许配置文件 <?xml version"1.0" encoding"utf-8"?> &l…

Kotlin:内联类(inline class)

点击查询内联类中文文档 点击查询内联类英文文档 简介 提醒&#xff1a;内联类仅在 Kotlin 1.3 之后版本可用 有时候&#xff0c;业务逻辑需要围绕某种类型创建包装器。然而&#xff0c;由于额外的堆内存分配问题&#xff0c;它会引入运行时的性能开销。此外&#xff0c;如果…

【嵌入式——QT】标准对话框

【嵌入式——QT】标准对话框 文件对话框颜色对话框字体对话框输入对话框消息框代码示例 文件对话框 QFileDialog 常用静态函数 getOpenFileName&#xff1a;选择打开一个文件&#xff1b;getOpenFileNames&#xff1a;选择打开多个文件&#xff1b;getSaveFileName&#xff1…

如何使用ArcGIS Pro生成带计曲线等高线

等高线作为常见的地图要素经常会被使用到&#xff0c;一般情况下生成的等高线是不带计曲线的&#xff0c;在某些情况下我们需要带计曲线的等高线&#xff0c;这里为大家介绍一下ArcGIS Pro生成带计曲线等高线的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数…