用JavaScript实现每次点击按钮(button)时,页面就会平滑地滚动(scroll)到下一个目标元素(class)的位置

引子

最近在练习JavaScript,想着有没有方案可以在网页上悬浮一个按钮,然后每次一按这个按钮,就可以跳转到网页中有着特定的class的位置去呢?

答案当然是肯定的。

虽然网上绝大部分教程都是教你如何跳转到id的位置,可是id毕竟是唯一性的,如果我想重复点击按钮,依次跳转到同一个位置,那么就没有那么方便了。

以下是我多次尝试之后的结果,供各位有缘之士参考。

正文

下面是一个示例代码,演示了如何通过点击一个按钮跳转到具有相同类名的元素位置,并在继续点击时跳转到下一个具有相同类名的元素位置。

首先,我们需要一些HTML元素,并且要有一个按钮:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jump to Class Example</title>
    <style>
        .target {
            margin: 50px 0;
            padding: 20px;
            background-color: lightblue;
        }
    </style>
</head>
<body>
    <button id="jumpButton">Jump to Next</button>

    <div class="target">Target 1</div>
    <div class="target">Target 2</div>
    <div class="target">Target 3</div>
    <div class="target">Target 4</div>

    <script>
        // JavaScript to handle the jumping logic
        document.addEventListener('DOMContentLoaded', (event) => {
            const button = document.getElementById('jumpButton');
            const targets = document.querySelectorAll('.target');
            let currentIndex = 0;

            button.addEventListener('click', () => {
                if (targets.length > 0) {
                    targets[currentIndex].scrollIntoView({ behavior: 'smooth' });
                    currentIndex = (currentIndex + 1) % targets.length;
                }
            });
        });
    </script>
</body>
</html>

这个代码做了以下几件事:

  1. HTML部分:
  • 一个按钮用于触发跳转。
  • 若干个具有相同类名(.target)的元素。
  1. CSS部分:
  • 简单的样式设置,使目标元素更容易识别。
  1. JavaScript部分:
  • 当页面加载完成后,获取按钮和所有具有.target类的元素。
  • 监听按钮的点击事件,每次点击按钮时,调用scrollIntoView方法将当前目标元素滚动到视图中。
  • 使用一个currentIndex变量来跟踪当前跳转到的元素索引,并在每次点击后更新索引,以便下次点击时跳转到下一个目标元素。
  • 当索引超出目标元素数组长度时,使用模运算符%将索引重置为0,实现循环跳转。

这样,每次点击按钮时,页面就会平滑地滚动到下一个目标元素的位置。

拓展 - 多个按钮跳转多个不同的class位置

有的朋友可能会问,虽然实现了一个按钮的效果,那如果我有多个按钮,代码要如何写呢?

好问题!

我们可以为每个按钮和目标类创建一个映射,利用JavaScript来处理不同按钮和目标类的跳转逻辑。下面是重构后的代码示例,让它清晰的复用给四个button跳转四个不同的class位置。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Jump to Class Example</title>
    <style>
        .target1, .target2, .target3, .target4 {
            margin: 50px 0;
            padding: 20px;
            background-color: lightblue;
        }
    </style>
</head>
<body>
    <button class="jumpButton" data-target-class="target1">Jump to Target 1</button>
    <button class="jumpButton" data-target-class="target2">Jump to Target 2</button>
    <button class="jumpButton" data-target-class="target3">Jump to Target 3</button>
    <button class="jumpButton" data-target-class="target4">Jump to Target 4</button>

    <div class="target1">Target 1</div>
    <div class="target1">Target 1</div>
    <div class="target2">Target 2</div>
    <div class="target2">Target 2</div>
    <div class="target3">Target 3</div>
    <div class="target3">Target 3</div>
    <div class="target4">Target 4</div>
    <div class="target4">Target 4</div>

    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const buttons = document.querySelectorAll('.jumpButton');
            const indices = {};

            buttons.forEach(button => {
                const targetClass = button.getAttribute('data-target-class');
                indices[targetClass] = 0;

                button.addEventListener('click', () => {
                    const targets = document.querySelectorAll(`.${targetClass}`);
                    if (targets.length > 0) {
                        targets[indices[targetClass]].scrollIntoView({ behavior: 'smooth' });
                        indices[targetClass] = (indices[targetClass] + 1) % targets.length;
                    }
                });
            });
        });
    </script>
