/**
* [ xTaber 切换 ]
* @param {[type]} $ [description]
* @return {[type]} [description]
*/
(function($){
$.fn.extend({
xTaber: function(opt){
var def = $.extend({
/* @tab 触发事件标签 [true|false|obj]
* true 自动生成带数字的标签
* false 不显示tab
* obj 自定义tab
*/
tab: true, //默认为自动生成
content:$('#xtaberWrap'),
prev: null, //上一个按钮
next: null, //下一个按钮
/* @style 滚动的样式 [opacity|left|top|none]
* opacity 淡出淡入
* left 向左
* top 向上
* none 无效果
*/
style: 'opacity', //默认为opacity
activeClass: 'current', //当前样式
delay: 100, //操作延时
speed: 300, //移动速度
timeout: 3000, //间歇时间
auto: false, //是否自动滚动
setup: 1,//每次滚动多少个
defaultShow: 1, //默认显示第n个
mouseEvent: 'mouseover', //鼠标事件
tabedCallback: null //切换后的回调函数
}, opt);
if(typeof def.setup != Number && def.setup < 1) def.setup = 1;
// 内部通用变量
var self = def.content,
content = self.find('[rel="xtaberItems"]'),
subItem = content.find('.xtaber-item'),
itemLength = subItem.length,
subItemHeight =
parseInt(subItem.height())+
parseInt(subItem.css('marginTop'))+
parseInt(subItem.css('marginBottom'))+
parseInt(subItem.css('paddingTop'))+
parseInt(subItem.css('paddingBottom')),
subItemWidth =
parseInt(subItem.width())+
parseInt(subItem.css('marginLeft'))+
parseInt(subItem.css('marginRight'))+
parseInt(subItem.css('paddingLeft'))+
parseInt(subItem.css('paddingRight')),
scrollHeight = subItemHeight * def.setup,
scrollWidth = subItemWidth * def.setup,
screenNum,
current = 0,
autoTimer,
itemTimer,
tabItem = null;
//滚动屏数
if(def.setup == 1){
screenNum = itemLength;
}
else{
var inAll = (itemLength % def.setup),
num = parseInt(itemLength / def.setup);
screenNum = (inAll > 0) ? (num+1) : num;
}
var init = function(){
// 自动生成tab
if(def.tab && typeof def.tab != 'object'){
var tabHTML = '
';
for(var i=1; i<=screenNum; i++){
tabHTML += '- '+i+'
';
}
tabHTML += '
';
self.append(tabHTML);
def.tab = self.find('[rel="xtaberTabs"]');
}
else if(typeof def.tab == 'object'){
def.tab = self.find('[rel="xtaberTabs"]');
}
else{
def.tab = null;
}
if(def.tab != null){
tabItem = def.tab.find('[rel="xtaberTabItem"]');
}
if(typeof def.next == 'boolean' && def.next){
def.next = $('next');
def.next.appendTo(self);
}
if(typeof def.prev == 'boolean' && def.prev){
def.prev = $('prev');
def.prev.appendTo(self);
}
switch(def.style){
case 'left':
setParent('left');
break;
case 'top':
setParent('top');
break;
}
goTo(def.defaultShow - 1);
bindEvent();
if(def.auto){
auto();
}
}
//设置父级的样式
var setParent = function(type){
var wrapHeight,wrapWidht,contentWidth,contentHeight;
if(type == 'top'){
contentHeight = subItemHeight * itemLength;
contentWidth = subItemWidth;
}
else if(type == 'left'){
contentHeight = subItemHeight;
contentWidth = subItemWidth * itemLength;
}
//alert(typeof(subItemWidth));
content.css({
left: 0,
top: 0,
position: 'absolute',
width: contentWidth,
height: contentHeight
});
}
var goTo = function(index){
clearInterval(autoTimer);
clearTimeout(itemTimer);
current = index;
switch(def.style){
case 'top':
content.stop().animate({'top': -(index * scrollHeight)}, def.speed);
break;
case 'left':
content.stop().animate({'left': -(index * scrollWidth)}, def.speed);
break;
case 'opacity':
subItem.eq(index).fadeIn().siblings().hide();
break;
default:
subItem.eq(index).show().siblings().hide();
break;
}
if(def.tab != null){
tabItem.eq(index).addClass(def.activeClass).siblings().removeClass(def.activeClass);
}
if(def.auto){
auto()
};
if(def.tabedCallback){
tabedCallback();
}
}
var auto = function(){
if(def.auto){
clearInterval(autoTimer);
autoTimer = setInterval(function(){
if(current + 1 >= screenNum){
goTo(0);
}else{
goTo(current + 1);
}
}, def.timeout);
}
}
//绑定事件
var bindEvent = function(){
if(def.tab != null){
tabItem.each(function(){
var el = $(this);
el.bind(def.mouseEvent, function(){
clearInterval(autoTimer);
clearTimeout(itemTimer);
itemTimer = setTimeout(function(){
goTo(el.index());
}, def.delay);
});
el.bind('mouseleave', function(){
clearTimeout(itemTimer);
auto();
});
});
}
if(def.next){
def.next.click(function(){
var currentNum = (current + 1 >= screenNum) ? 0 : current + 1;
goTo(currentNum);
});
}
if(def.prev){
def.prev.click(function(){
var currentNum = (current - 1 < 0) ? screenNum - 1 : current - 1;
goTo(currentNum);
});
}
}
init();
}
});
})(jQuery);