如何让 IFrame 在 iOS Safari 中响应?

新手上路,请多包涵

问题是,当您必须使用 IFrame 将内容插入网站时,在现代网络世界中,人们期望 IFrame 也能响应。理论上它很简单,只需帮助使用 <iframe width="100%"></iframe> 或将 CSS 宽度设置为 iframe { width: 100%; } 然而在实践中它并不是那么简单,但它可以。

如果 iframe 内容完全响应并且可以在没有内部滚动条的情况下自行调整大小,那么 iOS Safari 将调整 iframe 的大小而没有任何实际问题。

如果您考虑以下代码:

 <html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Iframe Isolation Test</title>

    <style type="text/css" rel="stylesheet">

        #Main {
            padding: 10px;
        }
    </style>
</head>
<body>
    <h1>Iframe Isolation Test 13.17</h1>
    <div id="Main">
        <iframe height="950" width="100%" src="Content.html"></iframe>
    </div>
</body>
</html>

使用 Content.html

 <html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=9,10,11" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Iframe Isolation Test - Content</title>

    <style type="text/css" rel="stylesheet">

        #Main {
            width: 100%;
            background: #ccc;
        }

    </style>
</head>
<body>
    <div id="Main">
        <div id="ScrolledArea">
            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc malesuada purus quis commodo convallis. Fusce consectetur mauris eget purus tristique blandit. Nam nec volutpat augue. Aliquam sit amet augue vitae orci fermentum tempor sit amet gravida augue. Pellentesque convallis velit eu malesuada malesuada. Aliquam erat volutpat. Nam sollicitudin nulla nec neque viverra, non suscipit purus tincidunt. Aenean blandit nisi felis, sit amet ornare mi vestibulum ac. Praesent ultrices varius arcu quis fringilla. In vitae dui consequat, rutrum sapien ut, aliquam metus. Proin sit amet porta velit, suscipit dignissim arcu. Cras bibendum tellus eu facilisis sodales. Vestibulum posuere, magna ut iaculis consequat, tortor erat vulputate diam, ut pharetra sapien massa ut magna. Donec massa purus, pharetra sed pellentesque nec, posuere ut velit. Nam venenatis feugiat odio quis tristique.
        </div>
    </div>
</body>
</html>

然后这在 iOS 7.1 Safari 中没有问题。您可以毫无问题地在横向和纵向之间切换。

在此处输入图像描述在此处输入图像描述

但是,只需通过添加以下内容来更改 Content.html CSS:

     #ScrolledArea {
        width: 100%;
        overflow: scroll;
        white-space: nowrap;
        background: #ff0000;
    }

你得到这个:

在此处输入图像描述在此处输入图像描述

如您所见,即使 Content.html 内容完全响应( div#ScrolledAreaoverflow: scroll 设置)并且 iframe 宽度为 100%,iframe 仍然占据 div#ScrolledArea 的整个宽度,就好像溢出甚至不存在。 演示

在这种情况下, iframe 内容是否有滚动区域,问题就变成了,当 iframe 内容有水平滚动区域时,如何获得 iframe 响应?这里的问题不在于 Content.html 没有响应,而在于 iOS Safari 只是调整 iframe 的大小,以便 div#ScrolledArea 完全可见。

原文由 Idra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 772
2 个回答

这个问题的解决方案其实很简单,有两种方法可以解决。如果您可以控制 Content.html ,则只需将 div#ScrolledArea 宽度 CSS 更改为:

 width: 1px;
min-width: 100%;
*width: 100%;


基本上这里的想法很简单,您将 width 设置为小于视口(在这种情况下为 iframe 宽度)的东西,然后用 min-width: 100% 覆盖它以允许实际 width: 100% iOS Safari 默认覆盖。 *width: 100%; 在那里,因此代码将保持 IE6 兼容,但如果您不关心 IE6,则可以省略它。 演示

在此处输入图像描述在此处输入图像描述

正如您现在看到的, div#ScrolledArea 宽度实际上是 100%,而 overflow: scroll; 可以做到这一点并隐藏溢出的内容。如果您有权访问 iframe 内容,那么这是更可取的。

但是,如果您无权访问 iframe 内容(无论出于何种原因),那么您实际上可以在 iframe 本身上使用相同的技术。只需在 iframe 上使用相同的 CSS:

 iframe {
    width: 1px;
    min-width: 100%;
    *width: 100%;
}

但是,这有一个限制,您需要在 iframe 上使用 scrolling="no" 关闭滚动条才能工作:

 <iframe height="950" width="100%" scrolling="no" src="Content.html"></iframe>

如果允许滚动条,那么这将不再适用于 iframe。也就是说,如果您改为修改 Content.html ,则可以在 iframe 中保留滚动。 演示

原文由 Idra 发布,翻译遵循 CC BY-SA 4.0 许可协议

问题似乎在于,如果 Mobile Safari 包含的文档比您指定的宽度宽,则它会拒绝遵守 iFrame 的宽度。例子:

http://jsbin.com/hapituto/1

在桌面浏览器上,您会看到 iFrame 和 Div 都设置为 300px。内容更宽,因此您可以滚动 iFrame。

但是,在移动版 Safari 中,您会注意到 iFrame 会自动扩展到内容的宽度。

我的猜测是,这是解决页面内滚动内容的长期问题的解决方法。过去,如果您在触摸设备上有一个大的滚动 iframe,您会“卡在”iframe 中,因为滚动的是 iframe 而不是页面本身。看来 Apple 已经决定 iFrame 的默认行为是“无滚动”并展开以防止它。

一种选择可能是此解决方法。不要假设 iFrame 会滚动,而是将 iframe 放在您可以控制的 DIV 中并让它滚动。

示例:http: //jsbin.com/zakedaja/1

示例标记:

 <div style="overflow: scroll; -webkit-overflow-scrolling: touch; width: 300px;">
   <iframe src="http://jsbin.com/roredora/1/" style="width: 600px;"></iframe>
</div>

在移动 safari 上,您现在可以通过包含它的 div 滚动现在完全展开的 iFrame 的内容。

问题:这在桌面浏览器上看起来真的很难看,因为现在你有双滚动条。所以你可能需要用 JS 做一些浏览器检测来解决这个问题。

原文由 DA. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题