 
     if stuck.length > 0
       # Calculate y-positions for all stuck components
-      y_pos = scroller.solveForY stickies
+      y_pos = scroller.solveForY stuck, stickies
 
       for k in stuck
         sticky = fetch k
-        sticky.y = y_pos[k].value
-
-        if !sticky.stuck
-          scroller.toggleStuck k, stickies[k]
-
-        save sticky
+        scroller.last_positions[k] = y_pos[k].value
+        [x, y] = scroller.adjustForDevice y_pos[k].value, stickies[k]
+        if sticky.y != y || sticky.x != x
+          sticky.y = y
+          sticky.x = x
+          if !sticky.stuck
+            scroller.toggleStuck k, stickies[k]
+          
+          save sticky
+
+
+
 
     scroller.last_viewport_top = scroller.viewport_top
+
+
+  ####
+  # adjustForDevice
+  #
+  # Calculates x & y sticky component values based on the positioning
+  # method used for the particular device. 
+  #
+  # On desktop we can safely use the more efficient fixed positioning. 
+  # But for mobile, we use absolute positioning because mobile devices 
+  # have terrible support for fixed positioning. 
+  adjustForDevice : (y, v) ->
+    if browser.is_mobile
+      # When absolutely positioning, the reference is with respect to the closest
+      # parent that has been positioned. Because sticky.y is with respect to the 
+      # document, we need to adjust for the parent offset.   
+      y -= v.$el.parent().offsetParent().offset().top 
+      x = 0
+    else
+      # Fixed positioning is relative to the viewport, not the document
+      y -= scroller.viewport_top 
+
+      # Adjust for horizontal scroll for fixed position elements because they don't 
+      # move with the rest of the content (they're fixed to the viewport). 
+      # ScrollLeft is used to offset the fixed element to simulate sticking to the window.
+      x = -$(window).scrollLeft()
+
+    [x,y]
+
 
   ########
   # toggleStuck


    sticky = fetch @key
    if sticky.stuck

      [x, y] = [0, sticky.y]

      if browser.is_mobile
        positioning_method = 'absolute'
        # When absolutely positioning, the reference is with respect to the closest
        # parent that has been positioned. Because sticky.y is with respect to the 
        # document, we need to adjust for the parent offset.   
        y -= $(@getDOMNode()).offsetParent().offset().top 
      else
        positioning_method = 'fixed'

        # Fixed positioning is relative to the viewport, not the document
        y -= scroller.viewport_top 

        # Adjust for horizontal scroll for fixed position elements because they don't 
        # move with the rest of the content (they're fixed to the viewport). 
        # ScrollLeft is used to offset the fixed element to simulate sticking to the window.
        x -= $(window).scrollLeft()

      style = 
        top: 0


      if sticky.y?
        # BOUNDED BY SCROLL DISTANCE
        console.log "\tBOUNDED BY SCROLL DISTANCE: |#{k} - #{scroller.last_positions[k]}| <= |#{scroller.viewport_top} - #{scroller.last_viewport_top}|, strong" if debug
        solver.addConstraint new c.Inequality \
          y_pos[k], \
          c.LEQ,
          scroller.last_positions[k] + scroll_distance, \
          c.Strength.strong

        solver.addConstraint new c.Inequality \
          y_pos[k], \
          c.GEQ,
          scroller.last_positions[k] - scroll_distance, \
          c.Strength.strong

      # CLOSE TO TOP
