在 Safari、Firefox 和 Edge VS Chrome 上带有(溢出-y)滚动的 flexbox 的不同行为

Posted

技术标签:

【中文标题】在 Safari、Firefox 和 Edge VS Chrome 上带有(溢出-y)滚动的 flexbox 的不同行为【英文标题】:Different behavior of flexbox with (overflow-y) scroll on Safari, Firefox and Edge VS Chrome 【发布时间】:2017-08-27 18:42:41 【问题描述】:

在 plunker (https://plnkr.co/edit/gMbgxvUqHNDsQVe4P7ny?p=preview) 的这个页面中,有一个奇怪的问题。

在 Windows 和 android 上的 Chrome(也包括 Canary)上,一切正常。我可以滚动两个区域(左侧和右侧),页面的顶部和底部 div 位于设备屏幕的顶部和底部。我随时都能看到它们(见下图)。

在 iPad 或 iPhone、ios、Safari 或 Chrome 上,这不是我得到的。也适用于 Windows 上的 Firefox 47.0.1。

页面很长,右边只有一个滚动条,就像页面上没有flexbox一样,这段代码就被忽略了:

.bigone 
  display: flex;
  min-height: 100vh;
  flex-direction: column;


.main 
    flex: 1 1 0;
    display: flex;

.container-fluid 
  display: flex;

.col-6 
  overflow-y: auto;

怪诞例子:

您只需点击此按钮即可在 iPad 或 iPhone 上查看:

为什么会有这种行为? Safari 和 Firefox 的错误还是 Chrome 的错误? 为什么在 Chrome 上一切在 Windows 和 Android 上都很好? 如果将来在新的 Safari 中这将运行良好,那么如何处理带有旧 iOS 和 firefox 的旧设备?

我将不胜感激。谢谢。

【问题讨论】:

也许事情已经改变了,但到目前为止,对于 Windows 上的 Chrome,我看到了与您在其他平台上看到的相同的问题,我不知道如何使滚动弹性框嵌套在里面引导列的数量,因为一旦你想要列,你就会打破列方向弹性框的“链”,直到顶部的全视口大小容器。如果现在有人能够做到这一点,那就太酷了! 【参考方案1】:

这是一个既令人沮丧又神秘的问题。

这类问题的问题根源通常是minimum sizing algorithm on flex items。这些规则是规范的一部分,可防止弹性项目缩小到超过其内容的大小。这种行为会阻止滚动条呈现,因为内容不能溢出弹性项目。它只是扩展它。

但在这种情况下,覆盖该行为的标准方法(例如,min-height: 0overflow: hidden)似乎都不起作用。

这里有两个建议可能会让您更接近解决方案:

(1) 由于您希望整个布局出现在视口中(即浏览器窗口上没有垂直滚动条),因此不要使用min-height 来调整容器的大小。这允许容器扩展。请改用固定高度。

对您的代码进行此调整:

.bigone     
    display: flex;
    /* min-height: 100vh;   <-- REMOVE */
    height: 100vh;       /* <-- NEW   */
    flex-direction: column;

但这本身并不能解决问题。

(2) 一个简单快速的解决方法是在.col-6上设置一个高度。

将此添加到您的代码中:

.col-6 
    height: 90vh;
 

因此,Edge、FF 和其他“非工作”浏览器似乎需要在该容器上定义一个高度。

revised demo

【讨论】:

我试过这个解决方案(高度:90vh),它可以工作,但我在页面中有动态页脚和页眉,尤其是在所有设备(iPhone、iPad、Android...)上。我不相信这在 2017 年是可能的! :( :( 尝试改变 html 的结构。也许使用更少的容器。 github 上的一个非常好的人建议这样做:github.com/twbs/bootstrap/issues/22339#issuecomment-291356383: (1) 将 min-height:0 添加到 .main 元素 (2) 将 flex-wrap 重置为其初始值 (nowrap) on .row 元素。你怎么看?它不适用于 iOS 上的 Safari,仅适用于 Windows 上的 Chrome 和 Firefox。 +1 以获得非常好的书面答案。我自己之前遇到过这个问题,解决方案是确保伸缩容器内有内容以赋予其块高度,或者在容器上设置实际高度。 @JohnSam 如果我可以大胆地建议查看caniuse - 特别是查看页面底部的已知问题 部分。您似乎也有一个非常具体的布局问题,可能想考虑从不同的角度解决它?你考虑过使用 jQuery 吗?【参考方案2】:

Michael_B 的回答是不够的。 90vh 不适用于动态页眉、页脚和其他 div。

我用这个在父 div 上修复了这个(暂时,直到 Safari 修复这个):

min-height: 100vh; height: 100vh;

flex: 1; min-height: 0;' 第一个孩子。

但是气味很重。

【讨论】:

【参考方案3】:

试试:

margin: auto;

在 flex-item 的 css 中 - 这对我有用(似乎 auto 在这里发挥了魔力......)

想分享这个发现,因为 min-heightoverflow-x 等……对我来说也不是很可靠。

【讨论】:

以上是关于在 Safari、Firefox 和 Edge VS Chrome 上带有(溢出-y)滚动的 flexbox 的不同行为的主要内容,如果未能解决你的问题,请参考以下文章

在 Safari、Firefox 和 Edge VS Chrome 上带有(溢出-y)滚动的 flexbox 的不同行为

SimpleSAMLphp - SSO Azure 适用于 Firefox 和 Safari,但不适用于 Chrome 和 Edge

我的代码适用于 Firefox、Safari 和 MS Edge,但不适用于 Chrome

Firefox 和 safari 浏览器中 jqx 网格的渲染问题

重磅消息!Firefox,Chrome,Edge和Safari全面禁用TLS 1.0和TLS 1.1

移动设备上的 Safari - 计算样式与给定不同