如何强制响应式 iframe 目标尊重 iframe 的视口并做出响应,就好像它被直接访问一样?

Posted

技术标签:

【中文标题】如何强制响应式 iframe 目标尊重 iframe 的视口并做出响应,就好像它被直接访问一样?【英文标题】:How to force responsive iframe target to respect viewport of iframe and behave responsively as if it were being accessed directly? 【发布时间】:2020-04-28 18:44:28 【问题描述】:

以下网站在直接访问时完全响应:

https://prosolutionplus.com/

但是,当通过 iframe 访问时,它的响应行为不正常并且不符合浏览器的宽度:

iframe 
         display: block;       /* iframes are inline by default */
         border: none;         /* Reset default border */
         height: 100vh;        /* Viewport-relative units */
         width: 100vw;         /* Viewport-relative units */
     

<div class="iframeContainer">
   <iframe src="https://prosolutionplus.com/">
   </iframe>
</div>

https://jsfiddle.net/g2eupd80/

我已经尝试了所有我能找到的 iframe 响应式解决方案(包括上面实际适用于其他响应式网站的解决方案),但 没有 在这个特定网站上有效。 我注意到,当通过 iframe 访问时,目标站点设置的宽度为 1093 像素,但它不会在直接访问时这样做,然后调整大小,所以这可能是为什么我尝试过的不同解决方案不起作用。换句话说,目标网站的行为不同取决于浏览器是直接访问还是通过 iframe 访问。

为此,目标网站在通过 iframe 访问时显然检测到的东西不同,而不是直接访问时,我只是不知道那是什么。

我该如何解决这个问题,以便 iframe 像浏览器一样被对待,以便目标网站在 iframe 中响应?

比较上面的 JSFiddle 示例,它在直接访问时响应,但在通过 iframe 访问时不响应,下面的示例在直接访问和通过 iframe 访问时都是响应的。 代码中唯一的区别是 URL。

iframe 
         display: block;       /* iframes are inline by default */
         border: none;         /* Reset default border */
         height: 100vh;        /* Viewport-relative units */
         width: 100vw;         /* Viewport-relative units */
     

<div class="iframeContainer">
   <iframe src="https://www.vigrxplus.com/">
   </iframe>
</div>

https://jsfiddle.net/phL2nt34/

【问题讨论】:

【参考方案1】:

这是prosolutionplus.com 上的CORS 问题。如果您在其自己的小标签中打开该网站,并关闭 JavaScript 关闭,您会注意到它设置了相同的 1093 像素,并且其行为与 iframe 时的行为相同。

如果您在 iframing prosolutionplus.com 时打开 javascript 控制台,您会注意到一个 CORS 错误弹出,说明:

frontend.min.js?ver=2.4.5.1:5 未捕获的 DOMException:阻止具有源“https://www.prosolutionplus.com”的框架访问跨域框架。`

看起来这个问题是由 Thrive 编辑器引起的。此外,这里有一个关于 Cross-Origin 的快速 SO 阅读以及它被阻止的原因:SecurityError: Blocked a frame with origin from accessing a cross-origin frame

【讨论】:

感谢您确定原因。我该如何解决这个问题? 您需要向 Thrive 开发人员提出这个问题。问题出在frontend.min.js 文件中,当未缩小时,它位于windowWidth 函数的第1113-1115 行。它试图引用并不总是在同一个域中的父窗口(您会注意到,如果您通过开发工具在 prosolutions 站点中 iframe 它确实工作:Example。)。或者,如果您管理站点,您可以自己编辑 JS 文件,但每次更新 Thrive 插件时它都会被覆盖。 如果您管理该站点,您实际上还可以dequeue 该脚本和enqueue 它的修改副本 - 这将防止更新问题 - 除非插件的其余部分得到更新并且需要在该文件中进行更新,因此最好联系 Thrive 开发人员,看看他们是否可以更新它以修改该函数以检查跨域帧。 我认为我不太可能让任何人最终真正解决这个问题,所以我最终解决这个问题的最佳方法是什么?尽可能响应式 iframe?我尝试使用 CSS 变换比例、负边距等,并且有点接近于让网站在 iframe 中看起来有点像样,但是在更改窗口宽度时它不是很一致。也许使用 Javascript 进行一些动态缩放以根据屏幕宽度修改缩放效果会更好。你提出什么解决方案和代码? 老实说,要可靠操作 iframed 内容,您无能为力。多年来,CORS 政策和浏览器安全更新使这变得越来越难。如果您使用的是 WordPress,我实际上编写了一个插件,旨在将登录页面以全屏格式嵌入您的网站,称为 Content Mask。 iframe 也有同样的问题,但如果你使用下载方法,它就可以工作。链接当然仍然默认链接到父站点。 Example

以上是关于如何强制响应式 iframe 目标尊重 iframe 的视口并做出响应,就好像它被直接访问一样?的主要内容,如果未能解决你的问题,请参考以下文章

如何将Google Form iframe嵌入具有灵活高度的html css(响应式)

Bootstrap 响应式 iframe 不调整大小

使用 jquery 没有删除响应式 iframe 的空白

为响应式设计缩放 iframe 仅 CSS

响应式 Iframe 高度跨域,无需控制源页面

可调整大小的响应式切换 iframe