在 Angular 中使用 Angular Material / Flex-Layout 创建具有固定标题、固定侧边栏、固定内容部分的布局

Posted

技术标签:

【中文标题】在 Angular 中使用 Angular Material / Flex-Layout 创建具有固定标题、固定侧边栏、固定内容部分的布局【英文标题】:Creating a layout with a fixed header, fixed sidebar, fixed content section using Angular Material / Flex-Layout in Angular 【发布时间】:2017-09-19 22:09:09 【问题描述】:

我正在使用 Angular 和 Angular Material 和 Flex Layout

我正在尝试为 Web 应用程序创建一个与 this site 完全相同的布局。注意固定的标题,固定的侧边栏,固定的内容痛苦。没有使用浏览器滚动,只有 div 滚动并且完全适合浏览器视口。

这是我用来提供基本结构的 html

<md-toolbar color="primary">
  <span>Application Title</span>
</md-toolbar>
  <md-sidenav-container>
    <md-sidenav mode="side" opened="true">Drawer content</md-sidenav>
    <div class="my-content">Main content</div>
  </md-sidenav-container>

另外我设置了以下样式:

    html, body 
      margin: 0;
      width: 100%;
      height: 100%;
      overflow: hidden;
    
md-sidenav-container, .main-content 
  margin: 0;
  width: 100%;
  height: 100%;

我注意到,如果没有页面上的工具栏,一切都可以完美运行。然后我添加了一个 padding-bottom: 64px;到 md-sidenav-container、.main-content 类。似乎它为内容修复了它,但不是sidenav。 sidenav 滚动条仍然位于浏览器窗口下方。

如果有人能告诉我如何使用 flex 指令,我确实在我的 Angular 应用程序中安装了 flex-layout。否则,纯 css 也可以。

【问题讨论】:

我建议使用绝对定位的sidenav,其中的div相对定位。然后溢出滚动/自动相对div。这将使您免于高度不匹配的问题。 你有一个有效的例子吗?我也认为这是错误的容器过度浮动的问题......但我需要现场查看和测试...... 【参考方案1】:

使用最新的 Angular Material (7.2),它应该可以开箱即用。

<md-toolbar color="primary">
  <span>Application Title</span>
</md-toolbar>
  <md-sidenav-container>
    <md-sidenav mode="side" opened="true">Drawer content</md-sidenav>
    <div class="my-content">Main content</div>
  </md-sidenav-container>

【讨论】:

【参考方案2】:

这就是你要找的

html,
body 
  width: 100%;
  height: 100%;


mat-sidenav-container 
  width: 100%;
  height: calc(100% - 64px);
<md-toolbar color="primary">
  <span>Application Title</span>
</md-toolbar>
<md-sidenav-container>
  <md-sidenav mode="side" opened="true">Drawer content</md-sidenav>
  <div class="my-content">
    <router-outlet></router-outlet>
  </div>
</md-sidenav-container>

【讨论】:

此解决方案未按预期工作,工具栏未按预期停留在顶部。【参考方案3】:

你可以试试这个代码

html

<md-toolbar color="primary">
  <span>Application Title</span>
</md-toolbar>

<md-sidenav-container class="example-container">
  <md-sidenav #sidenav class="example-sidenav" opened="true">
    Jolly good!
  </md-sidenav>

  <div class="example-sidenav-content">
     <div class="my-content">Main content</div>
  </div>

</md-sidenav-container>

css

.example-container 
  width: 500px;
  height: 300px;
  border: 1px solid rgba(0, 0, 0, 0.5);


.example-sidenav-content 
  display: flex;
  height: 100%;
  align-items: center;
  justify-content: center;


.example-sidenav 
  padding: 20px;


.my-content
  height:1200px;

这是 Plunker 链接:https://plnkr.co/edit/YFGQdVcNnIhMK0GzZ25Z?p=preview

【讨论】:

此方案未达到预期效果。【参考方案4】:

您可以在https://angular-material2-issue-dgcx3j.stackblitz.io/查看工作示例

它与您要求的不完全相同(它具有额外的功能)。侧边栏固定在大屏幕上,在小屏幕上响应式隐藏,并在工具栏上显示菜单按钮。

您可以在https://stackblitz.com/edit/angular-material2-issue-dgcx3j?file=app%2Fapp.component.ts查看代码

您还可以在 https://github.com/angular/material.angular.io 找到 Angular Material Docs 站点的源代码(您曾询问过相同的功能)

【讨论】:

这是选择的解决方案。结果非常接近预期。

以上是关于在 Angular 中使用 Angular Material / Flex-Layout 创建具有固定标题、固定侧边栏、固定内容部分的布局的主要内容,如果未能解决你的问题,请参考以下文章

使用 mat-tab-group 以编程方式在 Angular 2 材料中选择 mat-tab

Angular 5 / Material,如何在 Mat Dialog 中删除垂直滚动?

使用 angular2 在 mat-radio-group 中设置默认选择的 mat-radio-button

如何在 Angular 6 中使用 Material 将 mat-chip 绑定到 ngmodel

Angular 7:mat-select 无法在 ReactiveForm 中没有 ngModel 的情况下设置默认选项

ng-deep 导致 Angular 中的 mat-select 出现问题