home.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. document.addEventListener('DOMContentLoaded', function() {
  2. var current = 0,
  3. expanded = true;
  4. demoWindow = document.getElementById("demo-window"),
  5. demoContainer = document.getElementById("demo-container"),
  6. demoSwitcher = document.getElementById("demo-switcher"),
  7. demoWrappers = document.getElementsByClassName("demo-wrapper"),
  8. nDemos = demoWrappers.length,
  9. switcherLinks = [];
  10. /* Functions for scrolling to a certain demo. */
  11. function scrollTo(to, instant) {
  12. if (expanded) {
  13. return;
  14. }
  15. switcherLinks[current].className = "";
  16. switcherLinks[to].className = "current";
  17. var translate = -demoWrappers[0].offsetWidth * to;
  18. demoContainer.className = instant ? "" : "animated-transition";
  19. demoContainer.style.transform = "translateX(" + translate + "px)";
  20. current = to;
  21. };
  22. function scrollToNext() {
  23. scrollTo(current < nDemos - 1 ? current + 1 : current);
  24. };
  25. function scrollToPrev() {
  26. scrollTo(current > 0 ? current - 1 : current);
  27. };
  28. /* Build the expander. */
  29. var li = document.createElement("li"),
  30. expander = document.createElement("a");
  31. expander.textContent = "↧";
  32. li.appendChild(expander);
  33. demoSwitcher.appendChild(li);
  34. function expand() {
  35. expanded = true;
  36. expander.className = "current";
  37. switcherLinks[current].className = "";
  38. demoContainer.className = "expanded";
  39. demoContainer.style.transform = "";
  40. expander.textContent = "↥";
  41. }
  42. function collapse() {
  43. switcherLinks[current].className = "current";
  44. expander.className = "";
  45. demoContainer.className = "";
  46. expander.textContent = "↧";
  47. }
  48. function toggleExpand() {
  49. expanded = !expanded;
  50. if (expanded) {
  51. expand();
  52. } else {
  53. collapse();
  54. scrollTo(current, true);
  55. }
  56. }
  57. expander.onclick = toggleExpand;
  58. /* Build demo switchers. */
  59. for (var i = 0; i < nDemos; i++) {
  60. var li = document.createElement("li"),
  61. link = document.createElement("a");
  62. link.textContent = i + 1;
  63. link.onclick = (function(to) { return function() {
  64. if (expanded) {
  65. expanded = false;
  66. collapse();
  67. scrollTo(to, true);
  68. } else {
  69. scrollTo(to);
  70. }
  71. }; })(i);
  72. if (i == 0) {
  73. link.className = "current";
  74. }
  75. switcherLinks.push(link);
  76. li.appendChild(link);
  77. demoSwitcher.appendChild(li);
  78. }
  79. /* Switcher built. Hide the warning text, show the expand button, unexpand
  80. * and hide scrollbar. */
  81. document.getElementById('no-js').className = "no-display";
  82. demoContainer.className = "";
  83. expanded = false;
  84. /* Resizing breaks sliding, fix it. */
  85. window.addEventListener('resize', function() { scrollTo(current, true); });
  86. /* Scrolling primitives. */
  87. var scrollXTrigger = 5, scrollYTrigger = 5;
  88. var scrollX = false, scrollY = false;
  89. var offsetX = 0, offsetY = 0, baseOffset = 0;
  90. function handleScroll(ev) {
  91. if (!scrollX && !scrollY) {
  92. if (Math.abs(offsetX) > scrollXTrigger) {
  93. baseOffset = offsetX;
  94. scrollX = true;
  95. } else if (Math.abs(offsetY) > scrollYTrigger) {
  96. baseOffset = offsetY;
  97. scrollY = true;
  98. }
  99. }
  100. if (!scrollX) {
  101. return;
  102. }
  103. // No overscrolling.
  104. var calculatedOffset = offsetX - baseOffset;
  105. if ((current == 0 && calculatedOffset > 0) ||
  106. (current == nDemos-1 && calculatedOffset < 0)) {
  107. calculatedOffset = 0;
  108. }
  109. var translate = calculatedOffset - demoWrappers[0].offsetWidth * current;
  110. demoContainer.style.transform = "translateX(" + translate + "px)";
  111. ev.preventDefault();
  112. }
  113. function settleScroll() {
  114. if (scrollX) {
  115. var threshold = Math.min(60, demoWindow.offsetWidth / 4);
  116. if (offsetX < -threshold) {
  117. scrollToNext();
  118. } else if (offsetX > threshold) {
  119. scrollToPrev();
  120. } else {
  121. scrollTo(current);
  122. }
  123. }
  124. offsetX = offsetY = baseOffset = 0;
  125. scrollX = scrollY = false;
  126. }
  127. /* Support scrolling by touch. */
  128. var initX, initY;
  129. demoWindow.addEventListener('touchstart', function(ev) {
  130. if (expanded) {
  131. return;
  132. }
  133. initX = ev.touches[0].clientX;
  134. initY = ev.touches[0].clientY;
  135. demoContainer.className = "";
  136. });
  137. demoWindow.addEventListener('touchmove', function(ev) {
  138. if (expanded) {
  139. return;
  140. }
  141. if (ev.touches.length == 1) {
  142. var lastX = ev.touches[0].clientX;
  143. var lastY = ev.touches[0].clientY;
  144. offsetX = lastX - initX;
  145. offsetY = lastY - initY;
  146. handleScroll(ev);
  147. // document.getElementById('demo-debug').innerText = '(' + offsetX + ', ' + offsetY + '), ' + scrollX + ', ' + scrollY;
  148. }
  149. });
  150. demoWindow.addEventListener('touchcancel', function() {
  151. if (expanded) {
  152. return;
  153. }
  154. scrollTo(current);
  155. });
  156. demoWindow.addEventListener('touchend', function() {
  157. if (expanded) {
  158. return;
  159. }
  160. settleScroll();
  161. });
  162. // Keyboard bindings.
  163. window.addEventListener('keypress', function(ev) {
  164. var char = String.fromCodePoint(ev.keyCode || ev.charCode);
  165. if (char == 'h') {
  166. scrollToPrev();
  167. } else if (char == 'l') {
  168. scrollToNext();
  169. } else if (char == 'o') {
  170. toggleExpand();
  171. } else {
  172. var i = parseInt(char);
  173. if (1 <= i && i <= nDemos) {
  174. if (expanded) {
  175. expanded = false;
  176. collapse();
  177. }
  178. scrollTo(i-1);
  179. }
  180. }
  181. });
  182. });