Index: /CKEditor/trunk/_source/core/dom/element.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/element.js	(revision 3336)
+++ /CKEditor/trunk/_source/core/dom/element.js	(revision 3337)
@@ -1115,4 +1115,11 @@
 				if ( !CKEDITOR.env.opera )
 				{
+					// Opera includes clientTop|Left into offsetTop|Left.
+					if ( !current.equals( this ) )
+					{
+						x += ( current.$.clientLeft || 0 );
+						y += ( current.$.clientTop || 0 );
+					}
+
 					var scrollElement = previous;
 					while ( scrollElement && !scrollElement.equals( current ) )
@@ -1142,4 +1149,6 @@
 			}
 
+			var body = this.getDocument().getBody();
+
 			// document.body is a special case when it comes to offsetTop and offsetLeft
 			// values.
@@ -1147,8 +1156,16 @@
 			// 2. It matters when we're in IE and the element has no positioned ancestor.
 			// Otherwise the values should be ignored.
-			if ( this.getComputedStyle( 'position' ) != 'static' || ( CKEDITOR.env.ie && !this.getPositionedAncestor() ) )
-			{
-				x += this.getDocument().getBody().$.offsetLeft;
-				y += this.getDocument().getBody().$.offsetTop;
+			if ( body.getComputedStyle( 'position' ) != 'static' || ( CKEDITOR.env.ie && !this.getPositionedAncestor() ) )
+			{
+				x += body.$.offsetLeft + ( body.$.clientLeft || 0 );
+				y += body.$.offsetTop + ( body.$.clientTop || 0 );
+			}
+
+			// In Firefox, we'll endup one pixel before the element positions,
+			// so we must add it here.
+			if ( CKEDITOR.env.gecko && !CKEDITOR.env.quirks )
+			{
+				x += this.$.clientLeft ? 1 : 0;
+				y += this.$.clientTop ? 1 : 0;;
 			}
 
