如何使IFrame在iOS Safari中做出响应?


134

问题是,当您不得不使用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的大小,从而使iframe div#ScrolledArea完全可见。


您可以与我们分享链接吗?您是说,如果其中的页面具有white-space: nowrap样式内容,iOS会将iFrame扩展到页面的整个宽度?
DA。

@DA我向问题和解决方案都添加了演示。不,white-space: nowrap本身不是问题。我只是用它来获得一个极宽的宽度div#ScrolledArea。当IFrame内容中具有水平滚动区域时,就会出现问题。如果是这种情况,iOS Safari只会忽略您的宽度设置,并显示孔内容并破坏网站的响应能力。
伊德拉2014年

嗯...我想知道这是否是一项“功能”。具有包含可滚动内容的可滚动区域(iFrame)会很尴尬。在触摸屏上进行交互非常困难。
DA。

@DA当然这是一个侄女案,您所说的可能是正确的(取决于实现方式,对我们有用),并且大多数站点没有水平滚动区域,但是当您这样做时……您甚至无法想象我花了多少时间 但这可能是一个问题,即使您隐藏的图像通过按钮或类似的东西隐藏并滚动了。
Idra 2014年

似乎有与此相关的问题:stackoverflow.com/questions/5267996/…它似乎确实是移动Safari的“功能” ...它正在尝试确保按用户的方式调整内容的大小仍然与之互动。我不确定如果您在滚动iframe中拥有滚动内容,该怎么办... Safari如何解释嵌套滚动元素中的滑动?
DA。

Answers:


289

实际上,此问题的解决方案非常简单,有两种解决方法。如果您可以控制Content.html,则只需将div#ScrolledAreaCSS 的宽度更改为:

        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%;
    }

但是,这样做有一个局限性,您需要关闭scrolling="no"iframe上的滚动条才能起作用:

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

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


1
像@NickGottlieb提到的,我不得不添加!importantwidth属性来获得一个iPhone 4的iframe响应,网页设计准备与iOS 7
malisokan

@ЮнгвиртТони解决方法不需要此方法,它可能width是先前设置的!important或优先级较高的CSS覆盖了它。在个别情况下,在iPhone 4 iOS7中是不需要的。
伊德拉2015年

我也不需要!重要。同样适用于iOS 8。干杯
山姆·波茨

我只需要在需要时才滚动=否,否则需要滚动=是。那么我应该检测什么?这是iOS问题吗?或Webkit问题?要么...?
gerbz 2015年

@ggwarpig,这是一个iOS问题,iOS Safari会自动将Seamless属性打开,并且您无法覆盖它。如果你有控制权的内容,那么你需要修改的内容,才能有scrolling="yes",否则就没有办法来纠正这一点,修复对IFRAME工作只是你需要有scrolling="no"对IFRAME
IDRA

24

看来,问题在于,如果Safari所包含的文档比您指定的宽度大,Mobile Safari将拒绝服从iFrame的宽度。例:

http://jsbin.com/hapituto/1

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

但是,在移动浏览器中,您会注意到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>

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

要点:在桌面浏览器上,这看起来非常丑陋,因为现在您有两个滚动条。因此,您可能必须使用JS做一些浏览器检测才能解决此问题。


1
我仍然认为这实际上不在问题范围内,因为您在此处显示的解决方案是如何在iOS Safari中伪造iframe滚动孔的标准方法,但是考虑到此iOS问题是有关iframe滚动的问题(内容或其他内容),那么在这里拥有它真是太好了。
伊德拉2014年

1
我想我不太了解您的问题。据我了解,您遇到的问题是,在iOS中,Mobile Safari试图阻止iFrame首先滚动并在其上强制设置宽度。我是不是误会了你的问题?
DA。

本质上就是问题所在,只是所需的解决方案有所不同。在最初的问题中,IFrame内容是响应式的,同时具有水平滚动的内容,因此问题不在于如何模拟iframe滚动,而是如何使iframe的宽度达到100%,即响应,而在水平方向滚动内容时却如此。该iframe。这就是上述方法在这种情况下不起作用的原因,因为设计的响应能力已被破坏,并且即使在通常设计不需要的地方,也需要滚动查看全部内容。
Idra 2014年

1
我很抱歉,我意识到我在其中一项评论中误导了您。iframe不滚动。正是这一点,iframe不应仅滚动其内容的一部分,即div#ScrolledArea在我的示例中为(绿色)。我只是看错了。但是,iframe不应仅基于容器元素调整自身大小,即具有width: 100%;
Idra 2014年

18

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

  • 需要同时在iOS和其他地方工作
  • 无权访问iFrame中的内容
  • 需要它滚动!

建立关我从了解到@Idra关于SCROLLING =“无”在iOS和这个职位有关的iFrame内容拟合在iOS上的屏幕这里是我结束了。希望它可以帮助某人=)

的HTML

<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);

}

1
被支持,但是...为什么IE6类别中的IE6规则?:-)
J. Bruni

12

所有这些解决方案的问题在于,iframe永不改变的高度。

这意味着您将无法在iframe使用Javascript position:fixed;或的内部居中放置元素,或者position:absolute;因为元素iframe本身永不滚动。

在这里详细介绍的解决方案是div使用以下CSS 将iframe的所有内容包装在内:

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

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

您可以在此处看到一个快速而肮脏的演示。


1
这是唯一对我有用的解决方案。当然,仅当您控制的内容时才可以使用它iframe,但就我而言,我可以。干杯!
文斯

嗯 您的示例在iOS上似乎没有响应?
布兰登·里德(BrandonReid)

这是我两年前写的。您可以在回购中提出问题吗?
码头

在iOS上使用Ionic / Cordova在此问题上浪费了数小时之后,这是唯一有效的方法。谢谢!
安德鲁(Andrew)

1
太棒了,这是唯一可行的方法,我花了1天的时间为您寻找类似@Pier的解决方案100pts
Carlos E

5

iOS Chrome也存在此问题。

我浏览了上面所有的解决方案,大多数都非常hacky。

如果您不需要旧版浏览器的支持,只需将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 */
}

注意:检查对视口单位的支持 https://caniuse.com/#feat=viewport-units


1
Chrome for iOS仅位于Safari之下。它使用WKWebView。iOS中不允许其他Web渲染引擎。
码头

3

我正在使用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%;
}

就我而言,职位财产在这里起着至关重要的作用。
位置:相对;

它也可能对您有帮助!!!


0

仅CSS解决方案

的HTML

<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页面的另一个演示


也许我没有正确实现您的解决方案,但是当我在孤立的测试用例中尝试该解决方案时,该解决方案在iOS Safari 7.1 iPhone 4中根本无法使用。
伊德拉2014年

好的,好像您误解了该问题一样,请检查此链接,确认它是集成的新演示iframe内容,而没有将任何其他CSS应用于iframe。而且,如果您在iOS Safari中查看它,它仍然会响应,这是因为此页面没有任何水平滚动,这会迫使iframe宽度大于视口。如问题所述,在类似这样的网站上,您无需执行任何操作即可使iframe响应。
伊德拉2014年

那么,您究竟希望它如何表现,请为您的给定链接提供示例?
4dgaurav

0

我在内容窗格上为iframe创建水平滚动条时出现宽度问题。事实证明,图像保持的宽度比预期的要宽。我可以通过将所有图像css max-width设置为百分比来解决此问题。

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

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

0

实际上,对我而言,我只是在ios中禁用了滚动功能

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

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


0

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

 $('iframe').width('100%');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.