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实现字体颜色渐变效果的方法
Mar 29 jQuery
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 jQuery
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
基于jQuery选择器之表单对象属性筛选选择器的实例
Sep 19 jQuery
基于jQuery实现Ajax验证用户名是否可用实例
Mar 25 jQuery
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
Apr 10 jQuery
详解jQuery设置内容和属性
Apr 11 jQuery
js/jQuery实现全选效果
Jun 17 jQuery
jQuery中DOM常见操作实例小结
Aug 01 jQuery
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
Jquery+javascript实现支付网页数字键盘
Dec 21 jQuery
jQuery实现简单轮播图效果
Dec 27 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给数组赋值的实例方法
2019/09/26 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
Jquery为a标签的href赋值实现代码
2013/05/03 Javascript
jquery $(this).attr $(this).val方法使用介绍
2013/10/08 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
jQuery form插件之formDdata参数校验表单及验证后提交
2016/01/23 Javascript
JavaScript代码因逗号不规范导致IE不兼容的问题
2016/02/25 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
2017/06/13 jQuery
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
基于vue.js实现购物车
2020/01/15 Javascript
vue.js使用v-model实现父子组件间的双向通信示例
2020/02/05 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python实现文件的分割与合并
2019/08/29 Python
python 动态调用函数实例解析
2019/10/21 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
浅析python 动态库m.so.1.0错误问题
2020/05/09 Python
python2和python3哪个使用率高
2020/06/23 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
python requests库的使用
2021/01/06 Python
编写html5时调试发现脚本php等网页js、css等失效
2013/12/31 HTML / CSS
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
真诚的求职信
2014/07/04 职场文书
“四风”查摆问题自我剖析材料
2014/09/27 职场文书
工作表扬信
2015/01/17 职场文书