js自定义Tab选项卡效果

yizhihongxing

来一份完整的 “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日

相关文章

  • PHP Global定义全局变量使用说明

    PHP Global定义全局变量使用说明 在PHP中,全局变量是在脚本的任何地方都可以访问的变量。使用全局变量可以在不同的函数和类中共享数据。在本攻略中,我们将详细讲解如何定义和使用全局变量。 定义全局变量 要定义一个全局变量,我们需要使用global关键字。这将告诉PHP解释器该变量是全局的,可以在脚本的任何地方访问。 下面是定义全局变量的语法: glob…

    other 2023年7月28日
    00
  • mysql 5.7.21 winx64绿色版安装配置方法图文教程

    MySQL 5.7.21 Winx64绿色版安装配置方法图文教程 前言 MySQL是业界领先的开源关系型数据库管理系统,它支持多种操作系统,包括Windows平台。本文将介绍MySQL 5.7.21 Winx64绿色版的安装和配置过程。 步骤一:下载MySQL 首先需要下载MySQL。可以从MySQL官网或者国内镜像网站下载MySQL安装包。这里以MySQL…

    other 2023年6月27日
    00
  • sql函数translate与replace的区别

    SQL函数TRANSLATE与REPLACE的区别 在SQL中,TRANSLATE和REPLACE是两个常用的字符串函数,它们都可以用于替换字符串中的字符。本文将提供一个完整的攻略,介绍TRANSLATE和REPLACE的区别,并提供两个示例说明。 TRANSLATE函数 TRANSLATE函数用于将字符串中的某些字符替换为其他字符。可以按照以下格式使用TR…

    other 2023年5月8日
    00
  • java 获取已知文件扩展名的代码

    获取已知文件扩展名的代码是一个常见的需求,这里将为大家介绍在Java中如何实现这个功能。 方法一:使用Java自带的API 在Java中,通过File类的getName()方法可以获取文件名,通过String类的lastIndexOf()方法和substring()方法即可获取文件扩展名。以下是示例代码: File file = new File(&quot…

    other 2023年6月26日
    00
  • 详解Go语言中单链表的使用

    详解Go语言中单链表的使用 什么是单链表 单链表(Singly Linked List)是一种常见的数据结构之一,它由一串节点组成,每个节点包含两个部分:数据部分和指向下一个节点的指针部分。 单链表的头部节点称为头节点,尾部节点称为尾节点。尾节点的指针部分指向NULL。 Go语言中单链表的实现 在Go语言中实现单链表,我们可以定义一个结构体表示链表节点,代码…

    other 2023年6月27日
    00
  • 基于Comparator对象集合实现多个条件按照优先级的比较

    基于Comparator对象集合实现多个条件按照优先级的比较 在Java中,我们可以使用Comparator对象来实现多个条件按照优先级进行比较。Comparator接口是一个函数式接口,它定义了一个compare方法,用于比较两个对象的顺序。我们可以自定义一个Comparator对象,并使用它来排序一个对象集合。 下面是一个完整的攻略,用于实现多个条件按照…

    other 2023年6月28日
    00
  • 解决双ip网络打印机地址冲突的方法

    解决双IP网络打印机地址冲突的方法 当在网络中使用双IP网络打印机时,可能会遇到IP地址冲突的问题。这种冲突会导致网络打印机无法正常工作,因此需要采取一些方法来解决这个问题。以下是解决双IP网络打印机地址冲突的完整攻略: 步骤一:确认IP地址冲突 首先,需要确认是否存在IP地址冲突。当两台设备拥有相同的IP地址时,就会发生冲突。可以通过以下步骤来确认冲突: …

    other 2023年7月30日
    00
  • Linux服务器配置—搭建NFS服务器步骤

    Linux服务器配置—搭建NFS服务器步骤 什么是NFS服务器? NFS(Network File System)是一种基于网络的分布式文件系统协议,它允许不同的主机通过网络分享文件和目录。NFS提供了文件共享与远程文件访问的功能,可用于分布式系统间的数据共享,以便实现远程文件的读、写、更新等操作。 安装和配置NFS服务器 以下是搭建NFS服务器的步骤: 安…

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