jquery另外一種類似tab切換效果

龍恩0707發表於2013-10-16

     簡要:最近做專案一些效果不能用淘寶kissy框架 所以程式碼得自己寫啊 網上當然有很多元件 但是用他們的程式碼很多(有的是我不需要的程式碼) 且還要看API 還不如自己動手寫個簡單一個,是這麼一種簡單的效果,比如選單項 有上週 本週 下週 等等項  那麼對應的項 有相應的內容,上週項 的 內容為111 本週項的內容為222 下週項內容為333等等,當我點選上一頁或者下一頁時候 切換當前的項及項對應的內容,如果項的索引等於0的時候 那麼上一頁按鈕灰掉 變得不可點選 同理 下一頁索引等於最大項時候 也灰掉 不可點選等。

簡單的HTML也貼上:(只是為了做個demo 容易說明而已)。

<div class="container">
        <div class="menuItem">
            <span class="prev">上一頁</span>
            <div class="wrapList">
                <ul class="list">
                    <li class="menu">上週</li>
                    <li class="menu">本週</li>
                    <li class="menu">下週</li>
                </ul>
            </div>
            <span class="next">下一頁</span>
        </div>
        <div class="allContent">
            <div class="inner">
                <div class="content">11111</div>
                <div class="content">22222</div>
                <div class="content">33333</div>
            </div>
        </div>
    </div>

CSS程式碼如下:

 <style>
     *{margin:0;padding:0;}
     ul,li{list-style:none;}
     .container{width:100%;overflow:hidden;}
     .menuItem {width:300px;height:22px;line-height:22px;}
     .prev, .next{float:left;width:60px;cursor:pointer;overflow:hidden;}
     .wrapList {float:left;width:60px;height:22px;line-height:22px;overflow:hidden;}
     .list li{float:left;width:60px;height:22px;line-height:22px;text-align:center;overflow:hidden;}
     .allContent{width:300px;height:300px;overflow:hidden;}
     .content{float:left;width:300px;height:300px;overflow:hidden;}
     .disable {cursor:default;color:gray;}
  </style>

JS程式碼如下:

/**
 * 另外一種類似tab切換效果
 */

 function TabPage() {
    
    this.config = {
        type               :     'click',      // 預設為點選 上一頁按鈕 及 下一頁按鈕
        menuItemCls        :     '.menu',      // 要移動的選單項
        menuWrapCls        :     '.wrapList',  // 選單項外部容器
        panelCls           :     '.content',   // 要滾動的內容
        panelWarpCls       :     '.allContent',// 皮膚外部容器
        prevCls            :     '.prev',      // 上一頁按鈕
        nextCls            :     '.next',      // 下一頁按鈕
        disabledCls        :     'disable',    //  當上一頁達到最前面的一頁 或者 下一頁達到最後一頁時候 讓其不可點選 按鈕變灰
        switchTo           :     0,            //  預設切換到第幾項 預設為第一項
        callback           :     null          //  切換完後新增回撥函式
    };

    this.cache = {
        index   :  0        // 儲存當前的索引 
    };
 }
 TabPage.prototype = {
    init: function(options) {
        this.config = $.extend(this.config,options || {});
        var self = this,
            _config = self.config,
            _cache = self.cache;
        // 初始化容器的寬度 使其左右動畫移動操作
        var menuParent = $(_config.menuItemCls).parent(),
            menuWidth = $(_config.menuWrapCls).width(),
            len = $(_config.menuItemCls).length,
            contentParent = $(_config.panelCls).parent(),
            contentWidth = $(_config.panelWarpCls).width();
        $(menuParent).css("width",menuWidth * len);
        $(contentParent).css('width',contentWidth * len);
        
        // 儲存頁面載入時候 切換到第幾項索引 然後當上一頁點選 或者 下一頁點選 計算出當前的索引
        _cache.index = _config.switchTo;
        
        // 頁面初始化時候 先判斷_cache.index= 0,或者 _cache.index 等於最大的時候 如果是的話 那麼讓其對應的按鈕變灰不可點選
        if(_cache.index == 0) {
            !$(_config.prevCls).hasClass(_config.disabledCls) && $(_config.prevCls).addClass(_config.disabledCls);
            return;
        }else {
            $(menuParent).animate({"marginLeft":-menuWidth*_cache.index});
            $(contentParent).animate({"marginLeft":-contentWidth*_cache.index});
        }
        
        if(_cache.index == len) {
            !$(_config.nextCls).hasClass(_config.disabledCls) && $(_config.nextCls).addClass(_config.disabledCls);
            return;
        }
        // prev點選
        $(_config.prevCls).unbind(_config.type);
        $(_config.prevCls).bind(_config.type,function(){

            //判斷當前的索引是否是第一項 如果是的話 上一頁按鈕是不可點選的狀態
            if(_cache.index == 0) {
                !$(_config.prevCls).hasClass(_config.disabledCls) && $(_config.prevCls).addClass(_config.disabledCls);
                return;
             }else {
                _cache.index--;
                // 動畫animate 移動操作
                $(menuParent).animate({"marginLeft":-menuWidth*_cache.index});
                $(contentParent).animate({"marginLeft":-contentWidth*_cache.index});
                $(_config.nextCls).hasClass(_config.disabledCls) && $(_config.nextCls).removeClass(_config.disabledCls);
                
                //回撥函式
                
                _config.callback && $.isFunction(_config.callback) && _config.callback(_cache.index);

                // 如果已經是第一項的話 那麼上一頁按鈕灰掉 不可點選狀態
                if(_cache.index == 0){
                    !$(_config.prevCls).hasClass(_config.disabledCls) && $(_config.prevCls).addClass(_config.disabledCls);
                    return;
                }
                
            }
        });

        // click點選
        $(_config.nextCls).unbind('click');
        $(_config.nextCls).bind('click',function(){

            //判斷當前的索引是否是最後一項 如果是的話 下一頁按鈕是不可點選的狀態
            if(_cache.index == len-1) {
                !$(_config.nextCls).hasClass(_config.disabledCls) && $(_config.nextCls).addClass(_config.disabledCls);
                return;
             }else {
                _cache.index++;
                // 動畫animate 移動操作
                $(menuParent).animate({"marginLeft":-menuWidth*_cache.index});
                $(contentParent).animate({"marginLeft":-contentWidth*_cache.index});
                $(_config.prevCls).hasClass(_config.disabledCls) && $(_config.prevCls).removeClass(_config.disabledCls);

                //回撥函式
                _config.callback && $.isFunction(_config.callback) && _config.callback(_cache.index);

                // 同理 如果已經是最後的話 那麼下一頁按鈕灰掉 不可點選狀態
                if(_cache.index == len - 1){
                    !$(_config.nextCls).hasClass(_config.disabledCls) && $(_config.nextCls).addClass(_config.disabledCls);
                    return;
                }
             }
        });
    }
 };

呼叫方式如下:

<script>
    new TabPage().init({
		switchTo : 1,
		callback: function(index){
			console.log(index);
		}
	});
</script>

 

相關文章