</body>
</html>

代码说明

  • HTML部分:

  • 四个按钮,每个按钮有一个data-target-class属性,用于指定要跳转的目标类。

  • 各个目标类元素。

  • CSS部分:

  • 简单的样式设置,使不同目标元素更容易识别。

  • JavaScript部分:

  • 当页面加载完成后,获取所有带有.jumpButton类的按钮。

  • 创建一个indices对象,用于跟踪每个目标类的当前索引。

  • 遍历每个按钮,根据data-target-class属性获取目标类,并初始化其索引。

  • 为每个按钮添加点击事件监听器:

    • 根据目标类名选择目标元素。
    • 使用scrollIntoView方法将当前索引对应的目标元素滚动到视图中。
    • 更新索引,以便下次点击时跳转到下一个目标元素。索引使用模运算符%循环重置。

这样,每个按钮点击时会跳转到其对应的目标类元素,并在继续点击时循环跳转到下一个同类元素。

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

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

相关文章

【LLM】二、python调用本地的ollama部署的大模型

系列文章目录 往期文章&#xff1a; 【LLM】一、利用ollama本地部署大模型 目录 文章目录 前言 一、ollama库调用 二、langchain调用 三、requests调用 四、相关参数说明&#xff1a; 总结 前言 本地部署了大模型&#xff0c;下一步任务便是如何调用的问题&#xff0c…

科普文:K8S中常见知识点梳理

简单说一下k8s集群内外网络如何互通的 要在 Kubernetes&#xff08;k8s&#xff09;集群内外建立网络互通&#xff0c;可以采取以下措施&#xff1a; 使用service&#xff1a; 使用Service类型为NodePort或LoadBalancer的Kubernetes服务。这可以使服务具有一个公共IP地址或端口…

探展2024世界人工智能大会之令人惊艳的扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的知识库大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09;&#xff0c;这次非常荣幸受邀作为专业…

基于单片机的太阳能智能追光系统设计

摘 要&#xff1a; 光伏能源是一种发电新能源&#xff0c;具有高清洁度、高再生的特点&#xff0c;在能源紧张的当代其应用价值极高。目前&#xff0c;光伏能源发电主要利用光伏设备来实现&#xff0c;但在初期应用过程中&#xff0c;人们发现&#xff0c;太阳光的移动会决定光…

ElasticSearch学习篇14_《检索技术核心20讲》进阶篇之大倒排索引

背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243&#xff0c;文档形式记录笔记。 内容 主要是海量数据的大倒排索引的一些原理设计思想&#xff0c;ES底层就是基于这些设计思想以及原理&#xff0c;主要涉及读写分离、索引分层等…

C++ | Leetcode C++题解之第223题矩形面积

题目&#xff1a; 题解&#xff1a; class Solution { public:int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {int area1 (ax2 - ax1) * (ay2 - ay1), area2 (bx2 - bx1) * (by2 - by1);int overlapWidth min(ax2, bx2) - max…

vb.netcad二开自学笔记9:界面之ribbon

一个成熟的软件怎么能没有ribbon呢&#xff0c;在前面的框架基础上再加个命令AddRibbon <CommandMethod("AddRibbon")> Public Sub AddRibbon() Dim ribbonControl As RibbonControl ComponentManager.Ribbon Dim tab As RibbonTab New RibbonTab() tab.Tit…

# 昇思25天学习打卡营第10天 | 使用静态图加速

