原生JS封装vue Tab切换效果

yizhihongxing

让我详细讲解一下“原生JS封装vue Tab切换效果”的攻略。

步骤一:HTML结构

首先,我们需要在HTML中定义tab的页面结构。通常,Tab菜单会使用<ul><li>标签,而每个Tab页的内容则使用<div>标签。示例如下:

<div class="tab">
  <ul class="tab-menu">
    <li class="active">Tab 1</li>
    <li>Tab 2</li>
    <li>Tab 3</li>
  </ul>
  <div class="tab-content">
    <div class="tab-pane active">Tab 1内容</div>
    <div class="tab-pane">Tab 2内容</div>
    <div class="tab-pane">Tab 3内容</div>
  </div>
</div>

其中,.tab-menu 是 Tab 菜单的容器,.tab-content 是 Tab 内容的容器,.tab-pane 是每一个 Tab 页的内容,.active 表示当前页面是激活状态。

步骤二:CSS样式

为了让 Tab 能够在页面中美观显示,我们需要对其进行CSS样式的设置。示例如下:

.tab {
  display: inline-block;
  width: 100%;
}

.tab-menu {
  list-style: none;
  padding: 0;
}

.tab-menu li {
  display: inline-block;
  padding: 10px;
  cursor: pointer;
}

.tab-menu li.active {
  background-color: #eee;
}

.tab-content {
  clear:both;
}

.tab-pane {
  display: none;
}

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

其中,.tab 是 Tab 的容器,.tab-menu 是tabs的菜单,使用了 list-style:none; 去除默认列表的样式。.tab-menu li 设置了Tab菜单项的样式,使用了 cursor:pointer; 使鼠标移上去时改变指针位置。.tab-content 是直接包含Tab页的容器,.tab-pane 是每一个 Tab 页的容器,使用了display:none; 隐藏它们。最后.tab-pane.active 将当前被激活的面板显示出来。

步骤三:原生JS实现Tab切换效果

最重要的一步是实现JS。我们通过封装Tab组件的方式将JS代码编写在单独的文件中。示例如下:

class Tabs {
  constructor(el) {
    this.el = el;
    this.init();
  }

  init() {
    this.menuItems = Array.from(this.el.querySelectorAll('.tab-menu li'));
    this.contentItems = Array.from(this.el.querySelectorAll('.tab-pane'));

    this.bindEvents();
  }

  bindEvents() {
    this.menuItems.forEach((item, i) => {
      item.addEventListener('click', () => {
        this.activateTab(i);
      });
    });
  }

  activateTab(index) {
    this.menuItems.forEach(item => item.classList.remove('active'));
    this.contentItems.forEach(item => item.classList.remove('active'));

    const menuItem = this.menuItems[index];
    const contentItem = this.contentItems[index];

    menuItem.classList.add('active');
    contentItem.classList.add('active');
  }
}

在这段代码中,我们定义了一个Tabs类。它包含一个构造器,用于初始化Tab组件,并且初始化函数用于找到所有菜单项和内容项。同时定义了 activateTab 函数用于激活指定的 tab。

bindEvents 函数中,我们遍历所有菜单项,并给每个菜单项添加了一个点击事件监听器,当这个菜单项被点击时,我们调用 activateTab 方法,将其所对应的tab激活。

接下来,我们需要在页面中使用 new Tabs() 来初始化Tab。示例如下:

const tabEl = document.querySelector('.tab');
new Tabs(tabEl);

在这个例子中,我们首先找到所有class为tab的元素,然后通过 new Tabs() 来初始化Tabs组件。

示例说明一

在这个例子中,我们将上述代码 CSS 及 HTML 整合在一起,创建了一个Tab切换效果。示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Tab示例1</title>
  <style>
    .tab {
      display: inline-block;
      width: 100%;
    }

    .tab-menu {
      list-style: none;
      padding: 0;
    }

    .tab-menu li {
      display: inline-block;
      padding: 10px;
      cursor: pointer;
    }

    .tab-menu li.active {
      background-color: #eee;
    }

    .tab-content {
      clear:both;
    }

    .tab-pane {
      display: none;
    }

    .tab-pane.active {
      display: block;
    }
  </style>
</head>
<body>
  <div class="tab">
    <ul class="tab-menu">
      <li class="active">Tab 1</li>
      <li>Tab 2</li>
      <li>Tab 3</li>
    </ul>
    <div class="tab-content">
      <div class="tab-pane active">Tab 1内容</div>
      <div class="tab-pane">Tab 2内容</div>
      <div class="tab-pane">Tab 3内容</div>
    </div>
  </div>

  <script>
    class Tabs {
      constructor(el) {
        this.el = el;
        this.init();
      }

      init() {
        this.menuItems = Array.from(this.el.querySelectorAll('.tab-menu li'));
        this.contentItems = Array.from(this.el.querySelectorAll('.tab-pane'));

        this.bindEvents();
      }

      bindEvents() {
        this.menuItems.forEach((item, i) => {
          item.addEventListener('click', () => {
            this.activateTab(i);
          });
        });
      }

      activateTab(index) {
        this.menuItems.forEach(item => item.classList.remove('active'));
        this.contentItems.forEach(item => item.classList.remove('active'));

        const menuItem = this.menuItems[index];
        const contentItem = this.contentItems[index];

        menuItem.classList.add('active');
        contentItem.classList.add('active');
      }
    }

    const tabEl = document.querySelector('.tab');
    new Tabs(tabEl);
  </script>
</body>
</html>

示例说明二

