以下是我用来实现上述布局的代码:

.header { height: 50px; } .body { position: absolute; top: 50px; right: 0; bottom: 0; left: 0; display: flex; } .sidebar { width: 140px; } .main { flex: 1; display: flex; flex-direction: column; } .content { flex: 1; display: flex; } .column { padding: 20px; border-right: 1px solid #999; } <div class="header">Main header</div> <div class="body"> <div class="sidebar">Sidebar</div> <div class="main"> <div class="page-header">Page Header. Content columns are below.</div> <div class="content"> <div class="column">Column 1</div> <div class="column">Column 1</div> <div class="column">Column 1</div> </div> </div> </div>

我省略了用于样式化的代码。你可以在笔里看到所有这些。


上述方法是有效的,但是当内容区域的内容溢出时,会导致整个页面滚动。我只想让内容区域本身滚动,所以我在内容div中添加了overflow: auto。

现在的问题是,列本身并没有超出它们的父高度,所以边界也在那里被切断了。

这支笔显示了滚动问题。

如何将内容区域设置为独立滚动,同时仍然让其子区域超出内容框的高度?


当前回答

添加:

align-items: flex-start;

到.content{}的规则。至少(在火狐和Chrome浏览器中),这在你的笔中为我解决了这个问题。

默认情况下,.content有align-items: stretch,这使得它的所有自动高度子项的大小与它自己的高度匹配,每个http://dev.w3.org/csswg/css-flexbox/#algo-stretch。相比之下,flex-start值让子程序计算它们自己的高度,并在起始边缘对齐(并溢出,并触发滚动条)。

其他回答

添加:

align-items: flex-start;

到.content{}的规则。至少(在火狐和Chrome浏览器中),这在你的笔中为我解决了这个问题。

默认情况下,.content有align-items: stretch,这使得它的所有自动高度子项的大小与它自己的高度匹配,每个http://dev.w3.org/csswg/css-flexbox/#algo-stretch。相比之下,flex-start值让子程序计算它们自己的高度,并在起始边缘对齐(并溢出,并触发滚动条)。

经过多次尝试和错误,我刚刚非常优雅地解决了这个问题。

看看我的博客文章:http://geon.github.io/programming/2016/02/24/flexbox-full-page-web-app-layout

基本上,要使一个flexbox单元格可滚动,你必须让它所有的父单元格overflow: hidden;,否则它会忽略你的溢出设置,而让父单元格变大。

我和Tab Atkins (flexbox规范的作者)谈过这个问题,这就是我们的想法:

HTML:

<div class="content">
    <div class="box">
        <div class="column">Column 1</div>
        <div class="column">Column 2</div>
        <div class="column">Column 3</div>
    </div>
</div>

CSS:

.content {
    flex: 1;
    display: flex;
    overflow: auto;
}

.box {
    display: flex;
    min-height: min-content; /* needs vendor prefixes */
}

这些是笔:

短柱被拉伸。 较长的列溢出和滚动。

这样做的原因是align-items:如果项目具有固有高度,则拉伸不会收缩它们,这是通过min-content实现的。

.list-wrap {
  width: 355px;
  height: 100%;
  position: relative;

  .list {
    position: absolute;
    top: 0;
    bottom: 0;
    overflow-y: auto;
    width: 100%;
  }
}

这个问题的解决方案是添加overflow: auto;到.content,使内容包装器可滚动。

此外,在Flexbox包装器和溢出可滚动内容时,也会出现类似这种情况。

解决方案是添加overflow: hidden(或auto);到围绕大内容的包装器的父类(使用overflow: auto;设置)。