页面锚点使用

在这里插入图片描述

以下代码直接复制使用

<template>
  <div style="height: 100%;">
    <div style="display: flex;height: 100%;">
      <div style="width: 200px;border: 1px solid pink;">
        <div v-for="(item, index) in titleList" :key="index" style="margin-top: 10px;cursor: pointer;"
          :style="{ backgroundColor: activeAnchor === item.dataKey ? 'cyan' : '#fff' }"
          @click="() => scrollToAnchor(item.dataKey)">
          {{ item.label }}
        </div>
      </div>

      <!-- 这个大集合需要设置滚动 overflow: hidden;overflow-y: auto; -->
      <div ref="scrollContainer" id="scrollContainer" style="flex: 1;overflow: hidden;overflow-y: auto;" @scroll="handleScroll">
        <div ref="title1" id="title1" style="height: 200px; background-color: #c1f0de;">1</div>
        <div ref="title2" id="title2" style="height: 600px; background-color: #c1f0de;margin-top: 10px;">2</div>
        <div ref="title3" id="title3" style="height: 500px; background-color: #c1f0de;margin-top: 10px;">3</div>
        <div ref="title4" id="title4" style="height: 200px; background-color: #c1f0de;margin-top: 10px;">4</div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeAnchor: 'title1',//当前选中锚点
      isScrollingToAnchor: false, //是否滚动中
      titleList: [
        { dataKey: 'title1', label: '标题1' },
        { dataKey: 'title2', label: '标题2' },
        { dataKey: 'title3', label: '标题3' },
        { dataKey: 'title4', label: '标题4' },
      ]
    }
  },
  methods: {
    // 滚动监听 当前所展示的锚点
    handleScroll() {
      // 如果正在滚动到锚点,则不再触发新的滚动操作
      if (this.isScrollingToAnchor) return false

      const containerElement = document.getElementById('scrollContainer')
      if (!containerElement) return

      if (this.titleList && this.titleList.length) {
        for (let i = 0; i < this.titleList.length; i++) {
          const dataKey = this.titleList[i].dataKey
          console.log('dataKey', dataKey, containerElement)
          const anchorElement = document.getElementById(dataKey)
          if (!anchorElement || anchorElement.length < 0) return

          // getBoundingClientRect()方法返回一个DOMRect对象,该对象提供了元素的大小及其相对于视口的位置信息。这个DOMRect对象包含了元素的位置、宽度、高度和其他相关信息
          const containerRect = containerElement.getBoundingClientRect()
          // const anchorRect = anchorElement[0].getBoundingClientRect()
          const anchorRect = anchorElement.getBoundingClientRect()
          console.log(containerRect, anchorRect, dataKey)

          // 判断锚点是否在滚动容器的可见区域内
          const isInViewport =
            anchorRect.top >= containerRect.top &&
            anchorRect.bottom <= containerRect.bottom

          if (isInViewport) {
            this.activeAnchor = dataKey
            return false
          }
        }
      }
    },
    // 滚动锚点
    scrollToAnchor(dataKey) {
      const anchorElement = document.getElementById(dataKey)

      // 使用原生JavaScript滚动到锚点位置
      if (anchorElement) {
        this.isScrollingToAnchor = true

        anchorElement.scrollIntoView({
          behavior: 'smooth', // 添加平滑滚动效果,可选
          block: 'start' // 控制垂直方向的对齐方式,可选值有 'start', 'center', 'end', 'nearest'
        })

        this.activeAnchor = dataKey

        // 滚动完成后将标志位复位
        setTimeout(() => {
          this.isScrollingToAnchor = false
        }, 3000) // 3000 毫秒是滚动完成的估计时间,可以根据实际情况调整
      }
    }
  },
}
</script>

<style></style>

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

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

相关文章

NVMe管理命令为何不用SGL?-1

上周末在公众号后台收到粉丝留言&#xff0c;主要是关于SGL的交流&#xff1a;“SGL为啥不能用于nvme admin cmd”&#xff1f; 回答这个问题前&#xff0c;首先&#xff0c;我们先回顾下NVME PRP和SGL的基本原理以及应用场景。 在Host与Controller之间有数据交互时&#xff0…

软件测试零基础新手入门必看

软件测试&#xff1a;使用技术手段验证软件是否满足使用需求 目的&#xff1a;减少缺陷&#xff0c;保证质量 一、测试主流技能&#xff1a; 1.功能测试 测试主要验证程序的功能是否满足需求 2.自动化测试 使用工具或代码代替手工&#xff0c;对项目进行测试 3.接口测试 …

小迪安全32WEB 攻防-通用漏洞文件上传二次渲染.htaccess变异免杀

#知识点&#xff1a; 1、文件上传-二次渲染 2、文件上传-简单免杀变异 3、文件上传-.htaccess 妙用 4、文件上传-PHP 语言特性 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c…

常用SQL查询方法与实例

目录 SELECT查询 INSERT查询 UPDATE查询 DELETE查询 JOIN查询 GROUP BY查询 HAVING查询 窗口函数 公共表表达式&#xff08;CTEs&#xff09; 递归查询 透视表 分析函数 解透视 条件聚合 日期函数 合并语句 情况语句 常用SQL查询方法有以下几种&#xff1a; S…

