如何在 JavaScript 中创建选项卡?

2023-12-09

我一直在尝试用 JavaScript 创建选项卡。当点击一个new tab the 活跃班应适用于它及其相关的面板内容应该显示。但是,那活跃班单击另一个选项卡时不会应用panels也没有改变,它们只是相互堆叠。

const tabs = document.querySelector(".tabs");
const active = document.querySelector(".active");
const panel = document.querySelector(".panel");

function onTabClick(event) {

  // deactivate existing active tabs and panel
  active.classList.remove('.active');

  for (let i = 0; i < panel.length; i++) {
    panel[i].style.display = "none";
  }


  // activate new tabs and panel
  event.target.classList.add('.active');
  let classString = event.target.innerHTML;
  console.log(classString);
  document.getElementsByClassName(classString)[0].style.display = "block";
}

tabs.addEventListener('click', onTabClick, false);
.tabs {
  display: flex;
  justify-content: space-around;
  margin: 20px 2px 40px 2px;
  height: 40px;
  box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2);
}

.tabs>* {
  width: 100%;
  color: dimgray;
  height: 100%;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
}

.tabs>*:hover:not(.active) {
  background-color: rgb(220, 220, 220);
}

.tabs>.active {
  color: white;
  background-color: #4CAF50;
}

.panel {
  display: none;
}
<!DOCTYPE html>
<html lang="en" dir="ltr">

<head>
  <meta charset="utf-8">
  <title></title>
</head>

<body>
  <div class="tabs">
    <div class="tab active">List</div>
    <div class="tab">Grid</div>
    <div class="tab">something</div>
  </div>
  <div class="Lists panel" style='display:block'>
    panel 1 text
  </div>
  <div class="Grid panel">
    panel 2 text
  </div>
  <div class="something panel">
    panel 3 text
  </div>

</body>

</html>

在 JavaScript 中,当获取特定类的所有元素时,document.querySelecto(".className")只获取给定类的第一个元素。要获取所有元素,您必须使用document.querySelectorAll(".className").

然后,当从元素中添加或删除类时,不要将点放在类名之前。所以而不是tab[i].classList.remove(".active");, 它应该是tab[i].classList.remove("active");.

另外,我没有明确隐藏面板元素,而是使用了active将应用于面板关联选项卡的类。

最后,您不应使用选项卡文本作为相应面板的类名称。当选项卡文本中有多个单词时,这会出现问题。我所做的是使用选项卡的数据属性来指定面板的相对类并将所有面板放在一个div元素.panels。现在您可以在选项卡中放置您想要的任何文本并使用data-target属性,放置面板的类名称。

const tabs = document.querySelectorAll(".tabs");
const tab = document.querySelectorAll(".tab");
const panel = document.querySelectorAll(".panel");

function onTabClick(event) {

  // deactivate existing active tabs and panel

  for (let i = 0; i < tab.length; i++) {
    tab[i].classList.remove("active");
  }

  for (let i = 0; i < panel.length; i++) {
    panel[i].classList.remove("active");
  }


  // activate new tabs and panel
  event.target.classList.add('active');
  let classString = event.target.getAttribute('data-target');
  console.log(classString);
  document.getElementById('panels').getElementsByClassName(classString)[0].classList.add("active");
}

for (let i = 0; i < tab.length; i++) {
  tab[i].addEventListener('click', onTabClick, false);
}
.tabs {
  display: flex;
  justify-content: space-around;
  margin: 20px 2px 40px 2px;
  height: 40px;
  box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.2);
}

.tabs>* {
  width: 100%;
  color: dimgray;
  height: 100%;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
}

.tabs>*:hover:not(.active) {
  background-color: rgb(220, 220, 220);
}

.tabs>.active {
  color: white;
  background-color: #4CAF50;
}

.panel {
  display: none;
}

.panel.active {
  display: block;
}
<div class="tabs">
  <div class="tab active" data-target="Lists">Lists</div>
  <div class="tab" data-target="Grid">Grid</div>
  <div class="tab" data-target="Something">Something</div>
</div>
<div id="panels">
  <div class="Lists panel active">
    panel 1 text
  </div>
  <div class="Grid panel">
    panel 2 text
  </div>
  <div class="Something panel">
    panel 3 text
  </div>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 JavaScript 中创建选项卡? 的相关文章

