diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 0a58d9e48957fd2f4dd70c0504fe2ad1970e0821..590b2a3b241435794f1a7f6da2aef2a26520c34e 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -1912,7 +1912,9 @@ var FieldBinaryImage = AbstractFieldBinary.extend({
                     attach: '.o_content',
                     attachToTarget: true,
                     onShow: function () {
-                        if(this.$zoom.height() < 256 && this.$zoom.width() < 256) {
+                        var zoomHeight = Math.ceil(this.$zoom.height());
+                        var zoomWidth = Math.ceil(this.$zoom.width());
+                        if( zoomHeight < 128 && zoomWidth < 128) {
                             this.hide();
                         }
                         core.bus.on('keydown', this, this.hide);
diff --git a/addons/web/static/src/js/libs/zoomodoo.js b/addons/web/static/src/js/libs/zoomodoo.js
index a372c1686dc50f3378c1057059b90560d30e5195..07da384c298d7d9d0196f39a563f674d744a7d3d 100644
--- a/addons/web/static/src/js/libs/zoomodoo.js
+++ b/addons/web/static/src/js/libs/zoomodoo.js
@@ -84,8 +84,8 @@ ZoomOdoo.prototype._init = function () {
         this.$flyout = $('<div class="zoomodoo-flyout" />');
 
         var $attach = this.$target;
-        if (this.opts.attach !== undefined && this.$target.parents(this.opts.attach).length) {
-            $attach = this.$target.parents(this.opts.attach);
+        if (this.opts.attach !== undefined && this.$target.closest(this.opts.attach).length) {
+            $attach = this.$target.closest(this.opts.attach);
         }
         $attach.parent().on('mousemove.zoomodoo touchmove.zoomodoo', $.proxy(this._onMove, this));
         $attach.parent().on('mouseleave.zoomodoo touchend.zoomodoo', $.proxy(this._onLeave, this));
@@ -120,8 +120,8 @@ ZoomOdoo.prototype.show = function (e, testMouseOver) {
     }
 
     var $attach = this.$target;
-    if (this.opts.attach !== undefined && this.$target.parents(this.opts.attach).length) {
-        $attach = this.$target.parents(this.opts.attach);
+    if (this.opts.attach !== undefined && this.$target.closest(this.opts.attach).length) {
+        $attach = this.$target.closest(this.opts.attach);
     }
 
     // Prevents having multiple zoom flyouts
@@ -132,6 +132,19 @@ ZoomOdoo.prototype.show = function (e, testMouseOver) {
     if (this.opts.attachToTarget) {
         this.opts.beforeAttach.call(this);
 
+        // Be sure that the flyout is at top 0, left 0 to ensure correct computation
+        // e.g. employees kanban on dashboard
+        this.$flyout.css('position', 'fixed');
+        var flyoutOffset = this.$flyout.offset();
+        if (flyoutOffset.left > 0) {
+            var flyoutLeft = parseFloat(this.$flyout.css('left').replace('px',''));
+            this.$flyout.css('left', flyoutLeft - flyoutOffset.left + 'px');
+        }
+        if (flyoutOffset.top > 0) {
+            var flyoutTop = parseFloat(this.$flyout.css('top').replace('px',''));
+            this.$flyout.css('top', flyoutTop - flyoutOffset.top + 'px');
+        }
+
         if(this.$zoom.height() < this.$flyout.height()) {
              this.$flyout.css('height', this.$zoom.height() + 'px');
         }
@@ -296,7 +309,7 @@ ZoomOdoo.prototype._move = function (e) {
     var xl = Math.ceil(pl * rw);
 
     // Close if outside
-    if (xl < 0 || xt < 0 || xl > dw || xt > dh || lx > (offset.left + this.$target.outerWidth())) {
+    if (!this.opts.attachToTarget && (xl < 0 || xt < 0 || xl > dw || xt > dh || lx > (offset.left + this.$target.outerWidth()))) {
         this.hide();
     } else {
         var top = xt * -1;