js自定义Tab选项卡效果

来一份完整的 “JS 自定义 Tab 选项卡效果” 的攻略吧。

1. 确定需求及基本思路

在实现一个自定义的 Tab 选项卡效果时,我们需要先理解需求和基本思路。

需求

  • 根据用户的操作显示不同的内容区域;
  • 点击不同的选项卡可以显示对应的内容区域;
  • 选项卡可以自定义样式(如背景颜色、字体颜色等)。

基本思路

  • 使用 HTML 和 CSS 构建选项卡和内容区域;
  • 使用 JavaScript 添加事件监听器,当用户点击选项卡时,显示对应的内容区域。

2. HTML 结构

先来看一下 HTML 结构:

<div class="tab-container">
  <div class="tab-header">
    <span class="tab-item active">选项卡1</span>
    <span class="tab-item">选项卡2</span>
    <span class="tab-item">选项卡3</span>
  </div>
  <div class="tab-body">
    <div class="tab-panel active">内容1</div>
    <div class="tab-panel">内容2</div>
    <div class="tab-panel">内容3</div>
  </div>
</div>

其中,.tab-header 是选项卡容器,.tab-item 是选项卡,.tab-body 是内容容器,.tab-panel 是内容区域。

默认情况下,第一个选项卡和对应的内容区域应该是激活状态的,所以我们给它们添加 .active 类。

3. CSS 样式

对于 CSS 样式,可以根据自己的需求进行自定义,这里只给一个简单的样式:

.tab-item {
  padding: 10px 20px;
  background-color: #ccc;
  border: 1px solid #999;
  cursor: pointer;
  user-select: none;
}

.tab-item.active {
  background-color: #f60;
  color: #fff;
}

.tab-panel {
  padding: 20px;
  border: 1px solid #999;
}

.tab-panel.active {
  display: block;
}

.tab-panel {
  display: none;
}

4. JavaScript 逻辑

有了 HTML 和 CSS 的基础,接下来就是 JavaScript 的逻辑代码了。

4.1 获取 DOM 元素并添加事件监听器

// 获取 DOM 元素
const tabs = document.querySelectorAll('.tab-item');
const panels = document.querySelectorAll('.tab-panel');

// 添加事件监听器
tabs.forEach((tab, index) => {
  tab.addEventListener('click', (e) => {
    e.preventDefault();
    // 切换选项卡和内容区域的状态
    toggleTab(index);
  });
});

首先获取所有的选项卡和内容区域,然后对每个选项卡添加一个点击事件监听器,当用户点击选项卡时,会触发该事件监听器。

4.2 切换选项卡和内容区域的状态

function toggleTab(index) {
  // 切换选项卡的状态
  tabs.forEach((tab, idx) => {
    if (idx === index) {
      tab.classList.add('active');
    } else {
      tab.classList.remove('active');
    }
  });

  // 切换内容区域的状态
  panels.forEach((panel, idx) => {
    if (idx === index) {
      panel.classList.add('active');
    } else {
      panel.classList.remove('active');
    }
  });
}

当用户点击选项卡时,该函数会被触发,它会根据选项卡的索引值,切换选项卡和内容区域的状态。

具体来说,它会从所有选项卡中找到索引值等于点击的选项卡索引值的选项卡,并给它添加 .active 类;同时,它会从所有内容区域中找到索引值等于点击的选项卡索引值的内容区域,并给它添加 .active 类。

4.3 初始化状态

function initTab() {
  // 默认激活第一个选项卡和内容区域
  tabs[0].classList.add('active');
  panels[0].classList.add('active');
}

在页面加载完成后,需要默认激活第一个选项卡和内容区域。

5. 示例说明

示例 1