随机推荐

  • 上传错误#2038

    每当我使用此脚本进行测试时 它在上传尝试时都会不断失败并给出错误 IO 2038我可以肯定地说的是它甚至永远不会到达 Upload ashx 的后端脚本 这告诉我脚本有问题 现在我正在我的测试机器上使用 localhost 执行此操作 ht
  • 使用 Swing 在窗格中选择文件

    我正在 Swing 中编写一个 GUI 我想在主窗口中创建一个文件选择器 如下图所示 虽然似乎有很多关于如何编写弹出文件选择器的教程 但我没有看到太多关于如何在 swing 中完成这种类型的选择器的信息 也很抱歉 如果之前有人问过这个问题
  • 如何延迟推送通知权限弹出窗口 Swift

    我正在开发一个带有推送通知的应用程序 我想延迟推送通知权限弹出的出现 直到用户第三次进入我的应用程序之后 所以他应该对我的应用程序感兴趣 然后我想征求他的许可 我有办法做到这一点吗 我搜索了很多方法 就像这里 重置应用程序的推送通知设置但我
  • AngularJS 路由有什么意义?

    我正在创建一个网站 我选择在 AJ 中进行 我有两个文件夹 网关 gt 一些从 mysql 数据库检索数据并将数据作为 json 回显的 php 文件 Views gt 部分 html 文件 基本上是每个页面的模板 例如用户 项目等 然后我
  • 将参数括在括号中时,Ruby Kernel.raise 方法会引发错误

    我喜欢用括号括起来的方法参数 这是对 Pascal 的怀念 在清理代码时 如果我发现没有它的方法参数 我会立即将它们括起来 今天 它导致我的工作代码抛出错误 尽管根据文档我的语法看起来没问题 Kernel raise 的文档具有以下格式 O
  • C# 数据连接最佳实践?

    好吧 这是一种固执己见的话题 但根据你的知识 观点和当前的实践 设置以下场景的最佳方法是什么 我正在构建一个广泛的数据输入应用程序 我所说的广泛是指我只完成了基本设置 其中包含整个程序的大约 15 25 并且我有大约 15 个部分设置的表单
  • 将日历与闪亮的散点图链接起来

    如果可能的话 我希望您帮助我将我的日历链接到我想做的一些散点图 我要解释一下 我的想法是 当该人在日历上选择 01 01 2021 选项时 他会生成一个散点图 其中包含每个类别的第一个点 即 D1 DR01 DR02 DR03 和 DR04
  • stackoverflow错误:检查数字是偶数还是奇数,没有%或/运算符[重复]

    这个问题在这里已经有答案了 在没有 或 运算符的情况下检查数字是偶数还是奇数 public class EvenOrOdd public static int CheckEvenOrOdd int num if num gt 2 int n
  • 有人可以非常详细且易于理解地向我解释 SharedPreferences 在 Android 中的工作原理吗?

    我是 Android 开发新手 现在我真的很想学习共享首选项 我用谷歌搜索了很多次 但我认为我还没有完全掌握它 我相信此共享首选项将帮助我在登录屏幕活动中存储用户名和密码 感谢您 我制作了一些关于此的视频作为工作试镜 他们帮助我得到了这份工
  • 带 cookie 的 iPhone NSData/NSUrl

    我正在尝试播放 流式传输网站上托管的 mp3 该网站需要设置 cookie 标头 但我在设置该标头或让容器为我执行此操作时遇到困难 NSURL sampleUrl NSURL URLWithString http domain files
  • R - 使用任何其他列中的值填充列

    我有一个 5 列的数据框 4 列有值 1 列为空 我想用 4 列中任意一列中的任意值填充空列 假设这是我的数据框df Col1 Col2 Col3 Col4 Col5 11 11 2 2 2 23 4 4 15 15 我希望我的结果看起来像
  • 如何在 url asp.net mvc 4 中添加扩展名 .html?

    我有网址 http localhost 1714 Message Index 我想展示 http localhost 1714 Message Index html 我该怎么做 您需要修改 Web config 以将对 HTML 文件的请求
  • YouTube API 返回带有空列表的 nextPageToken

    这个问题与 YouTube API 500 1000 无关有意义的结果问题 我认为 YouTube API nextPageTokens 的工作方式是 一旦没有更多结果可返回 它们将为 null 但是 我看到一开始就返回了结果 但有时即使只
  • 如何将指针分配给矩阵的对角线?

    我有一个矩阵说REAL 8 MATRIX 100 100 我想仅从主对角线或上三角形创建一个指针 怎么做 目的是以干净的 命名 方式轻松访问这些元素 对于主对角线 请小心 您可以执行以下操作 PROGRAM diagonal IMPLICI
  • 过滤嵌套字典[重复]

    这个问题在这里已经有答案了 所以我有这本字典 Filme 1 Titel 20 Jahr 2 Wertung 6 Preis 50 Schauspielern a b c 2 Titel 30 Jahr 3 Wertung 7 Preis
  • 如何确定 TypeScript.Expression 对象的结果类型?

    使用 TypeScript 抽象语法树时 如何确定 TypeScript Expression 对象的结果类型 我正在使用 TSLint 并尝试查找不传递 Function 类型的对象作为第一个参数的 setTimeout 调用 例如 在下
  • 将同步调用包装在 Task.Run() 中以使其异步是否有益?

    我提出这个问题的动机是因为我正在创建一个 net Web API 项目 该项目将使用具有同步方法的现有 Neo4j Rest API 客户端 我想通过使用异步方法来利用一些性能提升 但我想避免进入 neo4j api 库并重构同步方法以返回
  • 如何在node.js服务器中自动重新连接mongo?

    假设我有一个连接到 mongoDB 的 Node js 服务器 然后 mongoDB 死亡或断开连接 当然 node js 服务器会失去连接 即使我重新启动 mongoDB node js 服务器也不会自动连接到新的 mongodb 即使它
  • 系统找不到Android Studio指定的文件

    每当我尝试运行 Android 应用程序时 我都会收到一条错误消息 Error C Users zeshan gradle caches 2 14 1 scripts remapped build 6xj57zedh3l90p9pnawvv
  • 如何在 JavaScript 中创建选项卡?

    我一直在尝试用 JavaScript 创建选项卡 当点击一个new tab the 活跃班应适用于它及其相关的面板内容应该显示 但是 那活跃班单击另一个选项卡时不会应用panels也没有改变 它们只是相互堆叠 const tabs docu