diff --git a/reviewboard/htdocs/media/rb/css/common.css b/reviewboard/htdocs/media/rb/css/common.css
--- a/reviewboard/htdocs/media/rb/css/common.css
+++ b/reviewboard/htdocs/media/rb/css/common.css
@@ -76,6 +76,15 @@ ul.errorlist li {
   margin-left: 10px;
 }
 
+.offscreen-top {
+   position:fixed;
+   top:0;
+}
+
+.offscreen-bottom {
+   position:fixed;
+   bottom:0;
+}
 
 /****************************************************************************
  * Box classes
diff --git a/reviewboard/htdocs/media/rb/js/common.js b/reviewboard/htdocs/media/rb/js/common.js
--- a/reviewboard/htdocs/media/rb/js/common.js
+++ b/reviewboard/htdocs/media/rb/js/common.js
@@ -260,4 +260,52 @@ $(document).ready(function() {
     );
 });
 
+function update_floater(el) {
+    var container = el.closest('.float-element-container');
+    var container_top = container.offset().top;
+    var window_top = $(window).scrollTop();
+    var top = el.closest('.float-element-location').offset().top - window_top;
+    if (container.length == 0 ||
+        (container_top < window_top &&
+            window_top < (container_top +
+                container.outerHeight() - el.outerHeight()))) {
+        // Above the window frame
+        if (top < 0) {
+            el.addClass("offscreen-top");
+            el.removeClass("offscreen-bottom");
+        }
+        // Below the window frame
+        else if (top > $(window).height() - el.outerHeight()) {
+            el.addClass("offscreen-bottom");
+            el.removeClass("offscreen-top");
+        }
+        // In the window frame
+        else {
+            el.removeClass("offscreen-top");
+            el.removeClass("offscreen-bottom");
+        }
+    }
+    else {
+        el.removeClass("offscreen-top");
+        el.removeClass("offscreen-bottom");
+    }
+}
+
+$(document).ready(function() {
+    $('.float-element').each(function() {
+        $(this).wrap('<div class="float-element-location" style="height:' +
+            $(this).outerHeight() + 'px;width:' +
+            $(this).outerWidth() + 'px;z-index:999;" />')
+        .wrap('<div class="float-element-wrapper" style="height:' +
+            $(this).outerHeight() + 'px;width:' +
+            $(this).outerWidth() + 'px;z-index:999;" />');
+        update_floater($(this));
+    });
+    $(window).scroll(function() {
+        $('.float-element-wrapper').each(function() {
+            update_floater($(this));
+        });
+    });
+});
+
 // vim: set et:sw=4:
diff --git a/reviewboard/htdocs/media/rb/js/reviews.js b/reviewboard/htdocs/media/rb/js/reviews.js
--- a/reviewboard/htdocs/media/rb/js/reviews.js
+++ b/reviewboard/htdocs/media/rb/js/reviews.js
@@ -471,6 +471,7 @@ $.fn.commentSection = function(review_id, context_id, context_type) {
         if (bannersEl.children().length == 0) {
             bannersEl.append($("<div/>")
                 .addClass("banner")
+                .addClass("float-element")
                 .append("<h1>This reply is a draft</h1>")
                 .append(" Be sure to publish when finished.")
                 .append($('<input type="button"/>')
diff --git a/reviewboard/templates/reviews/review_detail.html b/reviewboard/templates/reviews/review_detail.html
--- a/reviewboard/templates/reviews/review_detail.html
+++ b/reviewboard/templates/reviews/review_detail.html
@@ -66,7 +66,7 @@
 {% for entry in entries %}
 {%  if entry.review %}
 <a name="review{{entry.review.id}}"></a>
-<div id="review{{entry.review.id}}">
+<div id="review{{entry.review.id}}" class="float-element-container">
 {%   if forloop.last %}
 <a name="last-review"></a>
 {%   endif %}