昇思25天学习打卡营第10天 | 使用静态图加速 文章目录 昇思25天学习打卡营第10天 | 使用静态图加速动态图的开启方式静态图的开启方式基于全局context的开启方式基于修饰器的开启方式 总结打卡 AI编译框架分为两种运行模式&#xff1a; 动态图模式&#xff1a; 计算图的构建和计…

近红外光谱脑功能成像(fNIRS):2.实验设计、指标计算与多重比较

一、实验设计的策略与方法 近红外光谱成像&#xff08;INIRS&#xff09;作为一种非侵入性脑功能成像技术&#xff0c;为研究大脑活动提供了一种高效、生态效度高的方法。然而&#xff0c;为了充分利用INIRS技术并确保实验结果的准确性和可靠性&#xff0c;研究者必须精心设计实…

AGAST (角点检测)

AGAST检测原理 AGAST(Adaptive and Generic Accelerated Segment Test)算法是Elmar于2010年提出的特征检测算法,改进了FAST(Features from Accelerated Segment Test)特征检测方法,使其具有更快的速度和更好的鲁棒性。AGAST算法提供了比FAST算法更详细的特征标记方式和判断依…

DWM 相关实现代码 [自用]

1. DWM 缩略图和模糊隐藏实现半透明 #include <windows.h> #include <dwmapi.h> #include <string> #pragma comment(lib, "dwmapi.lib")// 检查 UWP 窗口是否可见 bool IsUWPWindowVisible(HWND hwnd) {DWORD cloaked 0;DwmGetWindowAttribute(…

matplotlib颜色对照表

matplotlib的色彩设置: #------------------------------------------------------------------------------------------------------------------------------- #-------------------------------------------------------------------------------------------------------…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生&#xff0c;大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

【AI大模型】赋能儿童安全:楼层与室内定位实践与未来发展

文章目录 引言第一章&#xff1a;AI与室内定位技术1.1 AI技术概述1.2 室内定位技术概述1.3 楼层定位的挑战与解决方案 第二章&#xff1a;儿童定位与安全监控的需求2.1 儿童安全问题的现状2.2 智能穿戴设备的兴起 第三章&#xff1a;技术实现细节3.1 硬件设计与选择传感器选择与…

报修小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…

Java | Leetcode Java题解之第224题基本计算器

题目&#xff1a; 题解&#xff1a; class Solution {public int calculate(String s) {Deque<Integer> ops new LinkedList<Integer>();ops.push(1);int sign 1;int ret 0;int n s.length();int i 0;while (i < n) {if (s.charAt(i) ) {i;} else if (s…

(十一) Docker compose 部署 Mysql 和 其它容器

文章目录 1、前言1.1、部署 MySQL 容器的 3 种类型1.2、M2芯片类型问题 2、具体实现2.1、单独部署 mysql 供宿主机访问2.1.1、文件夹结构2.1.2、docker-compose.yml 内容2.1.3、运行 2.2、单独部署 mysql 容器供其它容器访问&#xff08;以 apollo 为例&#xff09;2.2.1、文件…

allWebPlugin中间件实现ActiveX插件在谷歌、火狐、Edge浏览器使用

下载并安装allWebPlugin中间件 1、请从下面地址下载allWebPlugin中间件产品&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1xUyQDzOabh7mU7J7TYhtig?pwdz3q0 提取码&#xff1a;z3q0 如下图所示&#xff0c;下载最新allWebPlugin_x86_v2.0.0.14_stable_20240707…

Flutter【组件】标签

简介 flutter 标签组件。标签组件是一种常见的 UI 元素&#xff0c;用于显示和管理多个标签&#xff08;或标签集合&#xff09;。 github地址&#xff1a; https://github.com/ThinkerJack/jac_uikit pub地址&#xff1a;https://pub.dev/packages/jac_uikit 使用方式&…

机器学习:预测评估8类指标

机器学习&#xff1a;8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明&#xff1a; R方值&#xff0c;也称为确定系数或拟合优度&#xff…