iOS (iPad) 上的 iframe 内容裁剪问题

Posted

技术标签:

【中文标题】iOS (iPad) 上的 iframe 内容裁剪问题【英文标题】:iframe on iOS (iPad) content cropping issue 【发布时间】:2012-03-21 23:19:34 【问题描述】:

我正在寻找正确的方法来确保动态显示的内容在 ipad / ios5 上的 iframe 中滚动后可见。

哦,Iframes 和 iPad - 你真是个了不起的老栗子。我知道:

iPad 将 iframe 扩展到其中内容的完整高度(几乎就像它使用 html5 的“seamless”属性一样,但不完全是因为它不从父级继承样式或事件)。奇怪,令许多人烦恼,但确实如此。 <iframe height="100%"> 因此是无用的,因为它的大小取决于其内容而不是容器

我需要将我的 iframe 包装在一个 div 中 - 一个 la

<div id="wrapper" style="-webkit-overflow-scrolling:touch;overflow:auto;">
<iframe   src="about"blank"></iframe>
</div>

或者引入一些trickery来设置框架的滚动位置(我认为是基于this article中提到的技巧)

我的问题是在 iframe 主体内动态显示的内容(例如 jquery 选项卡、手风琴等)可能会导致浏览器在页面的显示范围内裁剪内容。

例如如果我的“选项卡”大部分位于 iframe 内的可见视口下方,并且我执行两指滚动(或实现单指 scrollTop hack),那么在该内容滚动到视图之后,它的一些内容是以前的未绘制仍然未绘制。再次单击第二个选项卡/返回会使内容看起来好像页面没有绘制屏幕外内容。在此之后,如果我随后向上滚动到页面顶部,则不会在页面开头绘制内容(之前是可见的)。用双指滚动页面向上和向下滚动几次可以解决问题。

我已经阅读了this article,上面说问题已得到解决。但它似乎并没有完全修复;并且仍然无法解决由于您必须将 iframe 包装在 div 中并在该 div 上放置滚动条的问题,桌面浏览器可能显示双滚动条,具体取决于它们如何解释 overflow:auto

附言我在 iframe 内部和外部都使用 HTML5 样板页面,并具有正确的元视口设置。

【问题讨论】:

你有没有找到任何解决方案?在我正在处理的平台上面临同样的问题...... 我发现尝试使用符合 XHTML1.1 的 标记而不是 试试这个:***.com/questions/10805301/… 基本上你根本不想滚动 iframe,而是在框架页面内滚动一个包装 div。 您可以在这里尝试解决方案***.com/a/18699378/768685 【参考方案1】:

我发现我还可以通过使文档与 iframe 内容一样高来解决该问题。 (正如Iframe Content Not Rendering Under Scroll In iOs5 iPad/iPhone 建议的那样)但在我的情况下,我不希望用户能够在现在高大的应用程序中向下滚动,因为它应该是一个全屏应用程序。我使用此代码来防止垂直滚动:

/*
Prevent Scrolling down.
 */
$(document).on("scroll",function()
    checkForScroll();
);

var checkForScroll = function(e)

    var iScroll = $(document).scrollTop();
    if (iScroll > 1)
        // Disable event binding during animation
        $(document).off("scroll");

        // Animate page back to top
        $("body,html").animate("scrollTop":"0",500,function()
            $(document).on("scroll",checkForScroll);
        );
    

我评估了很多选项并写了这篇博文,包括测试代码。 http://dev.magnolia-cms.com/blog/2012/05/strategies-for-the-iframe-on-the-ipad-problem/

希望这会有所帮助, 托弗

【讨论】:

在发布多个问题的复制和粘贴样板/逐字答案时要小心,这些往往会被社区标记为“垃圾邮件”。如果您这样做,则通常意味着问题是重复的,因此请标记它们。【参考方案2】:

我假设 iOS safari 在如何处理具有定义的宽度/高度的 iframe 方面存在错误。如果没有定义宽度/高度,它会尝试自动缩放它们以适应其内容,而无需任何滚动。

我发现的最佳解决方法是根本不滚动 iframe,而是滚动框架页面内的包装 div。

这是一个例子:

<iframe id="stupid-iframe"   src="a-file.html"></iframe>

a-file.html:

<html>
<body>
<div id="wrapper" style="width: 100%; height: 100%; overflow: auto; -webkit-overflow-scrolling: touch;">
...all my normal content...
</div>
</body>
</html>

【讨论】:

如果这是一个错误,它不仅仅是 Safari。我至少在 iPad 1 上的 Chrome 中发现了同样的东西。 @toon81 在 iPad 上,实际上是 iOS 设备,Apple 禁止第三方浏览器。所以,你看到的 Chrome 使用的是 iOS Safari 的 Webkit。 我很确定 Chrome 是第三方浏览器。 AppleGrew 是对的。 iOS 上的 Chrome 只允许作为 Webkit 的包装器。 ***.com/questions/11259152/…【参考方案3】:

这是一个非常繁琐的问题,尤其是在您必须使用动态缩放 iframe 的情况下,在我的例子中是 YouTube iframe API。您无法控制 iframe 的滚动属性。如果在 ios 模拟器/safari 调试窗口中修改 iframe 元素,它甚至不起作用。

我发现的最佳解决方案是使用负定位来删除多余的空白。 android 可能有不同的结果,因此您必须使用浏览器检测并以这种方式应用。

【讨论】:

以上是关于iOS (iPad) 上的 iframe 内容裁剪问题的主要内容,如果未能解决你的问题,请参考以下文章

iframe 内容未在 iOs5 iPad/iPhone 的滚动下呈现

iframe 中的 pdf 仅在 iphone/ipad 上的第一页

单击IOS上的按钮时,iframe不滚动

如何裁剪 iframe 的内容以显示页面的一部分?

如何裁剪Iframe的内容以显示页面的一部分?

在 iPad 上执行 playVideo() 命令后,YouTube iFrame API 处于缓冲状态