         # Set the element transform to where it is right now.
         @animateTo(transform.m42)
 
+    getElementHeight: (el) -> parseInt(window.getComputedStyle(el).height)
+
     snapToBounds: () ->
-      @cubicBezierAnimateTo(@snapDuration,0)
+      offsetY = @getContentOffsetY()
+      if @overBottomSnapLimit(offsetY)
+        contentHeight = @getElementHeight(@element)
+        parentHeight  = @getElementHeight(@element.parentNode)
+        @cubicBezierAnimateTo(@snapDuration, (parentHeight - contentHeight) )
+      else
+        @cubicBezierAnimateTo(@snapDuration,0)
 
     # keyframes [array]
     # name [string]

        deltaY: deltaY
        newY: newY
        contentStartOffsetY: @contentStartOffsetY
        transform: @getCurrentTransform()
      }

      @lastTouchY = currentY
      newY = @snapBoundery if newY > @snapBoundery
      # @startTouchY = currentY
      # return
      @animateTo(newY)

      lines = [ '@-webkit-keyframes ' + name + ' {' ]
      keyframes.forEach (keyframe) ->
        percent = (keyframe.time / time) * 100
        frame = Math.floor(percent) + '% { '
        frame += '-webkit-transform: ' + keyframe.transform + ';'
        frame += '-webkit-transition: ' + keyframe.transition + ';' if keyframe.transition
        frame += '}'
        # D&&D(frame)
        lines.push frame
      lines.push '}'
