这里的Tab选项卡切换本质上是一个切换器,任意1对1的交互效果都支持,例如文档后面演示的轮播效果。
作为插件单独使用
引用下面CSS文件:
<link rel="stylesheet" href="https://qidian.gtimg.com/lulu/pure/css/common/ui/Tab.css">
引用下面的JS文件:
<script src="https://qidian.gtimg.com/lulu/pure/js/common/ui/Tab.js"></script>
效果与基本使用
页面内选项卡
效果见本页demo演示。
HTML结构如下:
<div id="tabView" class="ui-tab-tabs"> <a href="#tabTarget1" class="ui-tab-tab active">选项卡文档</a> <a href="#tabTarget2" class="ui-tab-tab">业务JS分离演示</a> </div> <div class="ui-tab-contents"> <div id="tabTarget1" class="ui-tab-content active"></div> <div id="tabTarget2" class="ui-tab-content"></div> </div>
JS Tab初始化:
new Tab(document.querySelectorAll('#tabView > a'), {
slide: true,
onSwitch: function (tab, resetTab, panel, resetPanel) {
// todo
}
});
上面代码红色部分是选项卡效果生效比较重要的关联设置,href
的属性值正好是切换面板元素的ID。
.ui-tab-contents
元素可以在页面任意位置,没有限制。
可以看到,选项卡切换的效果触发都是基于状态类名.active
实现的。.active
类名本身不具有任何样式,用在和其他选择器发生关联进而实现样式设置。
使用href="#id"
进行面板元素关联旨在保证无JavaScript或者页面处于非可交互状态时候选项卡也可以使用,语义也非常好,但是由于现在现代浏览器还没有支持:target-within
伪类,效果并不完美,有些开发人员可能不太喜欢,则可以使用data-rel
自定义属性指定关联面板的ID或者类名。例如:
本项目通用选项卡基本 HTML 结构如下:
<div id="tabView" class="ui-tab-tabs"> <a href="javascript:" class="ui-tab-tab active" data-rel="tabTarget1">选项卡1</a> <a href="javascript:" class="ui-tab-tab" data-rel="tabTarget2">选项卡2</a> </div> <div class="ui-tab-contents"> <div id="tabTarget1" class="ui-tab-content active"></div> <div id="tabTarget2" class="ui-tab-content"></div> </div>
链接选项卡
如果你的选项卡是 url 页面刷新跳转之流,则只需要静态 HTML 即可,无需任何 JS 绑定或事件处理。HTML如下:
<div class="ui-tab-tabs"> <a href="/a/" class="ui-tab-tab">选项卡1</a> <a href="/b/" class="ui-tab-tab active">选项卡2</a> </div>
选项卡变体
Tab.js也可以实现手风琴切换或者广告图轮播效果(自己额外增加一段定时器代码),具体参见文档底部案例。
语法和参数
var myTab = new Tab(elements, callback); var myTab = new Tab(elements, options);
其中:
- element
- 必需。HTMLCollection元素集合。表示触发选项卡切换的元素。
- callback
- 可选。Function函数。表示切换时候触发的回调。
- options
- 可选。Object纯对象。可选参数释义见下表:
参数名称 | 支持类型 | 默认值 | 释义 |
---|---|---|---|
event |
String | 'click' | 事件类型。默认为点击事件。 还支持 |
index | String Number |
'auto' | 选中选项卡的索引值。默认'auto' .active )获取index 值。 |
autoplay | Number | false | 定时播放时间,单位毫秒。 |
history | Boolean | true | 是否通过url无刷新标记选项卡地址。默认true 表示选项卡切换时候查询地址变化。IE10+增强功能。IE9浏览器使用hash标记。
此参数需要Tab按钮是 |
slide | Boolean | false | Tab 切换时底部的下划线是否会有滑动效果。默认false 表示 Tab 切换时没有滑动效果。IE10+。 |
onSwitch | Function | func |
点击切换的回调。其中,上下文this 指点击元素DOM对象。支持4个参数。分别表示:当前点击元素选项卡元素,恢复到非选中态的选项卡元素,显示的面板元素,恢复到非选中态的面板元素。 |
实例对象
myTab
就是返回的实例对象,暴露了以下属性和方法:
{ // 暴露的元素们 element = { // 选项卡元素们 tabs: [], // 当前激活选项卡 tab: null, // 面板元素们 panels: [], // 当前激活面板元素 panel: null }, params: { // 事件类型 eventType: 'click', // 当前激活选项卡索引值 index: 0, // 定时播放时间 autoplay: 0, // 是否记录选项卡变化历史 history: true, // 是否下划线动画 slide: false }, // 回调方法 callback: { switch: function () {} }, // 传入Tab元素,返回对应的Panel元素 // 可选,如果缺省,使用返回当前激活的Panel元素 getPanel: function (eleTab) {}, // 传入Tab元素,对应的面板元素显示 // 可选,如果缺省,使用当前暴露在element对象中的tab元素 show: function (eleTab) {} }
扩展:广告图轮播实现
效果如下:
样式需要重写,LuLu UI不提供,源码示意:
CSS部分:
.slide-container { position: relative; width: 350px; height: 105px; border: 1px solid #ddd; } .slide-a { position: absolute; transition: opacity .2s; } .slide-a:not(.active) { opacity: 0; visibility: hidden; transition: opacity .2s, visibility .01s .2s; } .slide-img { display: block; width: 100%; height: 105px; } .slide-dot-x { width: 350px; text-align: center; position: relative; margin-top: -25px; } .slide-dot { display: inline-block; width: 10px; height: 10px; border: 4px solid transparent; background-color: #fff; background-clip: content-box; border-radius: 50%; } .slide-dot.active { background-color: #cd0000; }
HTML部分:
<div id="slideContainer" class="slide-container"> <a href id="slideLi1" class="slide-a active"> <img src="1.jpg" class="slide-img"> </a> <a href id="slideLi2" class="slide-a"> <img src="2.jpg" class="slide-img"> </a> <a href id="slideLi3" class="slide-a"> <img src="3.jpg" class="slide-img"> </a> </div> <div id="slideDot" class="slide-dot-x"> <i class="slide-dot active" data-rel="slideLi1"></i> <i class="slide-dot" data-rel="slideLi2"></i> <i class="slide-dot" data-rel="slideLi3"></i> </div>
JS部分:
new Tab(document.querySelectorAll('#slideDot i'), { eventType: 'mouseover', autoplay: 3000 });