如何使用Angular材质2制作响应式导航栏?

时间:2016-07-05 17:55:41

标签: angular angular-material2

我正在尝试使用Angular material 2创建导航栏,该导航栏会在移动设备和平板电脑等小屏幕中折叠。

我只能在Angular素材中找到md-button但不能找到md-menu-bar

8 个答案:

答案 0 :(得分:47)

以下是我在nav-bar app中使用Angular2 + Material 2和flex-layout构建响应式angular-cli时的内容。

(请访问Install Angular Material and Angular CDK

1)安装flex-layout

npm install @angular/flex-layout -save

2)在app.module.ts

中加入 flex-layout
import {FlexLayoutModule} from "@angular/flex-layout";

3)导入

imports: [
 BrowserModule,
 FormsModule,
 HttpModule,
 RoutingModule,
 FlexLayoutModule,
MyOwnCustomMaterialModule // Please visit the link above "Install Angular Material and Angular CDK", and check (Step 3: Import the component modules).
],

<强> app.component.html

<mat-toolbar color="primary">

    <button mat-button routerLink="/">
    <mat-icon>home</mat-icon> 
        {{title}}</button>

    <!-- This fills the remaining space of the current row -->
    <span class="fill-remaining-space"></span>
    <div fxLayout="row" fxShow="false" fxShow.gt-sm>
        <button mat-button routerLink="/products">Products</button>
        <button mat-button routerLink="/dashboard">Dashboard</button>
    </div>
    <button mat-button [mat-menu-trigger-for]="menu" fxHide="false" fxHide.gt-sm>
     <mat-icon>menu</mat-icon>
    </button>

</mat-toolbar>
<mat-menu x-position="before" #menu="matMenu">
    <button mat-menu-item routerLink="/products">Products</button>
    <button mat-menu-item routerLink="/dashboard">Dashboard</button>
    <!--<button mat-menu-item>Help</button>-->
</mat-menu>

app.component.css

.fill-remaining-space {
   /*This fills the remaining space, by using flexbox.  
  Every toolbar row uses a flexbox row layout. */
  flex: 1 1 auto;
}

注意:要测试,请调整页面大小。

查看flex-layout文档

答案 1 :(得分:12)

使用Material创建响应式导航栏的 最简单方法 使用Angular 6 CLI schematics

(如果你在运行ng add @ angular / material时得到'Collection'@ angular / material“无法解析”,请参阅this

然后使用生成的组件<app-my-nav></app-my-nav> 将上述标记添加到主要组件

桌面PC上的响应式视图: Responsive view on Desktop PC

低分辨率的响应式折叠菜单 Responsive collapsed menu with low resolution

这最初见于Angular's blog

答案 2 :(得分:8)

这是我最喜欢的在Angular中创建响应式导航栏的方法。如果使用Angular 6,请确保使用6.1+版本。
关于Stackblitz的工作示例:https://stackblitz.com/edit/angular-v6xwte

在较小屏幕上的示例: Toolbar on a small screen

较大屏幕上的示例: Toolbar on a large screen

以下是具体操作步骤:

1)安装必要的软件包。输入您的终端:

npm install --save @angular/material @angular/cdk @angular/animations

npm install @angular/flex-layout --save

2)在app.module.ts

中导入必要的模块
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FlexLayoutModule } from '@angular/flex-layout';
import {
  MatIconModule, MatButtonModule, MatSidenavModule, MatToolbarModule
} from '@angular/material';

请记住将这些模块添加到下面的imports数组中。

3)将“材质图标”链接添加到您的index.html
链接必须位于任何Angular内容之前。

<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">

4)在您的styles.css中添加一个Angular主题并将边距设置为0%

@import "~@angular/material/prebuilt-themes/indigo-pink.css";
body{
    margin: 0%;
}

5)在您的app.component.html中添加工具栏HTML代码

<div style="height: 100vh;"> 
<mat-toolbar color="primary">
    <div fxShow="true" fxHide.gt-sm="true">
      <button mat-icon-button (click)="sidenav.toggle()">
        <mat-icon>menu</mat-icon>
      </button>
    </div>
    <a mat-button class="companyName" routerLink="/">
      <span>Site name</span>
    </a>
    <span class="example-spacer"></span>
    <div fxShow="true" fxHide.lt-md="true">
      <a mat-button routerLink="/about-us">About us</a>
      <a mat-button routerLink="/prices">Prices</a>
      <a mat-button routerLink="/start-page">Start page</a>
      <a mat-button routerLink="/offer">Offer</a>
      <a mat-button routerLink="/contact">Contact</a>
    </div>
  </mat-toolbar>
  <mat-sidenav-container fxFlexFill class="example-container">
    <mat-sidenav color="primary" #sidenav fxLayout="column" mode="over" opened="false" fxHide.gt-sm="true">
      <div fxLayout="column">
        <a mat-button routerLink="/about-us">About us</a>
        <a mat-button routerLink="/prices">Prices</a>
        <a mat-button routerLink="/start-page">Start page</a>
        <a mat-button routerLink="/offer">Offer</a>
        <a mat-button routerLink="/contact">Contact</a>
      </div>
    </mat-sidenav>
    <mat-sidenav-content fxFlexFill>
      Awesome content
    </mat-sidenav-content>
  </mat-sidenav-container>
