kingdido999 / zooming

🔍 Image zoom that makes sense.
https://kingdido999.github.io/zooming
MIT License
1.61k stars 121 forks source link

Images are not zoomed in the center of the viewport when document is displayed within an iframe #312

Open PiiXiieeS opened 4 years ago

PiiXiieeS commented 4 years ago

Images are not zoomed in the center of the viewport When zooming is used in a site embedded as an iframe the zooming effect while works it is not positioned in the center of the visible part of the window.

To Reproduce Simple embed a page as an iframe resizing the frameHeight to be equal to the full size of the child content.

    <iframe
      id="cpv-iframe"
      class="myframe"
      width="100%"
      height="1000px"
      :src="url"
      @load="load('cpv-iframe')"
    >
    </iframe>

with load ...

    load(id) {
      window.onmessage = (e) => {
        if (Object.prototype.hasOwnProperty.call(e.data, 'frameHeight')) {
          document.getElementById(id).style.height = `${
            e.data.frameHeight + 30
          }px`
        }
      }
    },

Expected behavior The image should zoom and center in the visible part of the document within the iframe. The function getWindowCenter is not retrieving the center of the window but the center of the full document/iframe.

Additional context Any help or direction to implement this fix so the zoom effect works also inside an iframe is welcome and I will try to implement and to make a pull request.

kingdido999 commented 4 years ago

Would it be possible for you to reproduce this issue in codepen?

PiiXiieeS commented 4 years ago

Here you are: https://codepen.io/piixiiees/pen/abZOJzJ

kingdido999 commented 4 years ago

Thanks! I don't have much bandwidth to work on this, but feel free to give it a try.

You probably want to begin with understanding the Zooming.open() method, more specifically these method calls which basically translate & transform the target image and then inject the overlay element. We're currently calculating the transformation and inserting the overlay based on the element's document window, that's why we faced this issue. Therefore, we need to do those operations against the root window instead of the iframe window. I guess one key thing is to get the position of the image relative to the root window instead of the iframe window, which might not be very straightforward.

Anyway, that's my thoughts and if you still want to give it a shot, feel free to do so and let me know if you have any questions!