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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM