原生JS封装vue Tab切换效果

让我详细讲解一下“原生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日

相关文章

  • 自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结

    自适应布局是指网页在不同的设备上(如PC、手机、平板等)都能够有良好的展示效果,其中最重要的一步就是设置meta标签中viewport属性。 viewport属性用于控制浏览器的显示区域,以及渲染出来的页面在其中的放大或缩小比例。下面分别讲解viewport属性中各个参数的含义: width:指定viewport的宽度,可以是一个整数或者字符串“device…

    css 2023年6月10日
    00
  • css设置矢量图字体图标的方法(图解)

    下面是详细讲解 “CSS设置矢量图字体图标的方法(图解)” 的完整攻略。 什么是矢量图字体图标? 矢量图字体图标是一种使用 CSS 的方式来显示图标的方法。它使用字体文件,其中包含了一组图标,这些图标都是使用矢量图形进行绘制的。当需要显示某个图标时,我们可以通过设置 CSS 样式,使用相应的字体图标类名来实现在页面上显示该图标的目的。 如何设置矢量图字体图标…

    css 2023年6月9日
    00
  • 手机屏幕尺寸测试——手机的实际显示页面的宽度

    以下是“手机屏幕尺寸测试——手机的实际显示页面的宽度”的完整攻略: 什么是手机屏幕尺寸测试? 手机屏幕尺寸测试指的是通过特定的工具或方法,测试手机显示页面的实际宽度。因为不同的手机尺寸和分辨率不同,页面在不同的手机上显示效果也不同,测试手机屏幕尺寸可以帮助开发者或设计师更精确地设计和调整页面。 如何进行手机屏幕尺寸测试? 下面介绍两种方法,供大家参考: 第一…

    css 2023年6月10日
    00
  • 浅谈CSS中的 object-fit 与 object-position的使用

    浅谈CSS中的 object-fit 与 object-position 的使用 什么是 object-fit 和 object-position? object-fit 属性用于控制如何调整一个元素所显示的图片或视频的尺寸比例。默认情况下,一个图片或视频会按照原始的尺寸比例在容器中缩放以适应容器的大小,但在某些情况下,我们需要按照特定的方式裁剪、缩放图片或…

    css 2023年6月10日
    00
  • html5的新增的标签和废除的标签简要概述

    HTML5(Hyper Text Markup Language 5)是HTML(Hyper Text Markup Language)的第五个版本,它对之前版本的语言规范做了很多改进和增强。在HTML5中,新增了很多标签来帮助Web开发者更好地构建现代化、丰富多彩的网站。同时,也废除了一些不太常用、有性能问题或者安全隐患的标签。 新增标签 \<can…

    css 2023年6月10日
    00
  • Bootstrap学习笔记 轮播(Carousel)插件

    下面是“Bootstrap学习笔记 轮播(Carousel)插件”的完整攻略: 轮播插件简介 什么是轮播插件 轮播插件是一种常见的网页展示图片或文字内容的方式。它主要通过一张或多张图片/文字的循环播放,为用户提供一种流畅美观的浏览体验。在Bootstrap中,轮播插件是非常常见的组件,被广泛应用于各种网站的首页、产品展示页面等。 轮播插件的基本用法 轮播插件…

    css 2023年6月11日
    00
  • 清除浮动的几种方法(推荐)

    下面是清除浮动的几种方法,以及推荐使用的方法的详细攻略。 什么是浮动? 浮动是CSS中的一种布局方式,它可以使元素往左或者往右“浮动”,然后其他元素围绕它排列。这种布局方式常常被用来实现多栏布局或者图片浮动等效果。 浮动带来的问题 虽然浮动在布局中具有很大的作用,但它也同样存在一些问题。最常见的问题是父元素无法自适应子元素的高度,以及出现元素重叠等情况。 清…

    css 2023年6月10日
    00
  • 使用Pinyin4j进行拼音分词的方法

    使用Pinyin4j进行拼音分词的方法可以分为以下步骤: 第一步:引入Pinyin4j依赖 在Maven项目中,需要在项目的pom.xml中添加以下依赖: <dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifact…

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