JS基于面向对象实现的选项卡效果示例

首先让我们来讲解一下“JS基于面向对象实现的选项卡效果”的概念。

选项卡效果是前端开发中常用的用来实现一些简单页面交互的方法,通常由若干个选项标签和对应的内容区块组成。用户点击某个选项标签时,对应的内容区块就会被展示出来,其他内容区块则隐藏起来。

在实现选项卡效果时,我们可以使用面向对象编程的思想来设计和编写代码,使得实现过程更加规范和易于维护。具体地,我们可以把每一个选项卡看作一个对象,它包括选项标签和对应的内容区块,可以定义一些方法和属性来控制它们之间的交互。

以下是一个简单的示例,来介绍如何使用面向对象实现选项卡效果。

HTML代码:

<div id="tabBox">
  <ul class="tabs">
    <li class="active"><a href="#tab1">选项1</a></li>
    <li><a href="#tab2">选项2</a></li>
    <li><a href="#tab3">选项3</a></li>
  </ul>
  <div class="tabContents">
    <div id="tab1">选项1的内容区域</div>
    <div id="tab2">选项2的内容区域</div>
    <div id="tab3">选项3的内容区域</div>
  </div>
</div>

CSS代码:

.tabs li {
  display: inline-block;
  margin-right: 10px;
}

.tabs li.active a {
  font-weight: bold;
}

.tabContents div {
  display: none;
}

.tabContents div.active {
  display: block;
}

JS代码:

// 定义选项卡对象
function Tab(options) {
  this.tabs = options.tabs;
  this.tabContents = options.tabContents;
  this.activeIndex = options.activeIndex || 0;
  this.init();
}

Tab.prototype.init = function() {
  var self = this;
  // 给选项标签绑定点击事件
  this.tabs.addEventListener('click', function(e) {
    var target = e.target;
    if (target.nodeName === 'A') {
      e.preventDefault();
      var index = Array.prototype.indexOf.call(self.tabs.children, target.parentNode);
      self.activate(index);
    }
  });
  // 初始化选项卡状态
  this.activate(this.activeIndex);
};

Tab.prototype.activate = function(index) {
  // 更新选项卡状态
  Array.prototype.forEach.call(this.tabs.children, function(tab, i) {
    if (i === index) {
      tab.classList.add('active');
    } else {
      tab.classList.remove('active');
    }
  });
  Array.prototype.forEach.call(this.tabContents.children, function(content, i) {
    if (i === index) {
      content.classList.add('active');
    } else {
      content.classList.remove('active');
    }
  });
};

// 初始化选项卡对象
var tab = new Tab({
  tabs: document.querySelector('.tabs'),
  tabContents: document.querySelector('.tabContents'),
  activeIndex: 1
});

我们定义了一个Tab对象,它接受一个包含选项标签和对应内容区块的父元素,以及一个默认激活的选项卡索引。在初始化时,我们给选项标签绑定了点击事件,当用户点击某个选项标签时,会调用activate方法来更新选项卡状态。

在每次更新选项卡状态时,我们都会遍历选项标签和内容区块,根据索引来判断哪个应该激活,哪个应该隐藏。同时,我们给选项标签和内容区块分别添加了active类,可以用CSS来控制激活和隐藏的样式。

另外,还可以在Tab对象中扩展一些其他的方法和属性,来实现更为灵活的选项卡效果,比如动画效果、延迟加载等功能。

下面再给出一个具体的示例,来说明如何使用Tab对象来实现无限级联选项卡效果。

HTML代码:

