实现锚点链接点击tab跳转到指定位置 并且滚动鼠标顶部锚点的样式也跟随变化

实现效果如下  不管是点击还是  滚动鼠标 顶部的样式也会跟随变化

点击会跳转到指定的位置 

通过IntersectionObserver 监听是否可见 

下面代码可以直接执行到vue的文件 

<template>
  <div>
    <ul class="nav">
      <li v-for="tab in tabs" :key="tab.name" :class="{ active: currentTab === tab.name }" @click="scrollToTab(tab)">
        {{ tab.label }}
      </li>
      <div class="underline" :style="underlineStyle"></div>
    </ul>
    <div class="section" id="section1">Section 1</div>
    <div class="section" id="section2">Section 2</div>
    <div class="section" id="section3">Section 3</div>
    <div class="section" id="section4">Section 4</div>
    <div class="section" id="section5">Section 5</div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      currentTab: 'tab1',
      tabs: [
        { name: 'tab1', label: '首页', id: 'section1' },
        { name: 'tab2', label: '服务内容', id: 'section2' },
        { name: 'tab3', label: '业务案例', id: 'section3' },
        { name: 'tab4', label: '关于我们', id: 'section4' },
        { name: 'tab5', label: '联系方式', id: 'section5' }
      ],
      underlineStyle: {
        width: '0px',
        left: '0px'
      }
    }
  },
  methods: {
    scrollToTab (section) {
      this.currentTab = section.name
      this.updateUnderline()
      const element = document.getElementById(section.id)
      document.getElementById(section.id).scrollIntoView({ behavior: 'smooth', block: 'center' })
    },
    updateUnderline () {
      this.$nextTick(() => {
        const activeTab = this.$el.querySelector('.nav .active')
        if (activeTab) {
          this.underlineStyle.width = `${activeTab.offsetWidth}px`
          this.underlineStyle.left = `${activeTab.offsetLeft}px`
        }
      })
    },
    handleIntersection (entries) {
      entries.forEach((entry) => {
        if (entry.isIntersecting) {
          const tab = this.tabs.find((tab) => tab.id === entry.target.id)
          if (tab) {
            this.currentTab = tab.name
            this.updateUnderline()
          }
        }
      })
    }
  },
  mounted () {
    this.updateUnderline()
    const options = {
      root: null,
      rootMargin: `-${this.$el.querySelector('.nav').offsetHeight}px 0px 0px 0px`,
      threshold: 0.5
    }

    const observer = new IntersectionObserver(this.handleIntersection, options)
    this.tabs.forEach((tab) => {
      const section = document.getElementById(tab.id)
      if (section) {
        observer.observe(section)
      }
    })

    window.addEventListener('resize', this.updateUnderline)
  },
  beforeDestroy () {
    window.removeEventListener('resize', this.updateUnderline)
  }
}
</script>

<style scoped>
.nav {
  display: flex;
  position: fixed;
  top: 0;
  width: 1000px;
  background-color: white;
  z-index: 1000;
  border-bottom: 1px solid #ccc;
}
.nav li {
  flex: 1;
  text-align: center;
  padding: 10px;
  cursor: pointer;
  position: relative;
}
.nav li.active {
  color: blue;
}
.underline {
  position: absolute;
  bottom: 0;
  height: 2px;
  background-color: blue;
  transition: width 0.3s, left 0.3s;
}
.section {
  height: 300px;
  padding-top: 60px; /* 留出导航栏的高度 */
  border-bottom: 1px solid #ccc;
}
</style>

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

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

相关文章

京东和天猫各渠道区别是什么?你了解吗?如何快速了解两个平台渠道推广

1.快车/直通车区别: 京东:不能投竞品词,能投定向商品选竞品,因为京东是卖平台流量和商品(自营(主收入)),不可以投竞品词是为了保护自己店铺的品牌流量; 天猫:只卖平台流量,不卖商品,所以允许竞品词投放; 2.竞品人群圈选: 因为数坊是自身品牌数据分析平台,所…

