Flexbox溢出-y滚动条显示在主体而不是Firefox / IE / Edge中的元素

时间:2017-08-07 16:27:38

标签: html css css3 flexbox bootstrap-4

问题:

在使用带溢出的flexbox的全尺寸应用布局(100%宽度,100%高度)中,滚动条不会在Firefox,IE或Edge中显示溢出y。它们可以在Chrome中正确显示。滚动条不是在元素上的FF / IE / Edge中使用垂直滚动条,而是应用于整个页面。

我尝试过的事情:

我已尝试添加,如其他几个SO答案所述,将min-height: 0;添加到flex元素/父级。我无法让这个解决方案起作用,但也许我做错了。

截图:

铬:

enter image description here

火狐:

enter image description here

示例:

https://codepen.io/gunn4r/pen/WEoPjN

html {
  height: 100%;
}

.flex-grow {
  flex: 1;
}

.canvas-wrapper {
  overflow: scroll;
}

.canvas {
  width: 3000px;
  height: 3000px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet" />

<body class="h-100">
  <div class="h-100 container-fluid d-flex flex-column">

    <div class="row bg-warning">
      <div class="col-12 py-4">Top Bar</div>
    </div>

    <div class="row no-gutter flex-grow">

      <div class="col-9 px-0 d-flex flex-column">
        <div class="canvas-wrapper">
          <div class="canvas bg-success">
            Canvas
          </div>
        </div>
        <div class="bg-danger py-3">
          Canvas Footer
        </div>
      </div>

      <div class="col-3 bg-primary">
        <div class="sidebar-item">Sidebar</div>
      </div>

    </div>

    <div class="row bg-warning">
      <div class="col-12 py-2">Overall Footer</div>
    </div>

  </div>
</body>

2 个答案:

答案 0 :(得分:8)

看起来问题源于代码的这一部分:

.canvas-wrapper {
    overflow: scroll;
}

您希望此元素具有滚动条。但是,元素没有定义的高度。

来自MDN

  

为了使overflow生效,块级容器   必须具有设定的高度(heightmax-height)或   white-space设置为nowrap

Chrome似乎并不关心身高要求。其他浏览器都可以。

这应该足以让它跨浏览器工作:

  .canvas-wrapper {
     overflow: scroll;
     flex: 1 0 1px;
}

html {
  height: 100%;
}

.flex-grow {
  flex: 1;
}

.canvas-wrapper {
  overflow: scroll;
  flex: 1 0 1px; /* NEW */
}

.canvas {
  width: 3000px;
  height: 3000px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet"/>
<body class="h-100">
  <div class="h-100 container-fluid d-flex flex-column">

    <div class="row bg-warning">
      <div class="col-12 py-4">Top Bar</div>
    </div>

    <div class="row no-gutter flex-grow">
      
      <div class="col-9 px-0 d-flex flex-column">
         <div class="canvas-wrapper">
             <div class="canvas bg-success">
               Canvas
           </div>
        </div>
        <div class="bg-danger py-3">
          Canvas Footer
        </div>
      </div>
      
      <div class="col-3 bg-primary">
        <div class="sidebar-item">Sidebar</div>
      </div>
      
    </div>

    <div class="row bg-warning">
      <div class="col-12 py-2">Overall Footer</div>
    </div>

    </div>
</body>

答案 1 :(得分:3)

当在元素上使用百分比作为高度时,它的所有后代也需要一个高度设置,如果所有都有百分之,则需要将它一直设置到html / body。

当与Flexbox结合使用时,解决这个问题会非常棘手,因为当需要在所有优势上设置height: 100%时,其他不需要的渲染问题可能会导致布局中断。

这是一个完美的跨浏览器解决方案,其中添加了canvas-fix的额外包装canvas,然后使用position: absolute我们可以使其工作。< / p>

Fiddle demo

Stack snippet

html {
  height: 100%;
}
.flex-grow {
  flex: 1;
}
.canvas-wrapper {
  flex-grow: 1;                     /*  take all remaining space  */
  width: 100%;                      /*  full width  */
  position: relative;               /*  for the absolute positioned fix  */
}
.canvas-fix {                       /*  added rule  */
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  overflow: scroll;
}
.canvas {
  width: 3000px;
  height: 3000px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet" />

<body class="h-100">
  <div class="h-100 container-fluid d-flex flex-column">

    <div class="row bg-warning">
      <div class="col-12 py-4">Top Bar</div>
    </div>

    <div class="row no-gutter flex-grow">

      <div class="col-9 px-0 d-flex flex-column">
        <div class="canvas-wrapper">
          <div class="canvas-fix">
            <div class="canvas bg-success">
               Canvas
            </div>
          </div>
        </div>
        <div class="bg-danger py-3">
          Canvas Footer
        </div>
      </div>

      <div class="col-3 bg-primary">
        <div class="sidebar-item">Sidebar</div>
      </div>

    </div>

    <div class="row bg-warning">
      <div class="col-12 py-2">Overall Footer</div>
    </div>

    </div>
</body>