bootstrap源码学习与示例:bootstrap-tab
切换卡或叫标签页组件。它与scrollspy组件一样,分为两部分,触发区与面板区。触发区用于绑定点击事件,切换对应的面板。
切换区为一个UL列表,要求UL带"nav nav-tabs"或"nav nav-pills"这两种类名。li下的标签要求有 data-toggle="tab"属性,你可以通过data-target或href指定对应的面板。
面板区要求就相对宽松些,容器要求带"tab-content"类名,下面的每个面板都要求带"tab-pane"类名。
<ul id="mytab" class="nav nav-tabs">
<li class="active"><a href="#home" data-toggle="tab">首页</a></li>
<li><a href="#profile" data-toggle="tab">介绍</a></li>
<li><a href="#messages" data-toggle="tab">消息</a></li>
<li><a href="#settings" data-toggle="tab">设置</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="home">111</div>
<div class="tab-pane" id="profile">2222</div>
<div class="tab-pane" id="messages">333</div>
<div class="tab-pane" id="settings">444.</div>
</div>
这样你直接引入JS就能用了,但你必须为当中某个标签页的LI元素指定"active"类名
如果你想用JS明确指定哪个面板被激活,你是要对它的某个标签页的链接使用tab("show")方法,而不是作用于它的容器上。这个与其他jQuery插件有点不同。
$(function () {
$('.nav-tabs a:last').tab('show')
})
!function ($) {
"use strict"; // jshint ;_;
/* TAB CLASS DEFINITION
* ==================== */
var Tab = function (element) {
this.element = $(element)
}
//整个控件分两部分,触发区与面板区
Tab.prototype = {
constructor: Tab ,
//这是用于切换触发区与相关事件,并在里面调用切换面板的activate
show: function () {
var $this = this.element
, $ul = $this.closest('ul:not(.dropdown-menu)')//找到触发区的容器
, selector = $this.attr('data-target')//取得对应的面板的CSS表达式
, previous
, $target
, e
if (!selector) {
selector = $this.attr('href')//没有则从href得到
selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
}
if ( $this.parent('li').hasClass('active') ) return
previous = $ul.find('.active:last a')[0]//对得之前被激活的链接
e = $.Event('show', {
relatedTarget: previous
})
$this.trigger(e)
if (e.isDefaultPrevented()) return
$target = $(selector)
this.activate($this.parent('li'), $ul)
this.activate($target, $target.parent(), function () {
$this.trigger({
type: 'shown'
,
relatedTarget: previous
})
})
} ,
//这方面不应该放到原型上,应该做成私有方法
activate: function ( element, container, callback) {
var $deactivate = container.find('> .active')
, transition = callback
&& $.support.transition
&& $deactivate.hasClass('fade')
function next() {
//让之前的处于激活状态处于激活状态
$deactivate
.removeClass('active')
.find('> .dropdown-menu > .active')
.removeClass('active')
//让当前面板处于激活状态
element.addClass('active')
if (transition) {
element[0].offsetWidth // reflow for transition
element.addClass('in')
} else {
element.removeClass('fade')
}
if ( element.parent('.dropdown-menu') ) {
element.closest('li.dropdown').addClass('active')
}
//执行回调,目的是触发shown事件
callback && callback()
}
transition ?
$deactivate.one($.support.transition.end, next) :
next()
//开始触发CSS3 transition回调
$deactivate.removeClass('in')
}
}
/* TAB PLUGIN DEFINITION
* ===================== */
var old = $.fn.tab
$.fn.tab = function ( option ) {
return this.each(function () {
var $this = $(this)
, data = $this.data('tab')
if (!data) $this.data('tab', (data = new Tab(this)))
if (typeof option == 'string') data[option]()//show
})
}
$.fn.tab.Constructor = Tab
/* TAB NO CONFLICT
* =============== */
$.fn.tab.noConflict = function () {
$.fn.tab = old
return this
}
/* TAB DATA-API
* ============ */
//要求触发区必须存在[data-toggle="tab"]或[data-toggle="pill"]属性
$(document).on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
e.preventDefault()
$(this).tab('show')
})
}(window.jQuery);
它要引入navs.less
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年
浙公网安备 33010602011771号