php配合fiddler批量下载淘宝天猫商品数据分享

有个做电商的朋友问我&#xff0c;每次上款&#xff0c;需要手动去某宝去搬运商品图片视频&#xff0c;问我能不能帮忙写个脚本&#xff0c;朋友开口了&#xff0c;那就尝试一下 首先打开某宝&#xff0c;访问一款商品&#xff0c;找出他的数据来源 通过观察我们发现主图数据来…

C# 与三菱PLC MC协议通讯

1. 引用HslCommunication Nuget包里边添加 HslCommunication包的引用 2.创建PLC连接对象&#xff0c;并通过 IP&#xff0c;端口进行连接 //PLC连接对象 var plc new MelsecMcNet(_ip, _port); plc.ConnectTimeOut 3000;var res plc.ConnectServer();//连接PLCisConnect …

苹果Mac电脑遭恶意软件攻击 Mac第三方恶意软件删除不了

苹果Mac电脑一直以来都以安全性和稳定性著称&#xff0c;许多用户认为Mac电脑不会受到恶意软件的侵害&#xff0c;但事实上&#xff0c;Mac电脑也不是绝对安全的&#xff0c;近年来&#xff0c;有越来越多的恶意软件针对Mac电脑进行攻击&#xff0c;甚至有些恶意软件可以绕过苹…

镭速是如何做到传输中快速校验大文件的

在信息泛滥的当下&#xff0c;文件传输系统的效率与安全性成为企业和个人用户高度关注的焦点。传统上&#xff0c;文件传输依赖于如MD5或XXHash等单一的完整性校验机制。 然而&#xff0c;在多变的工作环境中&#xff0c;这些传统方法显得不够灵活。镭速&#xff0c;作为大文件…

文库小程序搭建部署:实现资源共享正向反馈

文档库相信大家应该不陌生&#xff0c;日常我们的工作模板、会议模板、求职时的简历模板、教育界的教学模板等来源方式都出自于文档库&#xff0c;随着互联网的发展和工作需求&#xff0c;文档模板开启了新型的知识变现新途径&#xff0c;通过文库小程序&#xff0c;我们不仅能…

9.2.2 DeepLab系列模型中每一代的创新是什么?是为了解决什么问题?

9.2.2 DeepLab系列模型中每一代的创新是什么&#xff1f;是为了解决什么问题&#xff1f; 前情回顾&#xff1a;9.2.1 简述图像分割中经常用到的编码器-解码器网络结构的设计理念。 DeepLab是Google 团队提出的一系列图像分割算法。 DeepLab v1在2014年被提出&#xff0c;并在…

ROS std_msgs消息包

ROS std_msgs消息包 基本概述 std_msgs 是 ROS&#xff08;Robot Operating System&#xff09;的一个核心消息包&#xff0c;包含了一系列基本的消息类型&#xff0c;这些类型用于节点之间的标准通信。std_msgs 中的消息类型设计得非常简单&#xff0c;以便用作更复杂消息的…

升级你的App推广策略!Xinstall用户来源朔源功能引领行业新潮流

一、引言 在App推广和运营的道路上&#xff0c;你是否曾经遇到过这样的困境&#xff1a;投入了大量的资源&#xff0c;但用户增长却迟迟不见起色&#xff1f;或是用户增长迅速&#xff0c;但用户留存率却极低&#xff1f;这些问题&#xff0c;往往源于我们对用户来源的不了解。…

vue echarts画多柱状图+多折线图

