iOS 移动设备:在可滚动父级内的 iFrame 中滚动

Posted

技术标签:

【中文标题】iOS 移动设备:在可滚动父级内的 iFrame 中滚动【英文标题】:iOS mobile: scrolling in iFrame within scroll-able parent 【发布时间】:2017-11-09 10:44:48 【问题描述】:

我在移动 ios Safari 中遇到问题,在 iFrame 本身内部拖动时,无法在包含 iFrame 的 div 中滚动:

#outside
height: 400px;
width: 200px;
background: blue;
overflow: scroll;


.space
  height: 200px;
  width: 200px;
  background: red;


iframe
height: 1000px;
width: 200px;
background-color: green;
The green section is the iFrame.... Scrolling on the green section in iOS mobile is the issue

<div id="outside">
<div class="space"></div>
<iframe>

</iframe>
<div class="space"></div>
</div>

所以,在 iFrame 上拖动时,由于它没有滚动,它应该滚动父级,而是滚动整个页面。

此错误的任何已知解决方法?它已经在 android 上运行。

【问题讨论】:

小提琴链接:jsfiddle.net/hpo2dg6d/1 pointer-events: none; 添加到 iFrame 元素可以解决问题,但这不是一个选项,因为 iFrame 包含需要正常工作的链接。 :P 这是 Chris Coyier 最近发表的一篇我觉得很有趣的文章:blog.codepen.io/2017/12/01/stupid-iframes-stupid-ios 【参考方案1】:

将您的&lt;iframe&gt;s 放入带有-webkit-overflow-scrolling: touch; 的包装器中

.iContainer 
  -webkit-overflow-scrolling: touch;

#outside 
  height: 400px;
  width: 200px;
  background: blue;
  overflow: scroll;


.space 
  height: 200px;
  width: 200px;
  background: red;


iframe 
  height: 1000px;
  width: 200px;
  background-color: green;
  border: none;
  display:block;


iContainer 
  -webkit-overflow-scrolling: touch;
The green section is the iFrame.... Scrolling on the green section in iOS mobile is the issue

<div id="outside">
  <div class="space"></div>
  <div class="iContainer">
    <iframe>
    </iframe>
  </div>
  <div class="space"></div>
</div>

特别说明:&lt;body&gt; 上将此与position:relative 结合使用会导致IoS 设备有时会阻止滚动。让它完全从它的“反弹”中恢复可以修复它,但它仍然感觉错误和错误。 所以请确保您的&lt;body&gt;&lt;html&gt; 上没有任何设置position。最近花了我一些时间来调试这个。

【讨论】:

谢谢!我离解决问题越来越近了。我会接受您的回答,因为它完全回答了原始问题。但是,我没有提到包含的 div 实际上是 Bootstrap Modal,这似乎增加了进一步的复杂性:jsfiddle.net/hpo2dg6d/7 据此线程中的几个人说:github.com/twbs/bootstrap/issues/14839 添加-webkit-overflow-scrolling: touch 与引导模式不兼容:( 我认为未来十年你将无法在所有设备上滚动包含&lt;iframe&gt; 的模式。我们可能已经走过月球,但人类能做的事情是有限度的。以上就是其中之一。它归结为所有尊重网络标准的浏览器。这不会很快发生,恕我直言。 lol - 实际上,它目前适用于移动 iOS 浏览器之外的所有浏览器。在 iOS 移动设备上,如果我在容器上有 -webkit-overflow-scrolling: auto;,在 iFrame 上有 pointer-events: none;,它就可以工作,但是这个解决方案对我不起作用,因为 iFrame 包含的可变内容通常具有需要工作的链接。 :P 我会继续寻找可能的解决方案。您的回答帮助我了解了 iOS 移动浏览器的一些古怪行为。

以上是关于iOS 移动设备:在可滚动父级内的 iFrame 中滚动的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebug,我可以看到父级内的 HTML<Div> 部分,当我使用 Selenium 获取基于 html 源的 <div id> 时,我看不到子级

转让iframe在iOS设备手机浏览器上支持滚动

解决:iphone iframe内的页面不能滑动问题

flex容器内的居中元素正在增长并溢出顶部[重复]

flex容器内的居中元素正在增长并溢出顶部[重复]

与 iframe 交互时保持父级滚动