<div id="tabBox">
  <ul class="tabs">
    <li class="active"><a href="#tab1">选项1</a></li>
    <li><a href="#tab2">选项2</a></li>
    <li><a href="#tab3">选项3</a></li>
  </ul>
  <div class="tabContents">
    <div id="tab1">
      <ul class="tabs">
        <li class="active"><a href="#tab1-1">子选项1</a></li>
        <li><a href="#tab1-2">子选项2</a></li>
        <li><a href="#tab1-3">子选项3</a></li>
      </ul>
      <div class="tabContents">
        <div id="tab1-1">子选项1的内容区域</div>
        <div id="tab1-2">子选项2的内容区域</div>
        <div id="tab1-3">子选项3的内容区域</div>
      </div>
    </div>
    <div id="tab2">
      <ul class="tabs">
        <li class="active"><a href="#tab2-1">子选项1</a></li>
        <li><a href="#tab2-2">子选项2</a></li>
        <li><a href="#tab2-3">子选项3</a></li>
      </ul>
      <div class="tabContents">
        <div id="tab2-1">子选项1的内容区域</div>
        <div id="tab2-2">子选项2的内容区域</div>
        <div id="tab2-3">子选项3的内容区域</div>
      </div>
    </div>
    <div id="tab3">
      <ul class="tabs">
        <li class="active"><a href="#tab3-1">子选项1</a></li>
        <li><a href="#tab3-2">子选项2</a></li>
        <li><a href="#tab3-3">子选项3</a></li>
      </ul>
      <div class="tabContents">
        <div id="tab3-1">子选项1的内容区域</div>
        <div id="tab3-2">子选项2的内容区域</div>
        <div id="tab3-3">子选项3的内容区域</div>
      </div>
    </div>
  </div>
</div>

CSS代码:

.tabs li {
  display: inline-block;
  margin-right: 10px;
}

.tabs li.active a {
  font-weight: bold;
}

.tabContents div {
  display: none;
}

.tabContents div.active {
  display: block;
}

JS代码:

// 定义选项卡对象
function Tab(options) {
  this.tabs = options.tabs;
  this.tabContents = options.tabContents;
  this.activeIndex = options.activeIndex || 0;
  this.init();
}

Tab.prototype.init = function() {
  var self = this;
  // 给选项标签绑定点击事件
  this.tabs.addEventListener('click', function(e) {
    var target = e.target;
    if (target.nodeName === 'A') {
      e.preventDefault();
      var path = [];
      var parentTab = target.parentNode;
      while (parentTab !== self.tabs) {
        var index = Array.prototype.indexOf.call(parentTab.parentNode.children, parentTab);
        path.unshift(index);
        parentTab = parentTab.parentNode.parentNode.previousElementSibling;
      }
      self.activate(path);
    }
  });
  // 初始化选项卡状态
  this.activate(this.activeIndex);
};

Tab.prototype.activate = function(path) {
  var tabs = this.tabs;
  var tabContents = this.tabContents;
  // 遍历路径,逐级更新选项卡状态
  path.forEach(function(index, i) {
    tabs = tabs.children[index].lastElementChild;
    tabContents = tabContents.children[index].lastElementChild;
    Array.prototype.forEach.call(tabs.children, function(tab, j) {
      if (j === (i === path.length - 1 ? index : 0)) {
        tab.classList.add('active');
      } else {
        tab.classList.remove('active');
      }
    });
    Array.prototype.forEach.call(tabContents.children, function(content, j) {
      if (j === (i === path.length - 1 ? index : 0)) {
        content.classList.add('active');
      } else {
        content.classList.remove('active');
      }
    });
  });
};

// 初始化选项卡对象
var tab = new Tab({
  tabs: document.querySelector('.tabs'),
  tabContents: document.querySelector('.tabContents'),
  activeIndex: [0, 0]
});

在这个示例中,我们给每个选项卡添加了子选项卡,当用户点击子选项卡时,会通过路径来更新选项卡状态。

init方法中,我们使用了一个while循环来获取当前点击的选项卡在路径中的位置。具体来说,我们从当前选项卡的父元素parentTab开始,向上遍历它的父元素,直到遍历到最顶层的选项卡为止。在遍历的同时,我们记录每个父元素的位置,即它在其父元素中的索引,并把它们存储在path数组中。

activate方法中,我们遍历path数组,逐个更新当前选项卡的子选项卡状态。这里需要注意的是,因为每个选项卡有可能包含多个子选项卡,所以在更新状态时需要根据路径中的索引来判断哪个子选项卡应该激活,哪个应该隐藏。