<!--多柱状图折线图--> <div class"echarts-box" id"multiBarPlusLine"></div>import * as echarts from echarts;mounted() {this.getMultiBarPlusLine() },getMultiBarPlusLine() {const container document.getElementById(multiBar…

Windows11电脑在使用GPU的时候有时候会卡顿

原来我一直以为是电脑的某些组件可能坏掉了 但是后来发现通过更新gpu的驱动可以让它变好&#xff1a; NVIDIA GeForce 驱动程序 - N 卡驱动 | NVIDIA 下载好以后&#xff0c;然后安装最新的驱动就可以了&#xff0c;感觉可能是因为win11和某些需要显卡的驱动不支持的原因吧 …

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(消息队列)

探索分析从起源到现今的巅峰之旅 分布式队列 - Kafka架构特性可扩展性磁盘优化与顺序访问大容量存储与历史数据利用高效数据封装与压缩智能内存管理与OS缓存利用 Kafka发布/订阅模型Kafka架构分析Producer和Consumer接口交互Producer通过Topic发送数据Consumer通过Topic消费数据…

Java 解析xml文件-工具类

Java 解析xml文件-工具类 简述 Java解析xml文件&#xff0c;对应的Javabean是根据xml中的节点来创建&#xff0c;如SeexmlZbomord、SeexmlIdoc等等 工具类代码 import cn.hutool.core.io.FileUtil; import com.alibaba.cloud.commons.io.IOUtils; import com.seexml.bom.Se…

充电宝什么牌子好?买多少毫安充电宝合适?这几个误区别踩!

在选择充电宝时&#xff0c;很多消费者常常被各种品牌和容量规格搞得眼花缭乱。不少人认为&#xff0c;容量越大越好&#xff0c;但事实并非如此。其实&#xff0c;根据日常使用需求&#xff0c;选择10000毫安的充电宝已经足够应对大多数情况。10000毫安的充电宝不仅能够满足手…

无线备网,保障连锁零售数字化运营

为了提升运营效率、改进客户体验&#xff0c;零售商们不断引入新的数字化工具和平台&#xff0c;包括数字化收银、客流统计、客户关系管理系统等。现代化智慧零售的运营更加依赖于稳定、高效的网络连接&#xff0c;数字化网络不仅是提升运营效率和客户体验的关键&#xff0c;还…

多项目如何管理?盘点十大主流项目管理软件,轻松管理多个项目

多项目同时进行已经成为很多企业的现状&#xff0c;项目经理手握几个项目成为常态。 多项目管理之所以难&#xff0c;不仅在于项目数量的增加&#xff0c;而且在于项目资源分配不均、多项目进度比较难监控、沟通协作纷繁复杂。 应该如何做好进度管理&#xff0c;力求每个项目…

MySQL中的客户端选项(三)

默认情况下&#xff0c;LOAD DATA的LOCAL功能是否可用取决于MySQL客户端库在编译时是否启用了该功能。 当只给出--local-infile&#xff08;不带值&#xff09;时&#xff0c;它启用LOCAL数据加载。当给出--local-infile0时&#xff0c;它禁用LOCAL数据加载。当给出--local-in…

2024年粤港澳青少年信息学创新大赛图形化编程小高组真题试卷

2024年粤港澳青少年信息学创新大赛图形化编程小高组真题试卷 题目总数&#xff1a;16 总分数&#xff1a;100 单选题 第 1 题 单选题 默认小猫角色&#xff0c;以下哪个Scratch程序可以让小猫一直在舞台上随机移动&#xff0c;且每次在移动过程中用时1秒 A. B. C. D…

LearnOpenGL 及 ShaderToy 的 CMake 构建框架

文章目录 构建目标具体框架根目录src 目录app 目录import.cmake其他 CMake 函数 使用框架实际效果摄像机坐标变换使用 assimp 库加载模型shadertoy 测试 framebuffer 离屏渲染 其他 为了复习 OpenGL&#xff08;主要是看到 shadertoy 上有好玩的着色器&#xff09;&#xff0c;…

Linux入门攻坚——26、Web Service基础知识与httpd配置-2

http协议 URL&#xff1a;Uniform Resource Locator&#xff0c;统一资源定位符 URL方案&#xff1a;scheme&#xff0c;如http://&#xff0c;https:// 服务器地址&#xff1a;IP&#xff1a;port 资源路径&#xff1a; 示例&#xff1a;http://www.test.com:80/bbs/…