zyflip.js 9.2 KB

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