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 easyui如何实现格式化列
Jul 30 jQuery
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
Aug 01 jQuery
springmvc接收jquery提交的数组数据代码分享
Oct 28 jQuery
jQuery实现判断上传图片类型和大小的方法示例
Apr 11 jQuery
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 jQuery
jquery使用FormData实现异步上传文件
Oct 25 jQuery
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
May 13 jQuery
jquery ui 实现 tab标签功能示例【测试可用】
Jul 25 jQuery
Javascript和jquery在selenium的使用过程
Oct 31 jQuery
jquery将信息遍历到界面上实例代码
Jan 21 jQuery
jquery html添加元素/删除元素操作实例详解
May 20 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框架的性能
2008/01/10 PHP
php email邮箱正则
2008/10/08 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
Yii2框架实现登录、退出及自动登录功能的方法详解
2017/10/24 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
ThinkPHP5.1表单令牌Token失效问题的解决
2019/03/22 PHP
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
js用Date对象的setDate()函数对日期进行加减操作
2014/09/18 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
JavaScript通过Date-Mask将日期转换成字符串的方法
2015/06/04 Javascript
Javascript中的getUTCDay()方法使用详解
2015/06/10 Javascript
js实现上一页下一页的效果【附代码】
2016/03/10 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
Vue数据驱动模拟实现3
2017/01/11 Javascript
vue2.x select2 指令封装详解
2017/10/12 Javascript
Node层模拟实现multipart表单的文件上传示例
2018/01/02 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
Node.js中的child_process模块详解
2018/06/08 Javascript
Puppet的一些技巧
2018/09/17 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
微信小程序录音实现功能并上传(使用node解析接收)
2020/02/26 Javascript
python调用摄像头拍摄数据集
2019/06/01 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
python实现马丁策略的实例详解
2021/01/15 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Linux的文件类型
2016/07/05 面试题
财务与信息服务专业推荐信
2013/11/28 职场文书
作文评语集锦大全
2014/04/23 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
降价通知函
2015/04/23 职场文书
高中班长竞选稿
2015/11/20 职场文书