idangerous.swiper.scrollbar-1.2.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /*
  2. * Swiper Scrollbar 1.2
  3. * Plugin for Swiper 1.8.8+
  4. * http://www.idangero.us/sliders/swiper/
  5. *
  6. * Copyright 2012, Vladimir Kharlampidi
  7. * The iDangero.us
  8. * http://www.idangero.us/
  9. *
  10. * Licensed under GPL & MIT
  11. *
  12. * Released on: March 4, 2013
  13. */
  14. Swiper.prototype.plugins.scrollbar = function(swiper, params){
  15. var enabled = params && params.container;
  16. if(!enabled) return;
  17. /*=========================
  18. Default Parameters
  19. ===========================*/
  20. var defaults = {
  21. hide : true,
  22. draggable : true,
  23. snapOnRelease: false
  24. }
  25. params = params || {};
  26. for (var prop in defaults) {
  27. if (! (prop in params)) {
  28. params[prop] = defaults[prop]
  29. }
  30. }
  31. var dq = function(q) {
  32. return document.querySelectorAll(q)
  33. }
  34. if(!(params.container instanceof HTMLElement) && dq(params.container).length==0) return
  35. var container = params.container instanceof HTMLElement ? params.container : dq(params.container)[0]
  36. var isH = swiper.params.mode=='horizontal',
  37. track = container,
  38. trackWidth, trackHeight, divider, moveDivider, dragWidth, dragHeight;
  39. //Define Drag
  40. var drag = document.createElement('div')
  41. drag.className = 'swiper-scrollbar-drag';
  42. if (params.draggable) drag.className += ' swiper-scrollbar-cursor-drag';
  43. track.appendChild(drag)
  44. if (params.hide) {
  45. track.style.opacity=0
  46. }
  47. var te = swiper.touchEvents
  48. //Helper Function to set CSS3 Tranforms
  49. function transform(el, pos) {
  50. var es = el.style
  51. x=pos.x||0;
  52. y=pos.y||0;
  53. z=pos.z||0;
  54. if (swiper.support.threeD) {
  55. es.webkitTransform = es.MsTransform = es.msTransform = es.MozTransform = es.OTransform = es.transform = 'translate3d('+x+'px, '+y+'px, '+z+'px)'
  56. }
  57. else {
  58. es.webkitTransform = es.MsTransform = es.msTransform = es.MozTransform = es.OTransform = es.transform = 'translate('+x+'px, '+y+'px)'
  59. if (swiper.ie8) {
  60. es.left = x+'px'
  61. es.top = y+'px'
  62. }
  63. }
  64. }
  65. function setTransition(el, dur) {
  66. var es = el.style
  67. es.webkitTransitionDuration = es.MsTransitionDuration = es.msTransitionDuration = es.MozTransitionDuration = es.OTransitionDuration = es.transitionDuration = dur+'ms';
  68. }
  69. function getOffset(el) {
  70. var box = el.getBoundingClientRect();
  71. var body = document.body;
  72. clientTop = el.clientTop || body.clientTop || 0;
  73. clientLeft = el.clientLeft || body.clientLeft || 0;
  74. scrollTop = window.pageYOffset || el.scrollTop;
  75. scrollLeft = window.pageXOffset || el.scrollLeft;
  76. return {
  77. top: box.top + scrollTop - clientTop,
  78. left: box.left + scrollLeft - clientLeft
  79. };
  80. }
  81. //---
  82. if (params.draggable) {
  83. var isTouched = false;
  84. function setDragStart(e){
  85. isTouched = true;
  86. e.preventDefault();
  87. setDragPosition(e);
  88. clearTimeout(timeout);
  89. setTransition(track,0)
  90. track.style.opacity = 1;
  91. swiper.setTransition(100);
  92. setTransition(drag,100)
  93. }
  94. function setDragMove(e){
  95. if(!isTouched) return;
  96. e.preventDefault();
  97. setDragPosition(e);
  98. swiper.setTransition(0);
  99. setTransition(track,0)
  100. setTransition(drag,0)
  101. }
  102. var lestenEl = swiper.support.touch ? track : document
  103. track.addEventListener(te.touchStart, setDragStart, false)
  104. lestenEl.addEventListener(te.touchMove, setDragMove, false)
  105. lestenEl.addEventListener(te.touchEnd, function(e){
  106. isTouched = false;
  107. if (params.hide) {
  108. clearTimeout(timeout)
  109. timeout = setTimeout(function(){
  110. track.style.opacity=0;
  111. setTransition(track,400)
  112. },1000)
  113. }
  114. if (params.snapOnRelease) {
  115. swiper.swipeReset()
  116. }
  117. }, false)
  118. function setDragPosition(e){
  119. var x = y = 0;
  120. var position;
  121. if (isH) {
  122. x = e.pageX - getOffset(track).left -dragWidth/2
  123. if (x<0) x = 0;
  124. else if ( (x+dragWidth) > trackWidth) {
  125. x = trackWidth - dragWidth;
  126. }
  127. }
  128. else {
  129. y = e.pageY - getOffset(track).top -dragHeight/2;
  130. if (y<0) y = 0;
  131. else if ( (y+dragHeight) > trackHeight) {
  132. y = trackHeight - dragHeight;
  133. }
  134. }
  135. //Set Drag Position
  136. transform(drag,{x:x, y:y})
  137. //Wrapper Offset
  138. var wrapX = -x/moveDivider;
  139. var wrapY = -y/moveDivider;
  140. swiper.setTransform(wrapX ,wrapY)
  141. }
  142. }
  143. function setScrollBars() {
  144. drag.style.width = ''
  145. drag.style.height = ''
  146. if (isH) {
  147. trackWidth = track.offsetWidth;
  148. divider = swiper.width/swiper.wrapper.offsetWidth;
  149. moveDivider = divider*(trackWidth/swiper.width);
  150. dragWidth = track.offsetWidth*divider;
  151. drag.style.width = dragWidth+'px';
  152. }
  153. else {
  154. trackHeight = track.offsetHeight;
  155. divider = swiper.height/swiper.wrapper.offsetHeight;
  156. moveDivider = divider*(trackHeight/swiper.height);
  157. dragHeight = track.offsetHeight*divider;
  158. drag.style.height = dragHeight+'px';
  159. }
  160. }
  161. var timeout;
  162. var hooks = {
  163. onFirstInit : function(args){
  164. setScrollBars()
  165. },
  166. onInit : function(args) {
  167. setScrollBars()
  168. },
  169. onTouchMoveEnd : function(args) {
  170. if (params.hide) {
  171. clearTimeout(timeout)
  172. track.style.opacity=1;
  173. setTransition(track,200)
  174. }
  175. },
  176. onTouchEnd : function(args) {
  177. if (params.hide) {
  178. clearTimeout(timeout)
  179. timeout = setTimeout(function(){
  180. track.style.opacity=0;
  181. setTransition(track,400)
  182. },1000)
  183. }
  184. },
  185. onSetTransform: function(pos){
  186. if (isH) {
  187. var newLeft = pos.x*moveDivider;
  188. var newWidth = dragWidth;
  189. if (newLeft > 0) {
  190. var diff = newLeft;
  191. newLeft = 0;
  192. newWidth = dragWidth-diff;
  193. }
  194. else if ( (-newLeft+dragWidth) > trackWidth) {
  195. newWidth = trackWidth + newLeft;
  196. }
  197. transform(drag,{x:-newLeft})
  198. drag.style.width = newWidth+'px';
  199. }
  200. else {
  201. var newTop = pos.y*moveDivider;
  202. var newHeight = dragHeight;
  203. if (newTop > 0) {
  204. var diff = newTop;
  205. newTop = 0;
  206. newHeight = dragHeight-diff;
  207. }
  208. else if ( (-newTop+dragHeight) > trackHeight) {
  209. newHeight = trackHeight + newTop;
  210. }
  211. transform(drag,{y:-newTop})
  212. drag.style.height = newHeight+'px';
  213. }
  214. if (swiper.params.freeMode && params.hide) {
  215. clearTimeout(timeout)
  216. track.style.opacity=1;
  217. timeout = setTimeout(function(){
  218. track.style.opacity=0;
  219. setTransition(track,400)
  220. },1000)
  221. }
  222. },
  223. onSetTransition: function(args){
  224. setTransition(drag,args.duration)
  225. }
  226. }
  227. return hooks;
  228. }