下面是一个简单的示例,实现了一个基本的 Tab 选项卡效果:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Tab 选项卡示例 1</title>
    <style>
      /* CSS 样式 */
      .tab-item {
        padding: 10px 20px;
        background-color: #ccc;
        border: 1px solid #999;
        cursor: pointer;
        user-select: none;
      }

      .tab-item.active {
        background-color: #f60;
        color: #fff;
      }

      .tab-panel {
        padding: 20px;
        border: 1px solid #999;
      }

      .tab-panel.active {
        display: block;
      }

      .tab-panel {
        display: none;
      }
    </style>
  </head>
  <body>
    <div class="tab-container">
      <div class="tab-header">
        <span class="tab-item active">选项卡1</span>
        <span class="tab-item">选项卡2</span>
        <span class="tab-item">选项卡3</span>
      </div>
      <div class="tab-body">
        <div class="tab-panel active">内容1</div>
        <div class="tab-panel">内容2</div>
        <div class="tab-panel">内容3</div>
      </div>
    </div>

    <script>
      // JavaScript 逻辑
      const tabs = document.querySelectorAll('.tab-item');
      const panels = document.querySelectorAll('.tab-panel');

      function toggleTab(index) {
        tabs.forEach((tab, idx) => {
          if (idx === index) {
            tab.classList.add('active');
          } else {
            tab.classList.remove('active');
          }
        });

        panels.forEach((panel, idx) => {
          if (idx === index) {
            panel.classList.add('active');
          } else {
            panel.classList.remove('active');
          }
        });
      }

      tabs.forEach((tab, index) => {
        tab.addEventListener('click', (e) => {
          e.preventDefault();
          toggleTab(index);
        });
      });

      // 初始化状态
      tabs[0].classList.add('active');
      panels[0].classList.add('active');
    </script>
  </body>
</html>

运行该示例,可以看到基本的 Tab 选项卡效果已经实现。

示例 2

下面是一个稍微复杂一些的示例,实现了一个带有自定义样式的 Tab 选项卡效果:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Tab 选项卡示例 2</title>
    <style>
      /* CSS 样式 */
      .custom-tab-container {
        font-family: Arial, sans-serif;
        font-size: 16px;
        padding: 10px;
        background-color: #fff;
        border-radius: 5px;
        box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
      }

      .custom-tab-header {
        display: flex;
        justify-content: space-between;
        background-color: #f60;
        border-radius: 5px;
        overflow: hidden;
      }

      .custom-tab-item {
        flex: 1;
        padding: 10px;
        text-align: center;
        color: #fff;
        cursor: pointer;
        user-select: none;
      }

      .custom-tab-item.active {
        background-color: #fff;
        color: #f60;
      }

      .custom-tab-panel {
        padding: 20px;
        border: 1px solid #999;
        background-color: #fff;
      }

      .custom-tab-panel.active {
        display: block;
      }

      .custom-tab-panel {
        display: none;
      }
    </style>
  </head>
  <body>
    <div class="custom-tab-container">
      <div class="custom-tab-header">
        <span class="custom-tab-item active">选项卡1</span>
        <span class="custom-tab-item">选项卡2</span>
        <span class="custom-tab-item">选项卡3</span>
      </div>
      <div class="custom-tab-body">
        <div class="custom-tab-panel active">内容1</div>
        <div class="custom-tab-panel">内容2</div>
        <div class="custom-tab-panel">内容3</div>
      </div>
    </div>

    <script>
      // JavaScript 逻辑
      const tabs = document.querySelectorAll('.custom-tab-item');
      const panels = document.querySelectorAll('.custom-tab-panel');

      function toggleTab(index) {
        tabs.forEach((tab, idx) => {
          if (idx === index) {
            tab.classList.add('active');
          } else {
            tab.classList.remove('active');
          }
        });

        panels.forEach((panel, idx) => {
          if (idx === index) {
            panel.classList.add('active');
          } else {
            panel.classList.remove('active');
          }
        });
      }

      tabs.forEach((tab, index) => {
        tab.addEventListener('click', (e) => {
          e.preventDefault();
          toggleTab(index);
        });
      });

      // 初始化状态
      tabs[0].classList.add('active');
      panels[0].classList.add('active');
    </script>
  </body>
</html>

