/* */
/* */
/* css
//滚动区
.warp{ position:relative; overflow:hidden;}
.warp ul{ position:relative; top:0; ledt:0; transition:top linear .2s, left linear .2s;}
//滚动条
.dragwarp{ width:4px; height:100%; position:absolute; right:10px; top:0; z-index:1; display:none;}
.dragcolor{ width:2px; height:100%; margin:0 auto; background-color:#c2b38c;}
.dragbar{ width:4px; height:75px; background-color:#dfc98f; position:absolute; left:0; top:0; cursor:pointer; transition:top linear .1s, left linear .1s;}
*/
/* 调用
//常规调用
$('.warp').dragbar({
step : 50, //滚轮步长,小于等于0时关闭滚动事件
direction : 'v', //滚动方向,v/h,默认v-垂直
trwarp : null, //设置滚动区,默认为第一子元素
showbar : false, //是否持续显示滚动条
clockbar : false, //是否锁定滑块的高度,还是等比显示内容区的比例
bgcolor : false //拖拽槽是否变色
});
//ajax动态调用
$(document).on('mouseenter touchstart','.warp',function(){
if(!$(this).hasclass('drag')){
$(this).addclass('drag');
$('.warp').dragbar({
step : 50, //滚轮步长,小于等于0时关闭滚动事件
direction : 'v', //滚动方向,v/h,默认v-垂直
trwarp : null, //设置滚动区,默认为第一子元素
showbar : false, //是否持续显示滚动条
clockbar : false, //是否锁定滑块的高度,还是等比显示内容区的比例
bgcolor : false //拖拽槽是否变色
});
};
});
*/
/*模拟滚动条,支持滚轮、鼠标拖动、触摸滑动,双向调用,显示数值,设定滚动步长,不支持同一区域双向调用*/
;(function($){
$.fn.dragbar=function(opt){
var def={
step : 50, //滚轮步长,小于等于0时关闭滚动事件
direction : 'v', //滚动方向,v/h,默认v-垂直
trwarp : null, //设置滚动区,默认为第一子元素
showbar : false, //是否持续显示滚动条
clockbar : false, //是否锁定滑块的高度,还是等比显示内容区的比例
bgcolor : false, //拖拽槽是否变色
limit : true //顶点释放滚轮锁定
};
var opt=$.extend(def,opt);
this.each(function(){
var _this=$(this);
var ranclass=parseint(math.random()*100000);
_this.addclass('drag'+ranclass);
_this=$('.drag'+ranclass);
var step=opt.step;
var trwarp=opt.trwarp;
var direction=opt.direction;
if(trwarp==null){
trwarp=_this.children(':first');
};
var dragwarp=_this.children('.dragwarp');
var creatdrag='
';
if(dragwarp.length<1){
_this.append(creatdrag);
dragwarp=_this.children('.dragwarp');
dragwarp.fadein(200);
};
var dragbar=dragwarp.children('.dragbar');
var dragcolor=dragwarp.children('.dragcolor');
var swarpper,draglength,swarplength;
function resetval(){
if(direction=='v'){
swarpper=_this.height()/trwarp.outerheight(true);
if(!opt.clockbar){
dragbar.css('height',swarpper*dragwarp.height()+'px');
};
draglength=dragwarp.height()-dragbar.outerheight(true);
swarplength=trwarp.outerheight(true)-_this.height();
}else if(direction=='h'){
swarpper=_this.width()/trwarp.outerwidth(true);
if(!opt.clockbar){
dragbar.css('width',swarpper*dragwarp.width()+'px');
};
draglength=dragwarp.width()-dragbar.outerwidth(true);
swarplength=trwarp.outerwidth(true)-_this.width();
};
if(!_this.is(":hidden") && swarpper>=1){
dragwarp.css('display','none');
return false;
}else{
return true;
};
};
resetval();
_this.on('mouseenter mousemove mouseout touchstart touchend',function(){
resetval();
});
if(!opt.showbar){
_this.on('mouseenter touchstart',function(){
dragwarp.stop(true,true).fadein(200);
});
_this.on('mouseleave touchend',function(){
dragwarp.fadeout(2000);
});
};
var mw=0,md=0,percentage=0;
dragbar.on('mousedown',function(e){
if(!resetval()){return};
e.preventdefault();
var positionbar = $(this).offset();
var positionwarp = dragwarp.offset();
var distence;
if(direction=='v'){
distence = e.pagey - positionbar.top + positionwarp.top;
}else if(direction=='h'){
distence = e.pagex - positionbar.left + positionwarp.left;
};
$(document).mousemove(function(e){
if(direction=='v'){
md = e.pagey - distence;
}else if(direction=='h'){
md = e.pagex - distence;
};
if(md<0){
md=0;
}else if(md>draglength){
md = draglength;
};
percentage = md/draglength;
if(direction=='v'){
dragbar.css('top',md+'px');
trwarp.css({'top':-swarplength*percentage+'px'});
}else if(direction=='h'){
dragbar.css('left',md+'px');
trwarp.css({'left':-swarplength*percentage+'px'});
};
_this.css({'-moz-user-select':'none','-webkit-user-select':'none'}).on('selectstart',function(){return false});
});
$(document).mouseup(function(){
$(document).off('mousemove');
_this.css({'-moz-user-select':'text','-webkit-user-select':'text'}).off('selectstart');
});
});
trwarp.on('mousewheel',function(e,d){
if(!resetval()){return};
if(step<=0){
return false;
};
mw=md/step;
if(d==-1){
mw++;
if(mw>=draglength/step){
mw=draglength/step;
};
}else{
mw--;
if(mw<=0){
mw=0;
};
};
percentage = mw/draglength*step;
if(direction=='v'){
trwarp.css('top',-swarplength*percentage+'px');
dragbar.css('top',mw*step+'px');
if(opt.bgcolor){
dragcolor.css('height',mw*step+'px');
};
}else if(direction=='h'){
trwarp.css('left',-swarplength*percentage+'px');
dragbar.css('left',mw*step+'px');
if(opt.bgcolor){
dragcolor.css('width',mw*step+'px');
};
};
md=mw*step;
if(opt.limit){
if(mw>0 && mw0){
if(direction=='v'){
trwarp.css('top',ts-tm+wp+'px');
dragbar.css('top',(tm-ts)*swarpper+dp+'px');
if(opt.bgcolor){
dragcolor.css('height',(tm-ts)*swarpper+dp+'px');
};
}else if(direction=='h'){
trwarp.css('left',ts-tm+wp+'px');
dragbar.css('left',(tm-ts)*swarpper+dp+'px');
if(opt.bgcolor){
dragcolor.css('width',(tm-ts)*swarpper+dp+'px');
};
};
};
break;
case 'touchend':
//event.preventdefault();
trwarp.css('transition','top linear .2s,left linear .2s');
dragbar.css('transition','top linear .1s,left linear .1s');
if(direction=='v'){
if(parseint(dragbar.css('top'))<0){
trwarp.css('top',0);
dragbar.css('top',0);
if(opt.bgcolor){
dragcolor.css('height',0);
};
};
if(parseint(dragbar.css('top'))>draglength){
trwarp.css('top',-swarplength+'px');
dragbar.css('top',draglength+'px');
if(opt.bgcolor){
dragcolor.css('height',draglength+'px');
};
};
}else if(direction=='h'){
if(parseint(dragbar.css('left'))<0){
trwarp.css('left',0);
dragbar.css('left',0);
if(opt.bgcolor){
dragcolor.css('width',0);
};
};
if(parseint(dragbar.css('left'))>draglength){
trwarp.css('left',-swarplength+'px');
dragbar.css('left',draglength+'px');
if(opt.bgcolor){
dragcolor.css('width',draglength+'px');
};
};
};
break;
};
};
$(document).on('touchstart touchmove touchend','.drag'+ranclass,handletouchevent);
});
return this;
};
})(jquery);