Flexbox圣杯布局:固定头部、固定左侧导航、流动内容区域、固定右侧边栏。

21

我正在尝试使用Flexbox构建“圣杯”布局。

  • 固定标题
  • 固定、可折叠、可滚动的左侧导航
  • 灵活的内容区域
  • 固定、可折叠、可滚动的右侧导航

见下图:

enter image description here

除了位于标题下方的“应用程序”区域的高度外,我已经把所有东西都做好了。现在它是100vh(视口高度的100%),但这包括64像素的标题。

我尝试使用calc(100vh - 64px),但这不适用于flex。

这是我的基本HTML结构:

<main>
    <header></header>
    <app>
        <nav>Left Nav</nav>
        <article>Content</article>
        <aside>Right Nav</aside>
    </app>
</main>

并且支持CSS:

main {
    display: flex;
    flex-direction: column;
}

header { 
    z-index: 0;
    flex: 0 0 64px;
    display: flex;
}

app {
    flex: 1 1 100vh;
    display: flex;
}

nav {
    flex: 0 0 256px;
    order: 0;
}

article {
    flex: 1 1 100px;
    order: 1;
}

aside {
    flex: 0 0 256px;
    order: 2;
}

- - - 完整的 jsFiddle 在此 - - -

- - - 简化的 jsFiddle 在此 - - -


FYI,flex 标签用于 Apache Flex。flexbox 标签是指 CSS 弹性布局。 - Brian
1个回答

19

<main><body> 中存在一些 CSS 冲突,我所需要做的就是删除 <main> 包装器,然后将 flex 相关定义直接添加到页面主体中。

-- 这里是完整可工作的 jdFiddle -- -

-- 这里是简化后的 jdFiddle --

html,
body {
  margin: 0;
  height: 100%;
  min-height: 100%;
}

body {
  margin: 0;
  display: flex;
  flex-direction: column;
}

header {
  z-index: 0;
  flex: 0 64px;
  display: flex;
}

app {
  flex: 1;
  display: flex;
}

nav {
  flex: 0 0 256px;
  order: 0;
}

article {
  flex: 1;
  order: 1;
  overflow: auto;
}

aside {
  flex: 0 0 256px;
  order: 2;
}
<header></header>
<app>
  <nav>Left Nav</nav>
  <article></article>
  <aside>Right Nav</aside>
</app>


2
这个答案在当前的Chrome(47)和Safari(9)中运行良好,但在Firefox(44)中似乎无法正常工作。我发现像这样使用flexbox编码的布局在FF上出现了反复出现的问题 - 它似乎没有尊重单个面板(您示例中的导航和/或文章面板)具有弹性计算高度和overflow-y设置的能力。相反,整个页面都会滚动。我似乎无法在FF中使其正常工作 - 也许缺少一些前缀? - J. Ky Marsh
感谢分享。使用HTML标签<app>语义上是否正确?还是应该使用div id="app">?或者您正在使用像AngularJs这样的框架吗? - ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
2
@J.KyMarsh 只需将 app 选择器添加 overflow: auto;,固定的标题在 Firefox 中也能正常工作。 - Jan Peša
由于它是<applet>的先驱,因此<app>已被HTML5移除。它在现代网页中已经没有用武之地。 - SeverityOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接