zy_slide.js 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. var $support = {
  2. transform3d: ('WebKitCSSMatrix' in window),
  3. touch: ('ontouchstart' in window)
  4. };
  5. var $E = {
  6. start: $support.touch ? 'touchstart' : 'mousedown',
  7. move: $support.touch ? 'touchmove' : 'mousemove',
  8. end: $support.touch ? 'touchend' : 'mouseup',
  9. cancel: $support.touch ? 'touchcancel' : '',
  10. transEnd:'webkitTransitionEnd'
  11. };
  12. function getTranslateX(x) {
  13. return $support.transform3d ? 'translate3d('+x+'px, 0, 0)' : 'translate('+x+'px, 0)';
  14. }
  15. function getTranslateY(y) {
  16. return $support.transform3d ? 'translate3d(0,'+y+'px, 0)' : 'translate(0,'+y+'px)';
  17. }
  18. function getPage (event, page) {
  19. return $support.touch ? event.changedTouches[0][page] : event[page];
  20. }
  21. var zySlide = function(selector,dir,endFun,lock,transEnd){
  22. var self = this;
  23. self._locked= lock;
  24. self.endFun = endFun || null;
  25. self.transEnd = transEnd||null;
  26. self.nodes = [];
  27. //V:vertical
  28. //H:horizontal
  29. self.dir = dir||"H";
  30. if (selector.nodeType && selector.nodeType == 1) {
  31. self.element = selector;
  32. } else if (typeof selector == 'string') {
  33. self.id=selector;
  34. self.element = document.getElementById(selector) || document.querySelector(selector);
  35. }
  36. self._vendor=(window.navigator.userAgent.indexOf("Android 4.")>=0);
  37. if(self.dir=="H")
  38. self.element.style.webkitTransform = getTranslateX(0);
  39. else
  40. self.element.style.webkitTransform = getTranslateY(0);
  41. self.conf = {};
  42. self.touchEnabled = true;
  43. self.currentPoint = 0;
  44. self.currentXY = 0;
  45. self.refresh();
  46. //
  47. self.element.parentNode.addEventListener($E.start, self, false);
  48. self.element.parentNode.addEventListener($E.move, self, false);
  49. self.element.addEventListener($E.transEnd, self, false);
  50. if($E.cancel!="")
  51. {
  52. self.element.addEventListener($E.cancel, self, false);
  53. document.addEventListener($E.cancel, self, false);
  54. }
  55. document.addEventListener($E.end, self, false);
  56. return self;
  57. }
  58. zySlide.prototype = {
  59. handleEvent: function(event) {
  60. var self = this;
  61. switch (event.type) {
  62. case $E.start:
  63. self._touchStart(event);
  64. break;
  65. case $E.move:
  66. self._touchMove(event);
  67. break;
  68. case $E.end:
  69. case $E.cancel:
  70. self._touchEnd(event);
  71. break;
  72. case 'click':
  73. self._click(event);
  74. break;
  75. case $E.transEnd:
  76. if(self.transEnd)
  77. self.transEnd(event);
  78. break;
  79. }
  80. },
  81. addSection : function(obj){
  82. var self = this;
  83. self.element.appendChild(obj);
  84. self.refresh();
  85. },
  86. getSection : function(i){
  87. var self = this;
  88. var obj = self.nodes[i];
  89. if(obj.childNodes[1] && obj.childNodes[1].childNodes[1])
  90. return obj.childNodes[1].childNodes[1].childNodes[1];
  91. else
  92. return obj;
  93. },
  94. refresh: function() {
  95. var self = this;
  96. var conf = self.conf;
  97. // setting max point
  98. self.maxPoint = conf.point || (function() {
  99. var childNodes = self.element.childNodes,
  100. itemLength = 0,
  101. i = 0,
  102. len = childNodes.length,
  103. node;
  104. for(; i < len; i++) {
  105. node = childNodes[i];
  106. if (node.nodeType === 1) {
  107. self.nodes[itemLength]=node;
  108. itemLength++;
  109. }
  110. }
  111. if (itemLength > 0) {
  112. itemLength--;
  113. }
  114. return itemLength;
  115. })();
  116. // setting distance
  117. if(self.dir=="H")
  118. self.distance = parseInt(conf.distance || window.getComputedStyle(self.element,null).width);
  119. else
  120. self.distance = parseInt(conf.distance || window.getComputedStyle(self.element,null).height);
  121. // setting maxX maxY
  122. self.maxXY = conf.maxXY ? - conf.maxXY : - self.distance * self.maxPoint;
  123. self.moveToPoint(self.currentPoint);
  124. },
  125. hasNext: function() {
  126. var self = this;
  127. return self.currentPoint < self.maxPoint;
  128. },
  129. hasPrev: function() {
  130. var self = this;
  131. return self.currentPoint > 0;
  132. },
  133. toNext: function() {
  134. var self = this;
  135. if (!self.hasNext()) {
  136. return;
  137. }
  138. self.moveToPoint(self.currentPoint + 1);
  139. },
  140. toPrev: function() {
  141. var self = this;
  142. if (!self.hasPrev()) {
  143. return;
  144. }
  145. self.moveToPoint(self.currentPoint - 1);
  146. },
  147. moveToPoint: function(point) {
  148. var self = this;
  149. self.currentPoint =
  150. (point < 0) ? 0 :
  151. (point > self.maxPoint) ? self.maxPoint :
  152. parseInt(point);
  153. self.element.style.webkitTransitionDuration = '500ms';
  154. self._setXY(- self.currentPoint * self.distance);
  155. var ev = document.createEvent('Event');
  156. ev.initEvent('css3flip.moveend', true, false);
  157. self.element.dispatchEvent(ev);
  158. },
  159. _setXY: function(xy) {
  160. var self = this;
  161. self.currentXY = xy;
  162. if(self.dir=="H")
  163. self.element.style.webkitTransform = getTranslateX(xy);
  164. else
  165. self.element.style.webkitTransform = getTranslateY(xy);
  166. },
  167. _touchStart: function(event) {
  168. var self = this;
  169. if(self._locked)
  170. {
  171. event.preventDefault();
  172. event.stopPropagation();
  173. }
  174. if (!self.touchEnabled) {
  175. return;
  176. }
  177. if (!$support.touch) {
  178. event.preventDefault();
  179. }
  180. self.element.style.webkitTransitionDuration = '0';
  181. self.scrolling = true;
  182. self.moveReady = false;
  183. self.startPageX = getPage(event, 'pageX');
  184. self.startPageY = getPage(event, 'pageY');
  185. if(self.dir=="H")
  186. self.basePage = self.startPageX;
  187. else
  188. self.basePage = self.startPageY
  189. self.direction = 0;
  190. self.startTime = event.timeStamp;
  191. },
  192. _touchMove: function(event) {
  193. var self = this;
  194. if(self._locked)
  195. {
  196. event.preventDefault();
  197. event.stopPropagation();
  198. }
  199. if (!self.scrolling) {
  200. return;
  201. }
  202. var pageX = getPage(event, 'pageX'),
  203. pageY = getPage(event, 'pageY'),
  204. distXY,
  205. newXY,
  206. deltaX,
  207. deltaY;
  208. if (!self.moveReady) {
  209. deltaX = Math.abs(pageX - self.startPageX);
  210. deltaY = Math.abs(pageY - self.startPageY);
  211. if(self.dir=="H"){
  212. if (deltaX>deltaY && deltaX > 5) {
  213. if(self._vendor)//Android 4.0 need prevent default
  214. {
  215. event.preventDefault();
  216. }
  217. self.moveReady = true;
  218. self.element.parentNode.addEventListener('click', self, true);
  219. }
  220. else if (deltaY > 5) {
  221. self.scrolling = false;
  222. }
  223. }else{
  224. if (deltaY>deltaX && deltaY> 5) {
  225. if(self._vendor)//Android 4.0 need prevent default
  226. {
  227. event.preventDefault();
  228. }
  229. self.moveReady = true;
  230. self.element.parentNode.addEventListener('click', self, true);
  231. }
  232. else if (deltaX > 5) {
  233. self.scrolling = false;
  234. }
  235. }
  236. }
  237. if (self.moveReady) {
  238. //event.preventDefault();
  239. //event.stopPropagation();
  240. if(self.dir=="H")
  241. distXY = pageX - self.basePage;
  242. else
  243. distXY = pageY - self.basePage;
  244. newXY = self.currentXY + distXY;
  245. if (newXY >= 0 || newXY < self.maxXY) {
  246. newXY = Math.round(self.currentXY + distXY / 3);
  247. }
  248. self._setXY(newXY);
  249. self.direction = distXY > 0 ? -1 : 1;
  250. }
  251. if(self.dir=="H")
  252. self.basePage = pageX;
  253. else
  254. self.basePage = pageY;
  255. },
  256. _touchEnd: function(event) {
  257. var self = this;
  258. if(self._locked)
  259. {
  260. event.preventDefault();
  261. event.stopPropagation();
  262. }
  263. if (!self.scrolling) {
  264. return;
  265. }
  266. self.scrolling = false;
  267. var newPoint = -self.currentXY / self.distance;
  268. newPoint =
  269. (self.direction > 0) ? Math.ceil(newPoint) :
  270. (self.direction < 0) ? Math.floor(newPoint) :
  271. Math.round(newPoint);
  272. self.moveToPoint(newPoint);
  273. setTimeout(function() {
  274. self.element.parentNode.removeEventListener('click', self, true);
  275. }, 200);
  276. if(self.endFun)
  277. self.endFun();
  278. },
  279. _click: function(event) {
  280. var self = this;
  281. event.stopPropagation();
  282. event.preventDefault();
  283. },
  284. destroy: function() {
  285. var self = this;
  286. self.element.parentNode.removeEventListener($E.start, self);
  287. self.element.parentNode.removeEventListener($E.move, self);
  288. self.element.parentNode.removeEventListener($E.transEnd, self);
  289. self.element.parentNode.removeEventListener($E.cancel, self);
  290. document.removeEventListener($E.end, self);
  291. document.removeEventListener($E.cancel, self);
  292. }
  293. }