如何让 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>

对于 网址: http://www.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>

然后这在 iOS7.1 Safari 中没有问题。你可以在横向和纵向之间切换没有任何问题。

enter image description here enter image description here

然而,只需要通过添加以下内容来改变 网址: http://www.Content.html CSS:

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

你听好了:

enter image description here enter image description here

正如你所看到的,即使 网址: http://www.Content.html内容是完全响应的(Div # ScrolledAreaoverflow: scroll设置) ,iframe 宽度是100% ,iframe 仍然采用 Div # ScrolledArea的全宽度,就好像溢出不存在一样。演示

在这种情况下,如果 iframe内容上有滚动区域,问题就变成了,当 iframe 内容有水平滚动区域时,如何让 iframe响应?这里的问题不在于 网址: http://www.Content.html没有响应,而在于 iOS Safari 只是调整了 iframe 的大小,这样 div#ScrolledArea就完全可见了。

212561 次浏览

解决这个问题的方法其实很简单,有两种方法。如果你能控制 网址: http://www.Content.html,那么只需改变 div#ScrolledArea的宽度 CSS 为:

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

基本上这里的想法很简单,你把 width设置成比 viewport (在这个例子中是 iframe 宽度)小的值,然后用 min-width: 100%覆盖它,以允许实际的 width: 100%被 iOS Safari 默认覆盖。*width: 100%;在那里,所以代码将保持 IE6兼容,但如果你不关心 IE6,你可以省略它。演示

enter image description here enter image description here

正如你现在看到的,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。也就是说,如果你修改了 网址: http://www.Content.html,那么你可以在 iframe 中保留滚动。演示

只有 CSS 解决方案

超文本标示语言

<div class="container">
<div class="h_iframe">
<iframe  src="//www.youtube.com/embed/9KunP3sZyI0" frameborder="0" allowfullscreen></iframe>
</div>
</div>

CSS

html,body {
height:100%;
}
.h_iframe iframe {
position:absolute;
top:0;
left:0;
width:100%;
height:100%;
}

演示

在 iframe 中使用 HTML 页面的另一个 演示在这里

问题似乎是,如果移动 Safari 包含的文档比你指定的宽,它将拒绝服从 iFrame 的宽度。例如:

Http://jsbin.com/hapituto/1

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

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

我的猜测是,这是一个解决长期存在的问题与滚动内容在一个页面。在过去,如果你在触摸设备上有一个大的滚动 iframe,你会被困在 iframe 中,因为它会滚动而不是页面本身。看起来苹果已经决定 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>

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

问题: 这在桌面浏览器上看起来很难看,因为现在你有了双滚动条。因此,您可能需要使用 JS 进行一些浏览器检测来绕过这个问题。

我需要一个跨浏览器的解决方案,要求是:

  • 需要同时在 iOS 和其他平台上工作
  • 不能访问 iFrame 中的内容
  • 需要它滚动!

基于我从 @ Idra学到的关于在 iOS 上滚动 = “ no”的知识,以及 这篇文章关于在 iOS 上将 iFrame 内容装配到屏幕上的知识,下面是我最终得出的结论。希望对某人有所帮助

超文本标示语言

<div id="url-wrapper"></div>

CSS

html, body{
height: 100%;
}


#url-wrapper{
margin-top: 51px;
height: 100%;
}


#url-wrapper iframe{
height: 100%;
width: 100%;
}


#url-wrapper.ios{
overflow-y: auto;
-webkit-overflow-scrolling:touch !important;
height: 100%;
}


#url-wrapper.ios iframe{
height: 100%;
min-width: 100%;
width: 100px;
*width: 100%;
}

JS

function create_iframe(url){


var wrapper = jQuery('#url-wrapper');


if(navigator.userAgent.match(/(iPod|iPhone|iPad)/)){
wrapper.addClass('ios');
var scrolling = 'no';
}else{
var scrolling = 'yes';
}


jQuery('<iframe>', {
src: url,
id:  'url',
frameborder: 0,
scrolling: scrolling
}).appendTo(wrapper);


}

在为 iframe 创建水平滚动条时,内容窗格的宽度出现了问题。事实证明,图像的宽度比预期的要宽。我可以通过设置所有的图像 css 最大宽度为百分之一来解决这个问题。

<meta name="viewport" content="width=device-width, initial-scale=1" />


img {
max-width: 100%;
height:auto;
}

所有这些解决方案的问题在于 iframe的高度从来没有真正改变过。

这意味着您无法使用 Javascript、 position:fixed;position:absolute;iframe内部居中显示元素,因为 iframe本身从不滚动。

我的解决方案是使用这个 CSS 将 iframe 的所有内容封装在一个 div中:

#wrap {
position: fixed;
top: 0;
right:0;
bottom:0;
left: 0;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}

通过这种方式,Safari 认为内容没有高度,可以正确地分配 iframe的高度。这还允许您以任何您希望的方式定位元素。

您可以在这里看到一个快速和肮脏的演示。

我正在使用 ionic2和系统配置如下-


******************************************************


Your system information:


Cordova CLI: 6.4.0
Ionic Framework Version: 2.0.0-beta.10
Ionic CLI Version: 2.1.8
Ionic App Lib Version: 2.1.4
ios-deploy version: Not installed
ios-sim version: 5.0.8
OS: OS X Yosemite
Node Version: v6.2.2
Xcode version: Xcode 7.2 Build version 7C68






******************************************************

对我来说,这个问题得到了解决,这个代码-
对于 html iframe 标签-

<div class="iframe_container">
<iframe class= "animated fadeInUp" id="iframe1" [src]='page' frameborder="0" >
<!--  <img src="img/video-icon.png"> -->
</iframe><br>
</div>

请参见与-相同的 css


.iframe_container {
overflow: auto;
position: relative;
-webkit-overflow-scrolling: touch;
height: 75%;
}


iframe {
position:relative;
top: 2%;
left: 5%;
border: 0 !important;
width: 90%;
}

在我的情况下,位置财产起着至关重要的作用。
职位: 亲属;

也许对你也有帮助! ! !

事实上,对我来说,只是在 ios 上工作,禁用卷轴

<iframe src="//www.youraddress.com/" scrolling="no"></iframe>

并通过脚本处理操作系统。

这个问题也出现在 iOS Chrome 上。

我浏览了以上所有的解决方案,大部分都很粗糙。

如果您不需要支持较老的浏览器,只需将 iframe 宽度设置为100vw;

iframe {
max-width: 100%; /* Limits width to 100% of container */
width: 100vw; /* Sets width to 100% of the viewport width while respecting the max-width above */
}

注意: 检查对 viewport 单元的支持 Https://caniuse.com/#feat=viewport-units

对我来说,CSS 解决方案不起作用,但是通过编程设置宽度就可以了。 在 iframe 加载时,以编程方式设置宽度:

 $('iframe').width('100%');