锚点组件--支持点击、滚动高亮锚点

实现一个锚点组件,页面滚动时高亮当前位置锚点、点击锚点时跳转到指定冒点位置,同时选中锚点也高亮
效果图

在这里插入图片描述

父组件
import './index.less';
import Anchor from './Anchor';
import Content from './Content';export default function index() {return (<div className="wrapper"><div className="header"></div><div className="content-wrapper">// 锚点组件<Anchor />// 页面内容组件<Content /></div><div className="footer"></div></div>);
} 
锚点组件
import React, { useState, useEffect, useRef } from 'react';export default function Anchor() {const [currentIndex, setCurrentIndex] = useState(0);const isClickRef = useRef<any>(null);const timerRef = useRef<any>(null);const anchorList = ['anchor-1', 'anchor-2', 'anchor-3', 'anchor-4'];function onClickAnchor(item: string, index: number) {const el = document.querySelector(`#${item}`) as HTMLElement;if (el) {window.scroll({top: el.offsetTop - 130,behavior: 'smooth',});}setCurrentIndex(index);// 点击时设置为true,为了防止同时执行滚动事件isClickRef.current = true;// 清除定时器,防止滚动事件触发、出现走马灯闪烁问题if (timerRef.current) clearTimeout(timerRef.current);timerRef.current = setTimeout(() => {isClickRef.current = false;}, 1000);}function handlerScroll() {// 点击锚点时,不执行滚动函数if (isClickRef.current) return;// 获取滚动容器的滚动高度(这里相对于body滚动的)const scrollTop =document.documentElement.scrollTop || document.body.scrollTop;// 获取所有content的item集合const contentList = document.querySelectorAll('.content div') as any;const offsetTopArr: any = [];contentList?.forEach((item: any) => {// 获取每个content中item的offsetTopoffsetTopArr.push(item.offsetTop);});for (let i = 0; i < offsetTopArr.length; i++) {// 当滚动条高度达到对应content中item的滚动高度、则将锚点设置为高亮状态if (scrollTop + 120 >= offsetTopArr[i]) {setCurrentIndex(i);}}}useEffect(() => {window.addEventListener('scroll', handlerScroll);return () => {window.removeEventListener('scroll', handlerScroll);};}, []);return (<div className="anchor-wrapper">{anchorList?.map((item, index) => (<divkey={item}className={`${currentIndex === index && 'active'} item`}onClick={() => onClickAnchor(item, index)}>{item}</div>))}<divclassName={`slide-bar slide-bar-${currentIndex}`}style={{ top: `${currentIndex * 60}px` }}></div></div>);
}
页面内容组件
import React from 'react';export default function Content() {const contentList = [{ id: 'anchor-1', content: 'content-1' },{ id: 'anchor-2', content: 'content-2' },{ id: 'anchor-3', content: 'content-3' },{ id: 'anchor-4', content: 'content-4' },];return (<div className="content">{contentList?.map((item, index) => (<div key={index} id={item.id} className="item">{item.content}</div>))}</div>);
}
index.less样式文件
.wrapper {.header,.footer {background-color: orange;}.header {// 固定头部position: sticky;top: 0;height: 100px;}.footer {height: 240px;}.content-wrapper {.anchor-wrapper {width: 170px;float: left;position: sticky;top: 110px;padding: 0 10px;border-left: 4px solid #e0e0e0;margin: 10px;.item {padding: 20px 0;cursor: pointer;}.item.active {color: #082b6e;}.slide-bar {position: absolute;height: 60px;width: 4px;left: -4px;background-color: #082b6e;transition: all 0.2s linear;}.slide-bar-2,.slide-bar-3 {transform: translateY(6px);}}.content {width: calc(100% - 200px);margin-left: 200px;.item {height: 600px;font-size: 24px;border: 1px solid red;}}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5分钟科普:App开发与广告联盟变现法则

在移动互联网的时代&#xff0c;应用程序&#xff08;App&#xff09;已经成为人们生活的一部分。对于开发者来说&#xff0c;如何通过自己的应用获取收益&#xff0c;是他们需要解决的重要问题。广告联盟作为一种常见的广告变现方式&#xff0c;为开发者提供了一种可能。 广告…

Google I/O 2024:有关AI的一切已公布|TodayAI

2024年谷歌I/O大会圆满落幕&#xff0c;谷歌在会上发布了一系列更新&#xff0c;涵盖从最新的人工智能技术到Android系统的多项改进。此次大会特别关注于谷歌的Gemini人工智能模型&#xff0c;并详细介绍了这些模型如何被融入到Workspace、Chrome等多个应用程序中&#xff0c;展…

炫富神器,简单无脑粘贴复制,闷声发财,当天见收益,无上限封顶

项目主打简单、暴力、易操作、可复制&#xff0c;单人可做、不靠关系走门路、不重投资、可复制放大&#xff01; 今天给大家带来的这个项目&#xff0c;有点暴力&#xff0c;请先做好心理准备&#xff01;谨慎观看&#xff01;&#xff01; 这个项目原理是利用软件生成炫富视频…

ADCIRC+Python深度融合:台风风暴潮模拟、温带风暴潮模拟、天文潮模拟、风暴潮漫滩模拟;ADCIRC模式前处理和后处理等

目录 专题一 ADCIRC背景与原理 专题二 ADCIRC的编译安装 专题三 ADCIRC模式前处理 专题四 ADCIRC案例分析 专题五 Python基础与科学计算 专题六 ADCIRC模式后处理 更多应用 ADCIRC是新一代海洋水动力计算模型&#xff0c;它采用了非结构三角形网格广义波动连续方程的设计…

Go系列:git status 高级技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

智游剪辑1.5.0发布!

智游剪辑1.5.0发布了&#xff0c;快来看看更新了啥功能吧&#xff01; 主页卡片升级 现在功能卡片新增图标&#xff0c;比以前更好看更直观 我的收藏 遇到自己喜欢的功能直接点击收藏就可以了&#xff0c;后面我们就能快速找到这个功能 批量ncm转mp3功能 目前看后台有很多人…

H2-FDetector模型解析

文章目录 1. H2FDetector_layer 类2. RelationAware 类3. MultiRelationH2FDetectorLayer 类4. H2FDetector 类 这个实现包括三个主要部分&#xff1a;H2FDetector_layer、MultiRelationH2FDetectorLayer 和 H2FDetector。每个部分都有其独特的功能和职责。下面是这些组件的详细…

2024年将改变人类生活的七大技术

有没有想过未来会是什么样子&#xff1f;那么&#xff0c;不必等太久&#xff0c;因为2024年将会是充满惊人创新的一年&#xff0c;让你大开眼界。以下是七大新兴的科技创新趋势&#xff0c;它们无疑将在2024年改变我们的生活。 1. 人工智能技术 从智能手机、智能扬声器等日…

Flutter+Getx仿小米商城项目实战教程又新增了Flutter调用原生地图

FlutterGetx仿小米商城项目实战教程基于Flutter3.x录制&#xff0c;课程紧贴企业需求&#xff0c;目前已完结176讲。教程所讲内容支持Android、Ios、华为鸿蒙OS&#xff0c;教程更新于2024年4月09日新增 Flutter 调用百度地图、新增Flutter充电桩项目地图实战。支持2024年3月29…

Arduino-ILI9341驱动开发TFT屏显示任意内容三

Arduino-ILI9341驱动开发TFT屏显示任意内容三 1.概述 这篇文章介绍使用ILI9341驱动提供的函数控制TFT屏显示字符串、图形、符号等等内容的编辑和展示。 2.硬件 2.1.硬件列表 名称数量Arduino Uno12.8" TFT彩色液晶触摸屏模块&#xff08;ILI9431&#xff09;110K 电阻…

TensorFlow的学习

0.基础概念 术语表&#xff1a; https://developers.google.cn/machine-learning/glossary?hlzh-cn#logits 1.快速入门 https://tensorflow.google.cn/tutorials/quickstart/beginner?hlzh-cn 2.基于Keras进行图像分类 https://tensorflow.google.cn/tutorials/keras/cl…

免费申请https证书

免费申请https证书 https域名证书对提高网站排名有一定的好处&#xff0c;所以当今很多企业为了给网站一个好的安全防护&#xff0c;就会去申请该证书。如今很多企业虽然重视网站的安全防护&#xff0c;但是也重视成本&#xff0c;所以为了节约成本会考虑申请免费的https证书。…