/* * swiper scrollbar 1.2 * plugin for swiper 1.8.8+ * http://www.idangero.us/sliders/swiper/ * * copyright 2012, vladimir kharlampidi * the idangero.us * http://www.idangero.us/ * * licensed under gpl & mit * * released on: march 4, 2013 */ swiper.prototype.plugins.scrollbar = function(swiper, params){ var enabled = params && params.container; if(!enabled) return; /*========================= default parameters ===========================*/ var defaults = { hide : true, draggable : true, snaponrelease: false } params = params || {}; for (var prop in defaults) { if (! (prop in params)) { params[prop] = defaults[prop] } } var dq = function(q) { return document.queryselectorall(q) } if(!(params.container instanceof htmlelement) && dq(params.container).length==0) return var container = params.container instanceof htmlelement ? params.container : dq(params.container)[0] var ish = swiper.params.mode=='horizontal', track = container, trackwidth, trackheight, divider, movedivider, dragwidth, dragheight; //define drag var drag = document.createelement('div') drag.classname = 'swiper-scrollbar-drag'; if (params.draggable) drag.classname += ' swiper-scrollbar-cursor-drag'; track.appendchild(drag) if (params.hide) { track.style.opacity=0 } var te = swiper.touchevents //helper function to set css3 tranforms function transform(el, pos) { var es = el.style x=pos.x||0; y=pos.y||0; z=pos.z||0; if (swiper.support.threed) { es.webkittransform = es.mstransform = es.mstransform = es.moztransform = es.otransform = es.transform = 'translate3d('+x+'px, '+y+'px, '+z+'px)' } else { es.webkittransform = es.mstransform = es.mstransform = es.moztransform = es.otransform = es.transform = 'translate('+x+'px, '+y+'px)' if (swiper.ie8) { es.left = x+'px' es.top = y+'px' } } } function settransition(el, dur) { var es = el.style es.webkittransitionduration = es.mstransitionduration = es.mstransitionduration = es.moztransitionduration = es.otransitionduration = es.transitionduration = dur+'ms'; } function getoffset(el) { var box = el.getboundingclientrect(); var body = document.body; clienttop = el.clienttop || body.clienttop || 0; clientleft = el.clientleft || body.clientleft || 0; scrolltop = window.pageyoffset || el.scrolltop; scrollleft = window.pagexoffset || el.scrollleft; return { top: box.top + scrolltop - clienttop, left: box.left + scrollleft - clientleft }; } //--- if (params.draggable) { var istouched = false; function setdragstart(e){ istouched = true; e.preventdefault(); setdragposition(e); cleartimeout(timeout); settransition(track,0) track.style.opacity = 1; swiper.settransition(100); settransition(drag,100) } function setdragmove(e){ if(!istouched) return; e.preventdefault(); setdragposition(e); swiper.settransition(0); settransition(track,0) settransition(drag,0) } var lestenel = swiper.support.touch ? track : document track.addeventlistener(te.touchstart, setdragstart, false) lestenel.addeventlistener(te.touchmove, setdragmove, false) lestenel.addeventlistener(te.touchend, function(e){ istouched = false; if (params.hide) { cleartimeout(timeout) timeout = settimeout(function(){ track.style.opacity=0; settransition(track,400) },1000) } if (params.snaponrelease) { swiper.swipereset() } }, false) function setdragposition(e){ var x = y = 0; var position; if (ish) { x = e.pagex - getoffset(track).left -dragwidth/2 if (x<0) x = 0; else if ( (x+dragwidth) > trackwidth) { x = trackwidth - dragwidth; } } else { y = e.pagey - getoffset(track).top -dragheight/2; if (y<0) y = 0; else if ( (y+dragheight) > trackheight) { y = trackheight - dragheight; } } //set drag position transform(drag,{x:x, y:y}) //wrapper offset var wrapx = -x/movedivider; var wrapy = -y/movedivider; swiper.settransform(wrapx ,wrapy) } } function setscrollbars() { drag.style.width = '' drag.style.height = '' if (ish) { trackwidth = track.offsetwidth; divider = swiper.width/swiper.wrapper.offsetwidth; movedivider = divider*(trackwidth/swiper.width); dragwidth = track.offsetwidth*divider; drag.style.width = dragwidth+'px'; } else { trackheight = track.offsetheight; divider = swiper.height/swiper.wrapper.offsetheight; movedivider = divider*(trackheight/swiper.height); dragheight = track.offsetheight*divider; drag.style.height = dragheight+'px'; } } var timeout; var hooks = { onfirstinit : function(args){ setscrollbars() }, oninit : function(args) { setscrollbars() }, ontouchmoveend : function(args) { if (params.hide) { cleartimeout(timeout) track.style.opacity=1; settransition(track,200) } }, ontouchend : function(args) { if (params.hide) { cleartimeout(timeout) timeout = settimeout(function(){ track.style.opacity=0; settransition(track,400) },1000) } }, onsettransform: function(pos){ if (ish) { var newleft = pos.x*movedivider; var newwidth = dragwidth; if (newleft > 0) { var diff = newleft; newleft = 0; newwidth = dragwidth-diff; } else if ( (-newleft+dragwidth) > trackwidth) { newwidth = trackwidth + newleft; } transform(drag,{x:-newleft}) drag.style.width = newwidth+'px'; } else { var newtop = pos.y*movedivider; var newheight = dragheight; if (newtop > 0) { var diff = newtop; newtop = 0; newheight = dragheight-diff; } else if ( (-newtop+dragheight) > trackheight) { newheight = trackheight + newtop; } transform(drag,{y:-newtop}) drag.style.height = newheight+'px'; } if (swiper.params.freemode && params.hide) { cleartimeout(timeout) track.style.opacity=1; timeout = settimeout(function(){ track.style.opacity=0; settransition(track,400) },1000) } }, onsettransition: function(args){ settransition(drag,args.duration) } } return hooks; }