实现锚点定位功能(React/Vue)

前言

最近接到一个需求,修改某某页面,增加XXX功能,并实现个锚点功能。做产品就是不断优化,增加功能的过程。实现锚点的方式很多, 很多UI库也提供了组件,可以根据自己的需求调整一下组件库也可以实现,也可以用<a href="XX" /> 标签实现,还可以基于scrollIntoView api实现。

使用a标签

<a> 标签的 href 属性值以 # 开头,后面跟着目标元素的 id。点击链接时,浏览器会滚动到具有对应 id 的元素位置。

这种方式的优势在于不需要额外的 JavaScript 代码,但缺点是默认的滚动行为可能会比较突兀。如果需要更平滑的滚动效果,你可以使用 JavaScript 来自定义滚动行为,或者使用 CSS 属性 scroll-behavior: smooth

import React from 'react';function YourComponent() {return (<div><a href="#anchor1">Go to Anchor 1</a><div id="anchor1">Anchor 1 Content</div><a href="#anchor2">Go to Anchor 2</a><div id="anchor2">Anchor 2 Content</div></div>);
}export default YourComponent;

使用scrollIntoView

scrollIntoView 是一个用于滚动元素到可见区域的 JavaScript 方法。它是在 Element 接口中定义的。

使用方法

element.scrollIntoView([options]);
  • options(可选)是一个包含滚动行为的对象,可以包括以下属性:
    • behavior: 定义滚动的过渡效果。可以是 "auto""smooth" 或者不指定。
    • block: 定义垂直方向上的对齐方式,可以是 "start""center""end" 或者 "nearest"
    • inline: 定义水平方向上的对齐方式,可以是 "start""center""end" 或者 "nearest"

示例

const element = document.getElementById('myElement');// 将元素滚动到可见区域,默认滚动行为
element.scrollIntoView();// 平滑滚动到可见区域
element.scrollIntoView({ behavior: 'smooth' });// 将元素滚动到可见区域,垂直方向上对齐到底部
element.scrollIntoView({ block: 'end' });// 将元素滚动到可见区域,水平和垂直方向上对齐到中心
element.scrollIntoView({ block: 'center', inline: 'center' });

使用scrollIntoView实现锚点定位,以下是个简单例子,给目标元素设置了一个 id 属性为 "yourAnchorId",然后在 scrollToAnchor 函数中,通过 document.getElementById 获取目标元素,并使用 scrollIntoView 方法将页面滚动到该元素位置。

使用 id 属性的方式更为简单,但需要确保 id 是唯一的,不会重复在页面中出现。

import React from 'react';function YourComponent() {const scrollToAnchor = () => {const anchorElement = document.getElementById('yourAnchorId');if (anchorElement) {anchorElement.scrollIntoView({ behavior: 'smooth' });}};return (<div><button onClick={scrollToAnchor}>Scroll to Anchor</button><div id="yourAnchorId">This is the anchor content</div></div>);
}export default YourComponent;

封装useScrollIntoView

可能不止一个页面需要做这种锚点的功能,考虑到通用性,可以封装一个自定义 Hook useScrollIntoView。我这里是使用的React框架,下面是相应的实现:

import { useRef, useEffect } from 'react';function useScrollIntoView() {const targetRef = useRef(null);function scrollToTarget() {if (targetRef.current) {targetRef.current.scrollIntoView({ behavior: 'smooth' });}}useEffect(() => {// 在组件挂载后立即滚动到目标元素scrollToTarget();}, []);return {targetRef,scrollToTarget,};
}export default useScrollIntoView;

然后, 在React 组件中使用这个 hook,如下所示:

import React from 'react';
import useScrollIntoView from './useScrollIntoView'; // 请替换成实际的路径function YourComponent() {const { targetRef: anchor1, scrollToTarget: scrollToAnchor1 } = useScrollIntoView();const { targetRef: anchor2, scrollToTarget: scrollToAnchor2 } = useScrollIntoView();return (<div><div ref={anchor1}>Anchor 1</div><div ref={anchor2}>Anchor 2</div><button onClick={scrollToAnchor1}>Scroll to Anchor 1</button><button onClick={scrollToAnchor2}>Scroll to Anchor 2</button></div>);
}export default YourComponent;

Vue中使用自定义指令

最近也在用vue,既然写到了,就想到也可以使用vue的自定义指令实现一个锚点功能。当然实现的方式多种多样,我这里就举个例子。
将自定义指令放在一个独立的文件中,然后在 main.js 文件中引入和注册这个指令。

// directive/ScrollTo.jsexport const scrollToDirective = {mounted(el, binding) {el.addEventListener('click', () => {const targetId = binding.value;const targetElement = document.getElementById(targetId);if (targetElement) {targetElement.scrollIntoView({ behavior: 'smooth' });}});}
};
// main.jsimport { createApp } from 'vue';
import App from './App.vue';
import { scrollToDirective } from './directive/ScrollTo';const app = createApp(App);// 注册全局指令
app.directive('scroll-to', scrollToDirective);app.mount('#app');

