原生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日

相关文章

  • 通过 JS 判断页面是否有滚动条的实现方法

    判断页面是否有滚动条是 web 开发中常见的需求之一。可以通过 JS 判断页面是否有滚动条的实现方法有以下几种: 方法一:通过比较页面高度与窗口高度判断 在 HTML 的文档对象模型(DOM)中,document 对象的 scrollHeight 属性表示网页正文部分的高度。比较这个高度和窗口的高度,即可判断页面是否有滚动条。 if (document.bo…

    css 2023年6月10日
    00
  • CSS实现鼠标移入时图片的放大效果及缓慢过渡效果的示例代码

    实现鼠标移入时图片的放大效果及缓慢过渡效果需要用到CSS的transform和transition属性。以下是具体的步骤: 在HTML中,需要用标签嵌入图片。例如: <img src="example.jpg" alt="example image"> 为这个标签添加CSS样式。首先,需要设置img标签的w…

    css 2023年6月10日
    00
  • 学习如何书写整洁规范的HTML标记

    学习如何书写整洁规范的HTML标记,主要需要掌握以下几个方面: 1. 熟悉HTML标记的基本语法 HTML标记是由一系列的标签(tag)组成的,每个标签可以有相应的属性(attribute)和值(value)。标签的基本结构是: <tagname attribute="value">content</tagname&gt…

    css 2023年6月10日
    00
  • 深入理解CSS height属性设置元素的高度

    深入理解CSS height属性设置元素的高度 在CSS中,height属性用于设置元素的高度,可以应用于大部分的HTML元素。 基本语法 element { height: value; } 其中,value可以是具体的数值,也可以是百分比。 数值作为height属性值 数值可以作为height属性值,可以用像素(px)、点(pt)、厘米(cm)、英寸(i…

    css 2023年6月9日
    00
  • 浅谈CSS中浮动float带来的高度塌陷问题及4种解决方案

    浅谈CSS中浮动float带来的高度塌陷问题及4种解决方案 什么是高度塌陷问题? 当一个元素浮动之后,它会被移出正常的文档流,不再占据空间,但是它的父元素在没有触发BFC(块级格式化上下文)条件下的情况下,又不会自动容纳子元素的高度,导致父元素高度塌陷。 高度塌陷的例子 <div class="box"> <div cl…

    css 2023年6月10日
    00
  • Chrome 83稳定版发布 更新内容汇总介绍

    Chrome 83稳定版发布 更新内容汇总介绍 Chrome 83是谷歌最新发布的一个版本,带来了一些新的功能和优化。以下是具体的更新内容。 安全性增强 Chrome 83包含了多项安全性增强功能,其中最重要的是“SameSite”标识符的更新。这将有助于防止一些跨站攻击(CSRF)的发生。更具体地说,Chrome 83会对Cookie的SameSite值进…

    css 2023年6月10日
    00
  • 兼容浏览器的css网页细线表格设计

    兼容浏览器的CSS网页细线表格设计需要注意以下几个方面: 1. 优先使用CSS绘制表格 在设计细线表格时,尽可能地使用CSS来绘制表格而不是在HTML中使用<table>标签。CSS的绘制方式比HTML表格更灵活,而且更适合在不同设备中展示。样式可以用于表格中的所有元素,包括表头,表格主体和表格底部。 2. 设置表格边框样式 使用CSS样式设置表…

    css 2023年6月10日
    00
  • jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法

    要获取元素的CSS样式中的颜色值,可以使用jQuery的css()方法。但是在不同的浏览器下,返回的颜色值可能不同,这需要采用不同的解决办法。 解决方案一:使用rgb格式的颜色值 在所有浏览器中,可以使用rgb格式表示颜色值,因此我们可以使用jquery的css()方法获取元素的颜色值,然后将其转换为rgb格式。 示例代码: // 获取元素的背景颜色值 va…

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