在这个例子中,我们扩展了上述的示例,使用Vue.js来实现Tab切换。示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Tab示例2</title>
  <style>
    .tab {
      display: inline-block;
      width: 100%;
    }

    .tab-menu {
      list-style: none;
      padding: 0;
    }

    .tab-menu li {
      display: inline-block;
      padding: 10px;
      cursor: pointer;
    }

    .tab-menu li.active {
      background-color: #eee;
    }

    .tab-content {
      clear:both;
    }

    .tab-pane {
      display: none;
    }

    .tab-pane.active {
      display: block;
    }
  </style>
</head>
<body>
  <div id="app">
    <div class="tab">
      <ul class="tab-menu">
        <li v-for="(tab, index) in tabs"
            @click="activeTab(index)"
            :class="{ active: currentTabIndex === index }">{{ tab.title }}</li>
      </ul>
      <div class="tab-content">
        <div class="tab-pane" v-for="(tab, index) in tabs" :class="{ active: currentTabIndex === index }">{{ tab.content }}</div>
      </div>
    </div>
  </div>

  <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  <script>
    const app = new Vue({
      el: '#app',
      data: {
        tabs: [
          {
            title: 'Tab 1',
            content: '这里是Tab 1的内容'
          },
          {
            title: 'Tab 2',
            content: '这里是Tab 2的内容'
          },
          {
            title: 'Tab 3',
            content: '这里是Tab 3的内容'
          }
        ],
        currentTabIndex: 0
      },
      methods: {
        activeTab(index) {
          this.currentTabIndex = index;
        }
      }
    });
  </script>
</body>
</html>

在这个例子中,我们使用了Vue.js 通过绑定 v-forv-bind 来渲染Tab菜单项和Tab页面,v-bindv-on 来绑定激活Tab的事件监听和数据。这种方式和上述纯JS实现Tab的方式几乎相同,但它提供了更好的可维护性和可重用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS封装vue Tab切换效果 - Python技术站

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

相关文章

  • CSS实现输入框的周围高亮效果让边框发亮

    下面是CSS实现输入框的周围高亮效果让边框发亮的完整攻略: 1. box-shadow属性 可以使用CSS的box-shadow属性来实现输入框边框高亮。box-shadow属性可以在元素周围添加一个或多个阴影。 例如,下面的代码可以让输入框的边框在获取焦点时出现一个浅蓝色阴影: input:focus { box-shadow: 0 0 4px #66bf…

    css 2023年6月10日
    00
  • Dreamweaver网页怎么制作CSS叠层样式?

    Dreamweaver是一款常用的网页制作工具,可以使用它来制作CSS叠层样式。以下是制作CSS叠层样式的完整攻略: 基本步骤 创建HTML文件:在Dreamweaver中创建一个新的HTML文件,例如: <!DOCTYPE html> <html> <head> <title>网页标题</title&g…

    css 2023年5月18日
    00
  • 一个属性border-collapse解决Table的边框问题

    当使用HTML中的table标签创建表格时,常常会遇到边框重叠的问题。一个属性border-collapse可以解决这个问题。 什么是border-collapse border-collapse是CSS中的一个属性,用于设置表格元素边框合并的方式。 默认情况下,HTML中的表格元素的边框会分离,即每个单元格都有自己的边框。如果两个单元格的边框相邻,它们会产…

    css 2023年6月10日
    00
  • Easyui 去除jquery-easui tab页div自带滚动条的方法

    首先,我们需要了解,在 Easyui 中,Tab 组件的内容是通过一个名为 tabs-panels 的 div 容器来承载的,而该容器拥有自己的 CSS 样式,其中包括了默认的滚动条样式。 为了去除这样的默认样式,在 Easyui 中,我们可以通过以下两种方法实现: 方法一:覆盖样式 我们可以在 CSS 中设置 overflow: hidden,同时将 pa…

    css 2023年6月10日
    00
  • js实现消息滚动效果

    实现消息滚动效果有很多种方式,这里提供一种基于JS实现的方法: 1. 初步实现 首先,在需要实现消息滚动效果的HTML页面中,建立一个 <div> 容器,用来包含滚动的消息。然后在CSS样式中设置容器的高度和宽度等基本属性。 在JS中,获取该容器并且将其内容进行复制一次,从而可以实现消息的不停循环滚动。使用setInterval函数实现定时不断改…

    css 2023年6月10日
    00
  • HTML5 canvas 基本语法

    下面是关于HTML5 canvas基本语法的攻略,希望对您有所帮助。 HTML5 canvas简介 HTML5中的canvas可以让我们通过JavaScript在网页上绘制二维图形。我们可以在canvas中画线、圆形、矩形、三角形等基本形状。此外,我们也可以在canvas中添加图片和文字,实现丰富的视觉效果。 HTML5 canvas基本语法 要使用canv…

    css 2023年6月10日
    00
  • Bootstrap导航条的使用和理解3

    Bootstrap是一种流行的前端框架,可用于开发响应式网页。其中,导航条是Bootstrap的常用组件之一。本文将详细讲解Bootstrap导航条的使用和理解,帮助开发者更好地掌握Bootstrap的技术。 导航条的基本布局 Bootstrap的导航条由多个HTML元素组成,包括一个包含导航标签的<nav>元素、一个<ul>元素,以…

    css 2023年6月10日
    00
  • 如何试着在你的css增加粘稠效果

    在 CSS 中增加粘稠效果是一种常见的技巧,可以用于实现各种效果,如悬停效果、下拉菜单等。以下是关于如何在 CSS 中增加粘稠效果的完整攻略。 步骤一:创建 HTML 结构 首先,需要在 HTML 文件中创建一个容器元素,用于包含需要增加粘稠效果的元素。以下是一个示例: <div class="sticky"> <p&g…

    css 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部