使用

<!-- App.vue --><template><div><h1>Scroll to Section</h1><button v-scroll-to="'section1'">Scroll to Section 1</button><button v-scroll-to="'section2'">Scroll to Section 2</button><div id="section1" class="section"><h2>Section 1</h2><p>This is the content of Section 1.</p></div><div id="section2" class="section"><h2>Section 2</h2><p>This is the content of Section 2.</p></div></div>
</template><script>
export default {// ...
};
</script><style>
.section {margin-top: 500px; /* Add some space to make scrolling noticeable */
}
</style>

效果:
在这里插入图片描述

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

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

相关文章

vulhub中的Apache HTTPD 换行解析漏洞(CVE-2017-15715)详解

Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09; 1.cd到CVE-2017-15715 cd vulhub/httpd/CVE-2017-15715 2.运行docker-compose build docker-compose build 3.运行docker-compose up -d 4.查看docker-compose ps 5.访问 出现这个表示安装成功 6.漏洞复现…

C 练习实例22

题目&#xff1a;两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c;乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。 首先吐槽一下&#xff0c;这是…

Linux系统操作命令

Linux管理 在线查询Linux命令&#xff1a; https://www.runoob.com/linux/linux-install.htmlhttps://www.linuxcool.com/https://man.linuxde.net/ 1.Linux系统目录结构 Linux系统的目录结构是一个树状结构&#xff0c;每一个文件或目录都从根目录开始&#xff0c;并且根目…

MySQL语法练习-DML语法练习

文章目录 0、相关文章1、添加数据2、修改数据3、删除数据4、总结 0、相关文章 《MySQL练习-DDL语法练习》 1、添加数据 # 给指定字段添加数据 insert into 表名 (字段名1,字段名2,...) values(值1,值2...);# 给全部字段添加数据 insert into 表名 values(值1,值2,...);#批量…

五种主流数据库:字符串匹配

当我们不能完全确定需要查找的信息时&#xff0c;可以使用 SQL 模糊查找的功能进行文本检索&#xff0c;对应的运算符是 LIKE。 本文比较五种主流数据库对于文本模糊查找的实现和差异&#xff0c;包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。 字符串模糊匹配My…

C++入门【24-C++ 传递指针给函数】

C 允许您传递指针给函数&#xff0c;只需要简单地声明函数参数为指针类型即可。 下面的实例中&#xff0c;我们传递一个无符号的 long 型指针给函数&#xff0c;并在函数内改变这个值&#xff1a; 实例 #include <iostream>#include <ctime>using namespace std…

MySQL面试系列-02

1. 表分区有什么好处&#xff1f; 1、存储更多数据。分区表的数据可以分布在不同的物理设备上&#xff0c;从而高效地利用多个硬件设备。和单个磁盘或者文件系统相比&#xff0c;可以存储更多数据 2、优化查询。在where语句中包含分区条件时&#xff0c;可以只扫描一个或多个…

Docker查看镜像的Dockerfile

前言 在使用Docker构建应用程序时&#xff0c;我们可以通过Dockerfile定义应用程序的环境&#xff0c;并将其打包成一个镜像。有时&#xff0c;我们可能需要查看一个已经构建好的镜像的Dockerfile&#xff0c;以了解镜像是如何构建的&#xff0c;或者进行后续的修改和调整。本…

python股票分析挖掘预测技术指标知识之蜡烛图指标(6)

本人股市多年的老韭菜&#xff0c;各种股票分析书籍&#xff0c;技术指标书籍阅历无数&#xff0c;萌发想法&#xff0c;何不自己开发个股票预测分析软件&#xff0c;选择python因为够强大&#xff0c;它提供了很多高效便捷的数据分析工具包。 我们已经初步的接触与学习其中数…

【华为OD机试真题2023CD卷 JAVAJS】根据IP查找城市

