zy_flip.js 9.4 KB

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