JS实现选项卡插件的两种写法(jQuery和class)


Posted in jQuery onDecember 30, 2020

本文实例为大家分享了JS实现选项卡插件的2种写法,供大家参考,具体内容如下

实现插件的几个注意点:

(1)定义一个固定的html结构,比如选项卡的标题的标签为为li,每个选项卡的内容的标签为div等等;
(2)选中时的样式提前确定;
(3)最好先用简单的JS实现选项卡的功能,再改为插件的模式。

html结构如下:

<style>
 * {
 margin: 0;
 padding: 0;
 }

 ul {
 list-style: none;
 }

 #tabBox {
 box-sizing: border-box;
 margin: 20px auto;
 width: 500px;
 }

 .navBox {
 display: flex;
 position: relative;
 top: 1px;
 }

 .navBox li {
 box-sizing: border-box;
 margin-right: 10px;
 padding: 0 10px;
 line-height: 35px;
 border: 1px solid #999;
 cursor: pointer;
 }

 .navBox li.active {
 border-bottom-color: #FFF;
 }

 #tabBox>div {
 display: none;
 box-sizing: border-box;
 padding: 10px;
 height: 150px;
 border: 1px solid #999;
 }

 #tabBox>div.active {
 display: block;
 }
 </style>
 
 <div id="tabBox">
 <ul class="navBox">
 <li class="active">编程</li>
 <li>读书</li>
 <li>运动</li>
 </ul>
 <div class="active">编程使我快乐</div>
 <div>读书使我幸福</div>
 <div>运动使我健康</div>
</div>

先用JS实现选项卡的功能:

let len = liList.length;
 for(let i = 0; i < len; i++) {
  liList[i].index = i;
  liList[i].onclick = function() {
  for(let j = 0; j < len; j++) {
   if(j === this.index) {
   liList[j].className = 'active';
   contentList[j].className = 'active';
   }
   else{
   liList[j].className = '';
   contentList[j].className = '';
   }
  }
 };
}

实现插件的第一种方法:jQuery

利用$.fn.extend方法,在jQuery上扩展一个选项卡功能的方法:

(function($){
 function clickLi() {
 let $this = this,
  $navBox = $this.find('.navBox'),
  $liList = $navBox.find('li'),
  $contentList = $this.find('div');

 $liList.click(function(){
  let $this = $(this),
  index = $this.index();
  $this.addClass('active').siblings().removeClass('active');
  $contentList.eq(index).addClass('active').siblings().removeClass('active');
 });
 }

 $.fn.extend({
 tabClick: clickLi
 });
})(jQuery);

使用方法:

let $tabBox = $('#tabBox');
$tabBox.tabClick();

实现插件的第二种方法:class

利用ES6中的class类,创建一个选项卡类Tab,并添加属性和方法,并且可以多参数传递实现选项卡:

(function(){
 class Tab {
 constructor(selector, options) {
  // 处理第一个参数
  if(!selector)
  throw new ReferenceError('The first selector parameter must be passed~~');
  if(typeof selector === 'string')
  this.container = document.querySelector(selector);
  else if(selector.nodeType)
  this.container = selector;

  this.initialParams(options);

  this.navBox = this.container.querySelector('.navBox'),
  this.liList = this.navBox.querySelectorAll('li'),
  this.contentList = this.container.querySelectorAll('div'),
  this.count = this.liList.length;
  
  this.change();
  this.handleLi();
 }

 // 初始化参数
 initialParams(options) {
  let _default = {
  showIndex: 0,
  triggerEvent: 'click'
  };

  for(let key in options) {
  if (!options.hasOwnProperty(key)) break;
  _default[key] = options[key];
  }

  // 把信息挂载到实例上
  for (let key in _default) {
 if (!_default.hasOwnProperty(key)) break;
 this[key] = _default[key];
 }
 }

 // 切换标题
 change() {
  [].forEach.call(this.liList, (item, index) => {
  if(index === this.showIndex) {
   this.liList[index].className = 'active';
   this.contentList[index].className = 'active';
   return;
  }
  this.liList[index].className = '';
  this.contentList[index].className = '';
  });
 }

 // 绑定标题对应的事件
 handleLi() {
  [].forEach.call(this.liList, (item, index) => {
  item.addEventListener(this.triggerEvent, () => {
   this.showIndex = index;
   this.change();
  });
  });
 }
 }
 window.Tab = Tab;
})();

使用方法:

new Tab('#tabBox', {
 showIndex: 2,
 triggerEvent: 'mouseenter'
});

第二种方法是现在常用的方法,因为它可以传递很多参数。可以根据需求,设置默认要传递的参数,将这个选项卡插件做的更完善。

如果大家还想深入学习,可以点击两个精彩的专题:javascript选项卡操作方法汇总 jquery选项卡操作方法汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
JQuery实现图片轮播效果
May 08 jQuery
jQuery实现可编辑表格并生成json结果(实例代码)
Jul 19 jQuery
JQuery 获取多个select标签option的text内容(实例)
Sep 07 jQuery
jquery自定义显示消息数量
Dec 19 jQuery
jQuery UI实现动画效果代码分享
Aug 19 jQuery
jQuery pjax 应用简单示例
Sep 20 jQuery
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
Jun 18 jQuery
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
jQuery实现增删改查
Dec 22 jQuery
jQuery实现全选按钮
Jan 01 jQuery
html中两种获取标签内的值的方法
Jun 16 jQuery
jQuery实现简单轮播图效果
Dec 27 #jQuery
原生jQuery实现只显示年份下拉框
Dec 24 #jQuery
jquery实现鼠标悬浮弹出气泡提示框
Dec 23 #jQuery
jquery实现图片放大镜效果
Dec 23 #jQuery
jQuery实现增删改查
Dec 22 #jQuery
jQuery实现本地存储
Dec 22 #jQuery
jQuery实现电梯导航模块
Dec 22 #jQuery
You might like
解析php session_set_save_handler 函数的用法(mysql)
2013/06/29 PHP
PHP curl 抓取AJAX异步内容示例
2014/09/09 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
Ctrl+Enter提交内容信息
2006/06/26 Javascript
几行代码轻松搞定jquery实现flash8类似的连接效果
2007/05/03 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
Extjs Gird 支持中文拼音排序实现代码
2013/04/15 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
react-router实现跳转传值的方法示例
2017/05/27 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
分分钟学会vue中vuex的应用(入门教程)
2017/09/14 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
解决vue项目router切换太慢问题
2020/07/19 Javascript
Python深入学习之特殊方法与多范式
2014/08/31 Python
以一段代码为实例快速入门Python2.7
2015/03/31 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
2015/04/17 Python
浅谈Python中的数据类型
2015/05/05 Python
python如何在列表、字典中筛选数据
2018/03/19 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
jupyter notebook tensorflow打印device信息实例
2020/04/20 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
银行会计财务工作个人的自我评价
2013/10/29 职场文书
学生会竞聘书范文
2014/03/31 职场文书
骨干教师考核方案
2014/05/09 职场文书
师范生求职自荐信
2014/06/14 职场文书
建筑管理专业求职信
2014/07/28 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
实习生辞职信范文
2015/03/02 职场文书
使用feign服务调用添加Header参数
2021/06/23 Java/Android