总的来说,使用面向对象编程的思想来实现选项卡效果,能够让代码更加模块化和可维护,便于扩展和修改。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS基于面向对象实现的选项卡效果示例 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQuery :last-child选择器

    以下是关于jQuery中的:last-child选择器的完整攻略: 什么是jQuery中的:last-child选择器? jQuery中的:last-child选择器是一种用于选择某个元素的最后一个子元素的语法。使用这个选择器可以轻松选择某个元素的最后一个子元素对其操作。 如何使用jQuery中的:last-child选择器? 可以使用以下代码来选择某个元素…

    jquery 2023年5月12日
    00
  • jquery动态添加带有样式的HTML标签元素方法

    动态添加带有样式的HTML标签元素是网页开发中非常常见的需求,而jQuery框架可以帮助我们轻松实现这一功能。 本文将从以下几个方面来详细讲解“jquery动态添加带有样式的HTML标签元素方法”的完整攻略: 使用jQuery的append()方法添加HTML标签元素及样式 使用jQuery的css()方法添加样式 示例说明 使用jQuery的append(…

    jquery 2023年5月27日
    00
  • jQuery实现的网页右下角tab样式在线客服效果代码

    jQuery实现的网页右下角tab样式在线客服效果,可以让网站提供在线客服支持,方便用户与客服人员的交流。以下是实现步骤及代码示例: 1. 创建HTML结构 在页面中需要创建以下HTML结构: <div class="chat-wrapper"> <div class="chat-header"&gt…

    jquery 2023年5月28日
    00
  • jQWidgets jqxGauge RadialGauge valueChanged事件

    以下是关于“jQWidgets jqxGauge RadialGauge valueChanged事件”的完整攻略,包含两个示例说明: 简介 jqxGauge 控件 RadialGauge 类的 valueChanged 事件在仪表盘的值发生变化时触发。事件的语法如下: $("#gauge").on(‘valueChanged’, fun…

    jquery 2023年5月10日
    00
  • 如何在jQuery中使用Explode效果

    使用 Explode 效果可以实现在 jQuery 中实现元素被分解成许多小部分。下面是详细的攻略步骤: 步骤1 – 导入jQuery库文件 你需要先在 HTML 页面中导入 jQuery 库文件,例子中使用的是 Google Hosted Libraries,你可以根据自己需求的版本和位置选择自己的位置。 将以下代码添加到你的 HTML 页面中,以便开始使…

    jquery 2023年5月12日
    00
  • Web开发者必备的12款超赞jQuery插件

    Web开发者必备的12款超赞jQuery插件攻略 在Web开发过程中,经常会使用到jQuery插件来增强网页的交互和效果,提高用户体验。本文将介绍Web开发者必备的12款超赞jQuery插件,并提供使用示例。 1. jQuery Validation jQuery Validation是一款轻量级的表单验证插件,支持多种表单验证规则,包括必填、email、数…

    jquery 2023年5月28日
    00
  • jQWidgets jqxComboBox checkItem()方法

    jQWidgets 的 jqxComboBox 组件提供了 checkItem() 方法,用于选中下拉列表中指定值的选项。本文将详细介绍 checkItem() 方法的使用方法,包括概述、示例以及注意事项。 checkItem() 方法概述 checkItem() 方法用于选中下拉列表中指定值的选项。该方法接受一个字符串参数,表示选中的选项的值。 check…

    jquery 2023年5月11日
    00
  • .Net学习笔记之Layui多图片上传功能

    以下是“.Net学习笔记之Layui多图片上传功能”的完整攻略: 简介 在现代网站开发中,图片上传功能是一个很基础且常见的需求,而Layui框架作为一款前端开发框架,提供了便捷的多图片上传插件。本篇笔记介绍如何使用Layui的多图片上传插件完成多图片上传功能,并配合C#编写后台代码进行文件保存和数据传输。 准备 本地安装Visual Studio集成开发环境…

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