如何在移动野生动物园中正确显示iFrame

Mat*_*ond 54 css iframe mobile-safari

我正在尝试在我的移动网络应用程序中显示iframe,但是我无法将iframe的大小限制为iPhone屏幕的尺寸.iframe元素的高度和宽度属性似乎没有任何影响,奇怪的是.用div围绕它会设法限制它,但是我无法在iframe中滚动.

之前有没有人在移动游猎中解决过iframe?任何想法从哪里开始?

Cas*_*ase 20

是的,你不能用高度和宽度约束iframe本身.你应该在它周围放一个div.如果您控制iframe中的内容,则可以在iframe内容中放置一些JS,以便在收到触摸事件时告诉父级滚动div.

像这样:

JS:

setTimeout(function () {
var startY = 0;
var startX = 0;
var b = document.body;
b.addEventListener('touchstart', function (event) {
    parent.window.scrollTo(0, 1);
    startY = event.targetTouches[0].pageY;
    startX = event.targetTouches[0].pageX;
});
b.addEventListener('touchmove', function (event) {
    event.preventDefault();
    var posy = event.targetTouches[0].pageY;
    var h = parent.document.getElementById("scroller");
    var sty = h.scrollTop;

    var posx = event.targetTouches[0].pageX;
    var stx = h.scrollLeft;
    h.scrollTop = sty - (posy - startY);
    h.scrollLeft = stx - (posx - startX);
    startY = posy;
    startX = posx;
});
}, 1000);
Run Code Online (Sandbox Code Playgroud)

HTML:

<div id="scroller" style="height: 400px; width: 100%; overflow: auto;">
<iframe height="100%" id="iframe" scrolling="no" width="100%" id="iframe" src="url" />
</div>
Run Code Online (Sandbox Code Playgroud)

如果你不控制iframe内容,你可以以类似的方式在iframe上使用叠加,但是除了滚动之外你不能与iframe内容交互 - 所以你不能,例如,点击iframe中的链接.

过去,您可以使用两根手指在iframe中滚动,但这不再适用.

更新:iOS 6为我们打破了这个解决方案.我一直试图为它获得一个新的修复,但还没有任何工作.此外,由于他们引入了远程Web检查器,因此无法再在设备上调试javascript,这需要使用Mac.

  • 上面的例子对我有用,但滚动抖动就像疯了一样,因为你正在使用event.pageX和pageY,其中包括滚动信息(然后你会改变,这会引起震动).切换到使用event.screenX和screenY为我生成平滑滚动. (4认同)

Tma*_*mac 11

如果iFrame内容不是您的,那么下面的解决方案将无效.

使用Android,你需要做的就是用DIV包围iframe并将div的高度设置为document.documentElement.clientHeight.然而,IOS是一种不同的动物.虽然我还没有尝试过Sharon的解决方案,但它看起来确实是一个很好的解决方案.我确实找到了一个更简单的解决方案,但它只适用于IOS 5. +.

使用DIV环绕iframe元素(让我们称之为滚动条),设置DIV的高度并确保新DIV具有以下样式:

$('#scroller').css({'overflow' : 'auto', '-webkit-overflow-scrolling' : 'touch'});
Run Code Online (Sandbox Code Playgroud)

仅此一项就可以了,但您会注意到在大多数实现中,iframe中的内容在滚动时变为空白,并且基本上变得无用.据我所知,这种行为早在iOS 5.0就被报告为Apple的一个漏洞.要解决这个问题,找到iframe中的body元素并添加-webkit-transform','translate3d(0,0,0),如下所示:

$('#contentIframe').contents().find('body').css('-webkit-transform', 'translate3d(0, 0, 0)');
Run Code Online (Sandbox Code Playgroud)

如果您的应用程序或iframe在内存使用方面很重,那么您可能需要使用Sharon的解决方案.


Ker*_*mes 11

这仅在您控制外部页面和iframe页面时才有效.

在外部页面上,使iframe不可滚动.

<iframe src="" height=200 scrolling=no></iframe>
Run Code Online (Sandbox Code Playgroud)

在iframe页面上,添加此项.

<!doctype html>
...
<style>
html, body {height:100%; overflow:hidden}
body {overflow:auto; -webkit-overflow-scrolling:touch}
</style>
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为现代浏览器用于html确定高度,因此我们只需给它一个固定的高度并将其body转换为可滚动的节点.

  • 我爱你,你想嫁给我吗? (3认同)
  • 这有效!非常感谢你. (2认同)