运行该示例,可以看到一个带有自定义样式的 Tab 选项卡效果已经实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js自定义Tab选项卡效果 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • Java中@Autowired和@Resource区别

    当我们开发Java应用程序时, Spring框架是一个受欢迎的选择。 该框架提供了许多功能,用于管理应用程序中的各种组件。其中,依赖注入(Dependency Injection)是Spring框架中非常常见的一种技术,大大简化了组件之间的交互。Spring框架提供了许多注释,方便我们在类中进行注入。 在Spring中,我们可以使用@Autowired和@R…

    other 2023年6月26日
    00
  • 在Linux分区或逻辑卷中创建文件系统的方法

    创建文件系统是在Linux系统中的常见操作。下面是在Linux分区或逻辑卷中创建文件系统的完整攻略。 步骤一:确认设备 在开始创建文件系统之前,我们需要确认要为哪个设备创建文件系统。可以通过执行以下命令来查看设备列表: sudo fdisk -l 该命令会显示所有磁盘分区和逻辑卷的信息。在确认要为哪个设备创建文件系统后,我们可以继续下一步。 步骤二:卸载设备…

    other 2023年6月27日
    00
  • FPGA editor 的使用之一 — Probe探针

    FPGA Editor 的使用之一 — Probe探针 FPGA Editor 是一款常用的 FPGA 设计工具,主要用于 FPGA 的底层设计开发。其中,Probe 是 FPGA Editor 中的一个重要功能,能够帮助开发者调试、分析 FPGA 设计中的各种问题。本文将简要介绍 FPGA Editor 中 Probe 探针的使用方法。 Probe 功…

    其他 2023年3月28日
    00
  • C语言数据结构系列篇二叉树的概念及满二叉树与完全二叉树

    C语言数据结构系列篇:二叉树的概念及满二叉树与完全二叉树 一、二叉树的概念 二叉树是一种特殊的树型结构,它的每个节点最多有两个子节点,称为左子节点和右子节点。二叉树可以为空树,也可以是非空树。二叉树的每个节点保存着某种数据,可以是整数、浮点数、字符串等。 下图是一个简单的二叉树示例: 1 / \ 2 3 / \ 4 5 其中,数字表示节点保存的数据。根节点是…

    other 2023年6月27日
    00
  • C++ 中快排的递归和非递归实现

    下面是关于C++中快排的递归和非递归实现的详细攻略。 快速排序 快速排序是一种基于分治的排序算法,其主要思想是将待排序序列划分为三部分,左边是小于等于基准值的部分,右边是大于等于基准值的部分,中间是分界点,基准值一般选取序列的第一个数或者随机选取一个数。然后对左右两个部分递归调用快排算法,直到每个小部分只有一个数或为空。 递归实现 递归实现快速排序的核心是 …

    other 2023年6月27日
    00
  • iis ftp 多用户隔离实现方法(根目录)

    iis ftp 多用户隔离实现方法(根目录) 一、前置条件 在此之前请确保您已经将FTP服务器角色安装好,并且配置了合适的FTP服务和FTP站点。 二、创建独立的FTP用户 在管理服务器上打开计算机管理器 选择“本地用户和计算机”-“用户”-“新用户” 设置FTP用户信息,勾选“用户不能更改密码”和“密码永不过期”,最后点击“创建”按钮。 三、设置FTP隔离…

    other 2023年6月27日
    00
  • Ubuntu14.04安装FTP服务器的实现步骤

    下面是Ubuntu14.04安装FTP服务器的实现步骤的完整攻略: 1. 安装vsftpd软件包 在终端中执行以下命令: sudo apt-get update sudo apt-get install vsftpd 2. 配置vsftpd服务器 编辑vsftpd的配置文件 /etc/vsftpd.conf。在终端中执行以下命令: sudo nano /et…

    other 2023年6月27日
    00
  • 正则表达式匹配IP的表达式(推荐)

    当匹配IP地址时,可以使用正则表达式来进行模式匹配。下面是一个推荐的正则表达式来匹配IP地址的表达式: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 这个正则表达式的含义如下: ^ 表示匹配字符串的开头。 (?:25[0…

    other 2023年7月30日
    00
合作推广
合作推广
分享本页
返回顶部