OWASP Top 10 网络安全10大漏洞——A02:A02:2021-加密机制失效

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化&#xff0c;以及一些合并。 A02&#xff1a;A02:2021-加密机制失效 上升一个位置&#xff0c;当前top2&#xff0c;以前称为敏感数据泄露&#xff0c;是一种状况而不是根本原因。更新后的类别…

算法学习03:前缀和与差分(互逆)

算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09; 文章目录 算法学习03&#xff1a;前缀和与差分&#xff08;互逆&#xff09;前言一、前缀和1.一维2.二维 二、差分1.一维在这里插入图片描述2.二维在这里插入图片描述 ![在这里插入图片描述](https://img-blog…

嵌入式驱动学习第一周——阻塞IO,进程的休眠与唤醒

前言 本文介绍进程的休眠与唤醒。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xff0c;一起讨论一起学习。现在关注就是老粉啦&#xff01; 行文目录 前言1. 阻塞和非阻…

【TEE】内存完整性保护

Hash Functions&Merkle Tree 对读操作进行完整性检查&#xff0c;通过在加载的块上重新计算一个哈希&#xff0c;然后根据片外地址将得到的哈希与片上哈希比较。 缺点&#xff1a;不可承受的片上存储开销&#xff0c;并假设128位哈希和512位cache line&#xff0c;其开销为…

基于springboot+vue的实习管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

8个优秀的CSS实践,开发web应用

HTML面试题部分 1.H5的新特性有哪些 2.Label的作用是什么&#xff1f;是怎么用的&#xff1f; 3.HTML5的form如何关闭自动完成功能 4.dom如何实现浏览器内多个标签页之间的通信? 5.实现不使用 border 画出1px高的线&#xff0c;在不同浏览器的标准模式与怪异模式下都 能保持一…

Qt/自定义控件的封装

新建文件&#xff0c;选择Qt设计师界面类 创建空界面 这是自己控件封装的文件&#xff0c;双击跳转到设计界面进行设计 跳转到其他的ui界面&#xff0c;创建一个widget 右键&#xff0c;选择提升为 在提升的类名称输入刚刚创建的类名&#xff0c;添加后选择提升&#xff0c;勾选…

FairTune:优化参数高效微调以实现医学图像分析的公平性

paper&#xff1a;https://arxiv.org/abs/2310.05055 code&#xff1a; https://github.com/Raman1121/FairTune 摘要和介绍 人工智能在医疗健康应用中的应用正在迅速增长。然而&#xff0c;人工智能模型一再被证明对不同的人口统计学亚群体表现出不必要的偏见——AI模型在由…

【暗月安全】2021年渗透测试全套培训视频

参与培训需要遵守国家法律法规&#xff0c;相关知识只做技术研究&#xff0c;请勿用于违法用途&#xff0c;造成任何后果自负与本人无关。 中华人民共和国网络安全法&#xff08;2017 年 6 月 1 日起施行&#xff09; 第二十二条 任何个人和组织不得从事入侵他人网络、干扰他…

数据结构之七大排序

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Kubernetes Service

一、Service&#xff1a;Kubernetes 中的服务返现与负载均衡 1、为什么需要服务发现 Pod 生命周期短暂&#xff0c;IP 地址随时变化。 Deployment 等的 Pod 组需要统一访问入口和做负载均衡。 应用间在不同环境部署时保持同样的部署拓扑和访问方式。 2、应用服务如何暴露到…

停止Tomcat服务的方式

运行脚本文件停止 运行Tomcat的bin目录中提供的停止服务的脚本文件 关闭命令 # sh方式 sh shutdown.sh# ./方式 ./shutdown.sh操作步骤 运行结束进程停止 查看Tomcat进程&#xff0c;获得进程id kill进程命令 # 执行命令结束进程 kill -9 65358 操作步骤 注意 kill命令是…

简单的排序算法

目录 1.直接插入排序 2.希尔排序 3.选择排序 4.冒泡排序 5.计数排序 6.排序总结 1.直接插入排序 &#xff08;1&#xff09;思想 所谓插入排序&#xff0c;就是将待排序数据插入到已经有序的数据中&#xff0c;为了使插入后数据依然有序&#xff0c;就要选中一个合理的…

android开发网络通信,带你彻底搞懂Android启动速度优化

实现方案 直接依赖 这种方式实现简单&#xff0c;但是耦合太严重&#xff0c;不方便维护与开发&#xff0c;当工程逐渐增大模块逐渐增多&#xff0c;依赖关系会非常复杂&#xff0c;不推荐这种方式。 事件或广播通信 EventBus&#xff1a; 我们非常熟悉的事件总线型的通信框…

JavaScript的`bind`方法:函数的“复制”与“定制”

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

jquery选择器有哪些

jQuery是一个功能强大的JavaScript库&#xff0c;它提供了丰富的选择器来帮助开发者更方便地选择和操作DOM元素。以下是jQuery的一些常用选择器及其示例代码&#xff1a; 1.基本选择器&#xff1a; // 通过ID选择元素 $("#myId").css("color", "red…