changeset 7:0287d65ec97f

use css transform for scrolling
author Atul Varma <avarma@mozilla.com>
date Sun, 02 May 2010 18:08:14 -0700
parents efb34c9b7c18
children 0cc8c5962c0b
files index.html
diffstat 1 files changed, 36 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/index.html	Sun May 02 16:18:40 2010 -0700
+++ b/index.html	Sun May 02 18:08:14 2010 -0700
@@ -28,11 +28,16 @@
 div.palette {
   float: right;
   width: 1em;
-  max-height: 1em;
   overflow: hidden;
   font-size: 144pt;
 }
 
+div.palette-container {
+  -webkit-transition-property: -webkit-transform;
+  -webkit-transition-duration: 0.5s;
+  -webkit-transition-timing-function: ease-out;
+}
+
 .letter-prototype {
   cursor: pointer;
   color: gray;
@@ -42,7 +47,10 @@
 </style>
 </head>
 <body>
-<div id="letters" class="palette"></div>
+<div id="letters" class="palette">
+  <div class="palette-container">
+  </div>
+</div>
 <script>
 if (typeof Array.isArray !== 'function') {
   Array.isArray = function (value) {
@@ -231,37 +239,26 @@
 function makeScrollable() {
   var node = this;
   var startY = 0;
-  var currY = 0;
   var floatScrollTop = 0;
-  var timerID;
-  var veloc = 0;
+  var touchMoved = false;
+  var matrix = new WebKitCSSMatrix();
 
-  var maxHeight = node.scrollHeight - node.clientHeight;
+  var maxHeight = node.parentNode.scrollHeight -
+                  node.parentNode.clientHeight;
 
-  function timer() {
-    floatScrollTop += (veloc * 0.05);
-    if (floatScrollTop < 0)
-      floatScrollTop = 0;
-    else if (floatScrollTop > maxHeight)
-      floatScrollTop = maxHeight;
-    node.scrollTop = Math.floor(floatScrollTop);
-    veloc = 0.95 * veloc;
-    if (Math.abs(veloc) < 1) {
-      veloc = 0;
-      clearInterval(timerID);
-      timerID = undefined;
-    }
-  }
-
-  function accelerate(amount) {
-    veloc += amount;
-    if (timerID === undefined)
-      timerID = setInterval(timer, 10);
+  function accelerate(delta) {
+    matrix = matrix.translate(0, delta);
+    if (matrix.f > 0)
+      matrix.f = 0;
+    else if (matrix.f < -maxHeight)
+      matrix.f = -maxHeight;
+    console.log(matrix.toString());
+    node.style.webkitTransform = matrix;
   }
 
   if (!isTouchSupported) {
     $(node).bind("mousewheel", function(event) {
-      accelerate(-event.wheelDelta);
+      accelerate(event.wheelDelta);
     });
 
     $(node).find(".letter-prototype").bind("click", makeLetter);
@@ -269,18 +266,20 @@
     $(node).bind("touchstart", function(event) {
       event.preventDefault();
       startY = event.targetTouches[0].pageY;
+      touchMoved = false;
     });
 
     $(node).bind("touchmove", function(event) {
       event.preventDefault();
-      currY = event.targetTouches[0].pageY;
-      accelerate(startY - currY);
+      var currY = event.targetTouches[0].pageY;
+      accelerate((currY - startY) * 2);
       startY = currY;
+      touchMoved = true;
     });
 
     $(node).bind("touchend", function(event) {
       event.preventDefault();
-      if (veloc == 0) {
+      if (!touchMoved) {
         var target = event.changedTouches[0].target;
         if (target.nodeType == target.TEXT_NODE)
           target = target.parentNode;
@@ -303,16 +302,18 @@
   letter.appendChild(char);
   letter.appendChild(info);
 
-  var matrix = new WebKitCSSMatrix();
-
   // TODO: This assumes things about the DOM structure that
   // we don't want to have to assume.
+  var parentMatrix = new WebKitCSSMatrix();
+  var matrix = new WebKitCSSMatrix();
+
+  parentMatrix.setMatrixValue(this.parentNode.style.webkitTransform);
   matrix = matrix.translate(
     this.offsetLeft,
-    this.offsetTop - this.parentNode.scrollTop
+    this.offsetTop + parentMatrix.f
   );
+
   letter.style.webkitTransform = matrix;
-
   doc.body.appendChild(letter);
 
   // Apply a new transform to make the letter animate.
@@ -348,9 +349,9 @@
 })();
 
 $(window).bind("DOMContentLoaded", function() {
-  $("#letters").each(addLetters);
+  $("#letters .palette-container").each(addLetters);
   $("#letters").css({"max-height": document.body.clientHeight});
-  $(".palette").each(makeScrollable);
+  $(".palette-container").each(makeScrollable);
 });
 </script>
 </body>