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

页面滚动锚点也滚动-封装了一个ts方法(定位锚点跟随页面滚动下滑)

① import { useScrollHighlight } from '@/utils/useAnchorScroll';

    // 切换滚动到对应位置锚点useScrollHighlight(nav_list, activeName, '.system-warp-box', 99, isClickScrolling,1,'sections-');如果dom没渲染完的情况使用下面// 切换滚动到对应位置锚点const { handleScroll } =useScrollHighlight(nav_list, current_id, '.history-warp', 99, isClickScrolling,activeType);onMounted(() => {const el = document.querySelector('.history-warp');if (el) {el.addEventListener('scroll', handleScroll);}});

③// useScrollHighlight.ts方法

// useScrollHighlight.ts
import { onMounted, onBeforeUnmount,onUpdated } from 'vue';export function useScrollHighlight(navListRef: any,//锚点数组activeNameRef: any,//active的值scrollContainerSelector: string,//详情容器的idoffset = 99,isClickScrollingRef: any = { value: false } ,activeType: number = 1,//控制动态active的值sectionPrefix: string = 'section-', // 默认前缀,详情每个锚点详情的id
) {const handleScroll = () => {// console.log('🚀 ~ navListRef①:', navListRef?.value);// console.log('🚀 ~ activeNameRef②:', activeNameRef?.value);// console.log('🚀 ~ scrollContainerSelector③:', scrollContainerSelector);// console.log('🚀 ~ offset④:', offset);// console.log('🚀 ~ isClickScrollingRef⑤:', isClickScrollingRef?.value);if (isClickScrollingRef?.value) return;const scrollContainer = document.querySelector(scrollContainerSelector);if (!scrollContainer) return;const containerRect = scrollContainer.getBoundingClientRect();for (let i = navListRef.value.length - 1; i >= 0; i--) {const sectionType = `${sectionPrefix}${navListRef.value[i].id}`;const section = document.getElementById(sectionType);if (section) {const rect = section.getBoundingClientRect();const relativeTop = rect.top - containerRect.top;if (relativeTop <= offset) {activeNameRef.value =activeType === 1? 'tab' + navListRef.value[i].id: navListRef.value[i].id;break;}}}};onUpdated(() => {const scrollContainer =  document.querySelector(scrollContainerSelector);scrollContainer?.addEventListener('scroll', handleScroll);});onBeforeUnmount(() => {const scrollContainer = document.querySelector(scrollContainerSelector);scrollContainer?.removeEventListener('scroll', handleScroll);});return { handleScroll };
}

相关文章:

  • 前端渲染pdf文件解决方案-pdf.js
  • 工具指南:免费将 PDF 转换为 Word 的 10 个工具
  • MIT IDSS深度解析:跨学科融合与系统科学实践
  • 【白雪讲堂】GEO优化第7篇 -构建《推荐类》内容的结构化模板
  • 代码随想录训练营第39天 || 198. 打家劫舍 213. 打家劫舍 II 337. 打家劫舍 III
  • YOLO学习笔记 | 从YOLOv5到YOLOv11:技术演进与核心改进
  • 搭建 Stable Diffusion 图像生成系统并通过 Ngrok 暴露到公网(实现本地系统网络访问)——项目记录
  • 基于esp32-s3,写一个实现json键值对数据创建和读写解析c例程
  • HCIA-Access V2.5_18_网络管理基础_1_网络管理系统架构
  • 【AI】Trae的MCP配置及使用测试
  • 什么是 GLTF/GLB? 3D 内容创建的基本数据格式说明,怎么下载GLB/GLTF格式模型
  • 实现支付宝沙箱环境搭建
  • 单片机与FPGA的核心差异、优缺点、编程差异、典型应用场景、选型等对比分析
  • DocsGPT remote接口RCE(CVE-2025-0868)
  • 解析虚拟机与Docker容器化服务的本质差异及Docker核心价值
  • Maven 手动添加 JAR 包到本地仓库笔记
  • 5.2.3 WPF 中 XAML 文件 Converter 使用介绍
  • 基于ACL方式手动建立站点间 IPSec 隧道
  • 牛客 verilog入门 VIP
  • 云原生后端架构:重塑后端开发的新范式
  • 我们的免疫系统,是世界上最好的“医生”
  • 累计亏损10亿元,桂林旅游怎么了?
  • 大理杨徐邱再审后上诉案将于下周开庭:案发已逾32年,故意杀人罪去年被撤销
  • 俄罗斯与乌克兰互换246名在押人员
  • 黄山旅游:去年黄山景区累计接待进山游客492.24万人,同比增长7.6%
  • A股午后回暖三大股指涨跌互现:地产银行联袂上攻,两市成交9146亿元