</div>

6)在app.component.css中设置工具栏样式

.companyName{
    font-size: 150%;
}
div {
    overflow: inherit;
}
a{
    text-decoration: none;
    font-size: 110%;
    white-space: normal;
}
button{
    font-size: 110%;
    min-width: min-content;
}
.example-icon {
    padding: 0 14px;
  }

  .example-spacer {
    flex: 1 1 auto;
  }
  .mat-sidenav-content{
      font-size: 200%;
      text-align: center;
  }

答案 3 :(得分:4)

在github上查看md-sidenav项目。以下是他们迄今为止发布的材料设计组件清单:

https://www.npmjs.com/~angular2-material

此外,我认为md-toolbarmd-sidenav正是您要找的。

md-toolbar - https://www.npmjs.com/package/@angular2-material/sidenav

a - https://www.npmjs.com/package/@angular2-material/toolbar

注意:该项目仍处于alpha版本,这意味着其API可能会发生重大变化。不建议在生产中使用。

答案 4 :(得分:4)

我粗略尝试使用带有抽屉实现的工具栏修改答案,其中包含角度材料5.0.2的新组件名称

要做:需要修复所有标题链接的CSS。菜单图标应该是透明的。

https://responsivematerial2.stackblitz.io/

.mat-sidenav-container {
  background: rgba(0, 0, 0, 0.08);
}

.blank-grow {
  flex: 1 1 auto;
}
<mat-sidenav-container fullscreen>
  <mat-sidenav #sidenav>
    <mat-nav-list>
      <a mat-list-item>
        <mat-icon mat-list-icon>home</mat-icon>
        <span mat-line>home</span>
      </a>

      <a mat-list-item>
        <mat-icon mat-list-icon>backup</mat-icon>
        <span mat-line>Backup</span>
      </a>
    </mat-nav-list>
  </mat-sidenav>
  <mat-toolbar color="primary">
    <button mat-icon-button (click)="sidenav.open()" fxHide="false" fxHide.gt-sm>
      <mat-icon>menu</mat-icon>
    </button>
    <span> Big Header</span>
    <span class="blank-grow"></span>
    <div fxLayout="row" fxShow="false" fxShow.gt-sm>
      <a>
        <mat-icon mat-list-icon>home</mat-icon>
        <span mat-line>home</span>
      </a>

      <a>
        <mat-icon mat-list-icon>backup</mat-icon>
        <span mat-line>Backup</span>
      </a>
    </div>
  </mat-toolbar>
</mat-sidenav-container>

答案 5 :(得分:2)

您可以使用mat-toolbarmat-sidenavflex-layoutfxFlexFill,...)来构建自适应菜单。

See Stackblitz example

More info...

答案 6 :(得分:1)

我已经编辑了 user2662006 的答案,其中包含一些修复和代码优化。请注意,我的StackOverflow点目前太低,甚至无法授予我提交评论的权限,更不用说编辑了。

1)Install Angular Material and Angular CDK

2)安装flex-layout

npm install @angular/flex-layout -save

3)在app.module.ts

中加入 flex-layout
import {FlexLayoutModule} from "@angular/flex-layout";

4)导入相关材料和flex模块

imports: [
 ...,
 FlexLayoutModule,
 MatToolbarModule,
 MatIconModule,
 MatMenuModule,
 MatButtonModule,
],

<强> app.component.html

<mat-toolbar color="primary">
    <button mat-button routerLink="/">
        <mat-icon>home</mat-icon> 
        {{title}}
    </button>

    <span class="fill-remaining-space"></span>

    <div fxLayout="row" fxHide fxShow.gt-sm>
        <button mat-button routerLink="/products">Products</button>
        <button mat-button routerLink="/dashboard">Dashboard</button>
    </div>
    <button mat-button [mat-menu-trigger-for]="menu" fxShow fxHide.gt-sm>
     <mat-icon>menu</mat-icon>
    </button>

</mat-toolbar>
<mat-menu x-position="before" #menu>
    <button mat-menu-item routerLink="/products">Products</button>
    <button mat-menu-item routerLink="/dashboard">Dashboard</button>
</mat-menu>

app.component.css

.fill-remaining-space {
   /*This fills the remaining space, by using flexbox.  
  Every toolbar row uses a flexbox row layout. */
  flex: 1 1 auto;
}

注意:

答案 7 :(得分:1)

我的演讲Create Enterprise UIs That Your Users Will Love涵盖了Angular Material的一些模式。 StackBlitz示例的链接在演讲者笔记中。

带有溢出菜单的响应式按钮栏: 这可以放在TopNav中或下面。 https://stackblitz.com/edit/material-responsive-button-bar?file=app%2Fbutton-bar%2Fbutton-bar.component.ts

动态嵌套TopNav菜单: 请注意,此菜单无法完全访问。需要做更多的工作才能完全支持良好的体验。 https://stackblitz.com/edit/dynamic-nested-topnav-menu?file=app/app.component.ts

动态嵌套SideNav菜单: 如果您使用转换模式将TopNav切换到移动设备上的SideNav,则会显示如何构建动态SideNav菜单。 https://stackblitz.com/edit/dynamic-nested-sidenav-menu?file=app%2Fapp.component.html