visual.html 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1, maximum-scale=1">
  5. <link rel="stylesheet" href="assets/style.css">
  6. <title>Hammer.js</title>
  7. <style>
  8. html, body {
  9. overflow: hidden;
  10. margin: 0;
  11. }
  12. body {
  13. -webkit-perspective: 500;
  14. -moz-perspective: 500;
  15. perspective: 500;
  16. }
  17. .animate {
  18. -webkit-transition: all .3s;
  19. -moz-transition: all .3s;
  20. transition: all .3s;
  21. }
  22. #hit {
  23. padding: 10px;
  24. }
  25. #log {
  26. position: absolute;
  27. padding: 10px;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div id="log"></div>
  33. <div id="hit" style="background: #42d692; width: 150px; height: 150px;"></div>
  34. <script src="../../hammer.js"></script>
  35. <script>
  36. var reqAnimationFrame = (function () {
  37. return window[Hammer.prefixed(window, 'requestAnimationFrame')] || function (callback) {
  38. window.setTimeout(callback, 1000 / 60);
  39. };
  40. })();
  41. var log = document.querySelector("#log");
  42. var el = document.querySelector("#hit");
  43. var START_X = Math.round((window.innerWidth - el.offsetWidth) / 2);
  44. var START_Y = Math.round((window.innerHeight - el.offsetHeight) / 2);
  45. var ticking = false;
  46. var transform;
  47. var timer;
  48. var mc = new Hammer.Manager(el);
  49. mc.add(new Hammer.Pan({ threshold: 0, pointers: 0 }));
  50. mc.add(new Hammer.Swipe()).recognizeWith(mc.get('pan'));
  51. mc.add(new Hammer.Rotate({ threshold: 0 })).recognizeWith(mc.get('pan'));
  52. mc.add(new Hammer.Pinch({ threshold: 0 })).recognizeWith([mc.get('pan'), mc.get('rotate')]);
  53. mc.add(new Hammer.Tap({ event: 'doubletap', taps: 2 }));
  54. mc.add(new Hammer.Tap());
  55. mc.on("panstart panmove", onPan);
  56. mc.on("rotatestart rotatemove", onRotate);
  57. mc.on("pinchstart pinchmove", onPinch);
  58. mc.on("swipe", onSwipe);
  59. mc.on("tap", onTap);
  60. mc.on("doubletap", onDoubleTap);
  61. mc.on("hammer.input", function(ev) {
  62. if(ev.isFinal) {
  63. resetElement();
  64. }
  65. });
  66. function resetElement() {
  67. el.className = 'animate';
  68. transform = {
  69. translate: { x: START_X, y: START_Y },
  70. scale: 1,
  71. angle: 0,
  72. rx: 0,
  73. ry: 0,
  74. rz: 0
  75. };
  76. requestElementUpdate();
  77. if (log.textContent.length > 2000) {
  78. log.textContent = log.textContent.substring(0, 2000) + "...";
  79. }
  80. }
  81. function updateElementTransform() {
  82. var value = [
  83. 'translate3d(' + transform.translate.x + 'px, ' + transform.translate.y + 'px, 0)',
  84. 'scale(' + transform.scale + ', ' + transform.scale + ')',
  85. 'rotate3d('+ transform.rx +','+ transform.ry +','+ transform.rz +','+ transform.angle + 'deg)'
  86. ];
  87. value = value.join(" ");
  88. el.textContent = value;
  89. el.style.webkitTransform = value;
  90. el.style.mozTransform = value;
  91. el.style.transform = value;
  92. ticking = false;
  93. }
  94. function requestElementUpdate() {
  95. if(!ticking) {
  96. reqAnimationFrame(updateElementTransform);
  97. ticking = true;
  98. }
  99. }
  100. function logEvent(str) {
  101. //log.insertBefore(document.createTextNode(str +"\n"), log.firstChild);
  102. }
  103. function onPan(ev) {
  104. el.className = '';
  105. transform.translate = {
  106. x: START_X + ev.deltaX,
  107. y: START_Y + ev.deltaY
  108. };
  109. requestElementUpdate();
  110. logEvent(ev.type);
  111. }
  112. var initScale = 1;
  113. function onPinch(ev) {
  114. if(ev.type == 'pinchstart') {
  115. initScale = transform.scale || 1;
  116. }
  117. el.className = '';
  118. transform.scale = initScale * ev.scale;
  119. requestElementUpdate();
  120. logEvent(ev.type);
  121. }
  122. var initAngle = 0;
  123. function onRotate(ev) {
  124. if(ev.type == 'rotatestart') {
  125. initAngle = transform.angle || 0;
  126. }
  127. el.className = '';
  128. transform.rz = 1;
  129. transform.angle = initAngle + ev.rotation;
  130. requestElementUpdate();
  131. logEvent(ev.type);
  132. }
  133. function onSwipe(ev) {
  134. var angle = 50;
  135. transform.ry = (ev.direction & Hammer.DIRECTION_HORIZONTAL) ? 1 : 0;
  136. transform.rx = (ev.direction & Hammer.DIRECTION_VERTICAL) ? 1 : 0;
  137. transform.angle = (ev.direction & (Hammer.DIRECTION_RIGHT | Hammer.DIRECTION_UP)) ? angle : -angle;
  138. clearTimeout(timer);
  139. timer = setTimeout(function () {
  140. resetElement();
  141. }, 300);
  142. requestElementUpdate();
  143. logEvent(ev.type);
  144. }
  145. function onTap(ev) {
  146. transform.rx = 1;
  147. transform.angle = 25;
  148. clearTimeout(timer);
  149. timer = setTimeout(function () {
  150. resetElement();
  151. }, 200);
  152. requestElementUpdate();
  153. logEvent(ev.type);
  154. }
  155. function onDoubleTap(ev) {
  156. transform.rx = 1;
  157. transform.angle = 80;
  158. clearTimeout(timer);
  159. timer = setTimeout(function () {
  160. resetElement();
  161. }, 500);
  162. requestElementUpdate();
  163. logEvent(ev.type);
  164. }
  165. resetElement();
  166. </script>
  167. </body>
  168. </html>