为什么“flex-grow”在Chrome和Firefox / Edge中表现不同?

时间:2017-09-05 09:57:56

标签: html css css3 flexbox

我正在尝试创建一个网页,其中包含固定高度的“标题”div,然后是低于它的“内容”div。在该内容div中有几个不同的div,其中包含实际的页面内容。在实际项目中,所有这些元素的高度可能因不同的屏幕和用户而异,因为它们的内容主要由PHP生成。

很抱歉,如果这个解释不清楚,但以下内容展示了我到目前为止所获得的内容: https://codepen.io/anon/pen/ZJPgWm (代码格式不正确,有些值看起来有点奇怪,因为我只是模仿我的实际项目而快速将它们拼凑在一起)。

#main {
    width: 90%;
    min-width: 400px;
    max-width: 1200px;
    height: calc(100vh - 10px);
    margin-left: auto;
    margin-right: auto;
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

#head {
    background-color: blue;
    font-size: 3vh;
}

#content {
    background-color: red;
    flex-grow: 1;
    display: flex;
}

#left {
    width: calc(16% - 6px);
    float: left;
    background-color: green;
}

#inner {
    font-size: 10vh;
    flex-grow: 1;
    width: calc(84% - 6px);
    float: left;
    margin-left: 8px;
    margin-bottom: 10px;
    flex-grow: 1;
    overflow-x: hidden;
    overflow-y: auto;
    background-color: yellow;
}
<body>
  <div id="main">
    <div id="head">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </div>
    <div id="content">
      <div id="left">
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
      <div id="inner">
        <p>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        </p>
      </div
    </div>
  </div>
</body>

在chrome上,滚动条显示在#inner div中。这就是我要的。 在Firefox和MS Edge上,#inner div的溢出内容刚刚被切断,因此无法看到该内容(没有更高的屏幕)。 我应该注意到这一点的原因似乎是,在chrome中,#inner和#content divs的高度受到控制,使得它们的边界框不会超出#main div的边界。但是,在firefox中,它们的边界框延伸到页面底部以下(由开发人员工具显示)。

我正在寻找的是一种方法,它将使所有浏览器都提供当前由chrome提供的结果。理想情况下,解释哪个浏览器“正确”以及它们不同的原因也会有所帮助。

请注意,我希望尽可能避免使用JS。任何帮助或建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

Flex项目的min-height默认为auto,这意味着它不会缩小到其内容的大小以下,所以当你像这样嵌套它们时并将overflow: auto放在Flex项目的子项上,您需要让它知道它可以缩小。

min-height: 0;添加到您的content规则中,它们的行为相似。

&#13;
&#13;
#main {
  width: 90%;
  min-width: 935px;
    max-width: 1600px;
    height: calc(100vh - 90px);
    margin-left: auto;
    margin-right: auto;
    position: relative;
    overflow: hidden;
    display: flex;
    flex-direction: column;
}

#head {
  background-color: blue;
  font-size: 20px;
}

#content {
  background-color: red;
  flex-grow: 1;
  display: flex;
  min-height: 0;
}

#inner {
  font-size: 60px;
  flex-grow: 1;
  overflow-y: auto;
}
&#13;
<body>
  <header>
  </header>
  <div id="main">
    <div id="head">
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
      in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    </div>
    <div id="content">
      <div id="inner">
        <p>
          Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
          in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        </p>
      </div </div>
    </div>
</body>
&#13;
&#13;
&#13;