切換卡或叫標簽頁組件。它與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