华为OD2023(C&D卷)机试题库全覆盖,刷题指南点这里 根据IP查找城市 时间限制:3s 空间限制:256MB 限定语言:不限 题目描述: 某业务需要根据终端的IP地址获取该终端归属的城市,可以根据公开的IP地址池信息查询归属城市。地址池格式如下城市名=起始IP,结束IP,起始和结…

利用格式工厂,做视频的剪辑

接到一个工作&#xff0c;一段视频中&#xff0c;需要抠除其中某一段 其实 剪映、苹果手机的视频编辑功能&#xff0c;都可以轻松搞定 只是清晰度会有损伤 而且对于太大的视频&#xff0c;苹果手机就没法处理了。 很多软件在导出高清视频时&#xff0c;需要会员收费&#xff0…

【PHP】判断字符串是否是有效的base64编码

目录 1.检测长度&#xff1a; 2.检查字符集&#xff1a; 在PHP中&#xff0c;判断一个字符串是否是有效的Base64编码&#xff0c;可以通过以下几种方法&#xff1a; 1.检测长度&#xff1a; Base64编码的字符串长度必须是4的倍数&#xff08;对于标准的Base64编码&#xff…

什么是.jks(.keystore)文件

.jks 文件就是Java KeyStore (JKS)文件。它的用于存储加密密钥和证书。这个jks可以用在SSL加密&#xff0c;Android应用签名&#xff0c;Java应用等上面。 其实&#xff0c;我们还见过.keystore文件&#xff0c;它和.jks文件是一样的。 .jks 文件是.keystore 文件的其中一种。…

Java学习笔记-day02-在IDEA中使用git忽略提交.idea下的文件

1.在根目录.gitignore文件排除.idea目录 ### IntelliJ IDEA ### .idea2.使用重置Head还原已经add过的文件 创建项目时&#xff0c;可能会有.idea中的文件先add到git后再创建的.gitignore文件&#xff0c;导致文件commit时无法排除&#xff0c;如下所示。 使用重置Head将文件…

Python从入门到网络爬虫(JSON详解)

前言 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。和XML相比&#xff0c;JSON更加简洁和易于读写&#xff0c;同时也更加易于解析和生成。JSON的基本数据类型包括字符串、数字、布尔、null以及数组和对象两种复合类型。各种编程语言都…

深度学习 常考简答题--[HBU]期末复习

目录 1.为什么要引用非线性激活函数&#xff1f; 2.什么是超参数&#xff1f;如何优化超参数&#xff1f; 3.线性回归通常使用平方损失函数&#xff0c;能否使用交叉熵损失函数&#xff1f; 4.平方损失函数为何不适用于解决分类问题&#xff1f;(和第3题一块复习) ​编辑 …

新年新风貌 苏州金龙蔚蓝公交护航高贸区“效率巴士”!

1月4日&#xff0c;由苏州市公交集团园区公司与园区高贸区管委会联合推出的4条“高贸区效率巴士”正式开行&#xff0c;这四条线路惠及包括苏州群策科技有限公司、荣旗工业科技有限公司等在内的20余家高贸区重点企业。线路开行5天来&#xff0c;效率巴士让不少企业员工感受到了…

开发者与下雨天:一种独特的情感联结

在科技行业中&#xff0c;开发者是一个独特的群体&#xff0c;他们以逻辑严密的思维和对技术的执着追求为世界编织出无数精彩的数字画卷。而在日常生活中&#xff0c;一个常被提起的现象是许多开发者似乎对下雨天有着特别的喜爱。本文旨在探讨这种现象背后可能存在的心理、生理…

电口模块SFP-GE-T:实现光口与电口之间的转换

电口模块是一种用于实现光口转电口功能的设备&#xff0c;在网络通信中起到重要作用。电口模块没有光电转换的过程&#xff0c;只是传输电信号。本文介绍电口模块的作用、分类、以及使用方法。 一、什么是电口模块 电口模块又被称为光转电模块&#xff0c;它是一种支持热插拔…

LeetCode——447. 回旋镖的数量

大佬&#xff0c;牛&#xff01;&#xff01;&#xff01; 题目&#xff1a;给你一个n*2的数组&#xff0c;表示n个点。然后让你从中选择三个点i,j,k&#xff0c;使得i到j和i到k的欧氏距离相等。问一共有多少种情况。需要注意的是&#xff0c;假设i,j,k是满足条件的&#xff0…