Menu导航菜单

    导航菜单是一个网站的灵魂,用户依赖导航在各个页面中进行跳转。一般分为顶部导航和侧边导航,顶部导航提供全局性的类目和功能,侧边导航提供多级结构来收纳和排列网站架构。

    更多布局和导航的使用可以参考:通用布局

    顶部导航

    水平的顶部导航菜单。

    1. @Component({
    2. selector: 'nz-demo-menu-horizontal',
    3. template: `
    4. <ul nz-menu nzMode="horizontal">
    5. <li nz-menu-item nzSelected>
    6. <i nz-icon nzType="mail"></i>
    7. Navigation One
    8. </li>
    9. <li nz-menu-item nzDisabled>
    10. <i nz-icon nzType="appstore"></i>
    11. Navigation Two
    12. </li>
    13. <li nz-submenu nzTitle="Navigation Three - Submenu" nzIcon="setting">
    14. <ul>
    15. <li nz-menu-group nzTitle="Item 1">
    16. <ul>
    17. <li nz-menu-item>Option 1</li>
    18. <li nz-menu-item>Option 2</li>
    19. </ul>
    20. </li>
    21. <li nz-menu-group nzTitle="Item 2">
    22. <ul>
    23. <li nz-menu-item>Option 3</li>
    24. <li nz-menu-item>Option 4</li>
    25. <li nz-submenu nzTitle="Sub Menu">
    26. <ul>
    27. <li nz-menu-item nzDisabled>Option 5</li>
    28. <li nz-menu-item>Option 6</li>
    29. </ul>
    30. </li>
    31. <li nz-submenu nzDisabled nzTitle="Disabled Sub Menu">
    32. <ul>
    33. <li nz-menu-item>Option 5</li>
    34. <li nz-menu-item>Option 6</li>
    35. </ul>
    36. </li>
    37. </ul>
    38. </li>
    39. </ul>
    40. </li>
    41. <li nz-menu-item>
    42. <a href="https://ng.ant.design" target="_blank" rel="noopener noreferrer">Navigation Four - Link</a>
    43. </li>
    44. </ul>
    45. `
    46. })
    47. export class NzDemoMenuHorizontalComponent {}

    Menu导航菜单 - 图4

    内嵌菜单

    垂直菜单,子菜单内嵌在菜单区域。

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-inline',
    4. template: `
    5. <ul nz-menu nzMode="inline">
    6. <li nz-submenu nzTitle="Navigation One" nzIcon="mail" nzOpen>
    7. <ul>
    8. <li nz-menu-group nzTitle="Item 1">
    9. <ul>
    10. <li nz-menu-item nzSelected>Option 1</li>
    11. <li nz-menu-item>Option 2</li>
    12. </ul>
    13. </li>
    14. <li nz-menu-group nzTitle="Item 2">
    15. <ul>
    16. <li nz-menu-item>Option 3</li>
    17. <li nz-menu-item>Option 4</li>
    18. </ul>
    19. </li>
    20. </ul>
    21. </li>
    22. <li nz-submenu nzTitle="Navigation Two" nzIcon="appstore">
    23. <ul>
    24. <li nz-menu-item>Option 5</li>
    25. <li nz-menu-item>Option 6</li>
    26. <li nz-submenu nzTitle="Submenu">
    27. <ul>
    28. <li nz-menu-item>Option 7</li>
    29. <li nz-menu-item>Option 8</li>
    30. <li nz-submenu nzTitle="Submenu">
    31. <ul>
    32. <li nz-menu-item>Option 9</li>
    33. <li nz-menu-item>Option 10</li>
    34. </ul>
    35. </li>
    36. </ul>
    37. </li>
    38. </ul>
    39. </li>
    40. <li nz-submenu nzTitle="Navigation Three" nzIcon="setting">
    41. <ul>
    42. <li nz-menu-item>Option 11</li>
    43. <li nz-menu-item>Option 12</li>
    44. <li nz-menu-item>Option 13</li>
    45. </ul>
    46. </li>
    47. </ul>
    48. `,
    49. styles: [
    50. `
    51. [nz-menu] {
    52. width: 240px;
    53. }
    54. `
    55. ]
    56. })
    57. export class NzDemoMenuInlineComponent {}

    缩起内嵌菜单

    你可以在 里查看侧边布局结合的完整示例。

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-inline-collapsed',
    4. template: `
    5. <div class="wrapper">
    6. <button nz-button nzType="primary" (click)="toggleCollapsed()">
    7. <i nz-icon [nzType]="isCollapsed ? 'menu-unfold' : 'menu-fold'"></i>
    8. </button>
    9. <ul nz-menu nzMode="inline" nzTheme="dark" [nzInlineCollapsed]="isCollapsed">
    10. <li nz-menu-item nz-tooltip nzTooltipPlacement="right" [nzTooltipTitle]="isCollapsed ? 'Navigation One' : ''" nzSelected>
    11. <i nz-icon nzType="mail"></i>
    12. <span>Navigation One</span>
    13. </li>
    14. <li nz-submenu nzTitle="Navigation Two" nzIcon="appstore">
    15. <ul>
    16. <li nz-menu-item>Option 5</li>
    17. <li nz-menu-item>Option 6</li>
    18. <li nz-submenu nzTitle="Submenu">
    19. <ul>
    20. <li nz-menu-item>Option 7</li>
    21. <li nz-menu-item>Option 8</li>
    22. </ul>
    23. </li>
    24. </ul>
    25. </li>
    26. <li nz-submenu nzTitle="Navigation Three" nzIcon="setting">
    27. <ul>
    28. <li nz-menu-item>Option 9</li>
    29. <li nz-menu-item>Option 10</li>
    30. <li nz-menu-item>Option 11</li>
    31. </ul>
    32. </li>
    33. </ul>
    34. </div>
    35. `,
    36. styles: [
    37. `
    38. .wrapper {
    39. width: 240px;
    40. }
    41. button {
    42. margin-bottom: 12px;
    43. }
    44. `
    45. ]
    46. })
    47. export class NzDemoMenuInlineCollapsedComponent {
    48. isCollapsed = false;
    49. toggleCollapsed(): void {
    50. this.isCollapsed = !this.isCollapsed;
    51. }
    52. }

    Menu导航菜单 - 图6

    只展开当前父级菜单

    点击菜单,收起其他展开的所有菜单,保持菜单聚焦简洁。

    垂直菜单

    子菜单是弹出的形式。

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-vertical',
    4. template: `
    5. <ul nz-menu [nzMode]="'vertical'">
    6. <li nz-submenu nzTitle="Navigation One" nzIcon="mail">
    7. <ul>
    8. <li nz-menu-group nzTitle="Item 1">
    9. <ul>
    10. <li nz-menu-item>Option 2</li>
    11. </ul>
    12. </li>
    13. <li nz-menu-group nzTitle="Item 2">
    14. <ul>
    15. <li nz-menu-item>Option 3</li>
    16. <li nz-menu-item>Option 4</li>
    17. </ul>
    18. </li>
    19. </ul>
    20. </li>
    21. <li nz-submenu (nzOpenChange)="change($event)" nzTitle="Navigation Two" nzIcon="appstore">
    22. <ul>
    23. <li nz-menu-item>Option 5</li>
    24. <li nz-menu-item>Option 6</li>
    25. <li nz-submenu nzTitle="Submenu">
    26. <ul>
    27. <li nz-menu-item>Option 7</li>
    28. <li nz-menu-item>Option 8</li>
    29. </ul>
    30. </li>
    31. </ul>
    32. </li>
    33. <li nz-submenu nzTitle="Navigation Three" nzIcon="setting">
    34. <ul>
    35. <li nz-menu-item>Option 9</li>
    36. <li nz-menu-item>Option 10</li>
    37. <li nz-menu-item>Option 11</li>
    38. </ul>
    39. </li>
    40. </ul>
    41. `,
    42. styles: [
    43. `
    44. [nz-menu] {
    45. width: 240px;
    46. }
    47. `
    48. ]
    49. })
    50. export class NzDemoMenuVerticalComponent {
    51. change(value: boolean): void {
    52. console.log(value);
    53. }
    54. }

    Menu导航菜单 - 图8

    主题

    内建了两套主题 light|dark,默认 light

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-theme',
    4. template: `
    5. <nz-switch [(ngModel)]="theme">
    6. <span checked>Dark</span>
    7. <span unchecked>Light</span>
    8. </nz-switch>
    9. <br />
    10. <br />
    11. <ul nz-menu nzMode="inline" style="width: 240px;" [nzTheme]="theme ? 'dark' : 'light'">
    12. <li nz-submenu nzOpen nzTitle="Navigation One" nzIcon="mail">
    13. <ul>
    14. <li nz-menu-group nzTitle="Item 1">
    15. <ul>
    16. <li nz-menu-item nzSelected>Option 1</li>
    17. <li nz-menu-item>Option 2</li>
    18. </ul>
    19. </li>
    20. <li nz-menu-group nzTitle="Item 2">
    21. <ul>
    22. <li nz-menu-item>Option 3</li>
    23. <li nz-menu-item>Option 4</li>
    24. </ul>
    25. </li>
    26. </ul>
    27. </li>
    28. <li nz-submenu nzTitle="Navigation Two" nzIcon="appstore">
    29. <ul>
    30. <li nz-menu-item>Option 5</li>
    31. <li nz-menu-item>Option 6</li>
    32. <li nz-submenu nzTitle="Submenu">
    33. <ul>
    34. <li nz-menu-item>Option 7</li>
    35. <li nz-menu-item>Option 8</li>
    36. </ul>
    37. </li>
    38. </ul>
    39. </li>
    40. <li nz-submenu nzTitle="Navigation Three" nzIcon="setting">
    41. <ul>
    42. <li nz-menu-item>Option 9</li>
    43. <li nz-menu-item>Option 10</li>
    44. <li nz-menu-item>Option 11</li>
    45. </ul>
    46. </li>
    47. </ul>
    48. `
    49. })
    50. export class NzDemoMenuThemeComponent {
    51. theme = true;
    52. }

    切换菜单类型

    展示动态切换模式。

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-switch-mode',
    4. template: `
    5. <nz-switch [(ngModel)]="mode"></nz-switch>
    6. Change Mode
    7. <nz-divider nzType="vertical"></nz-divider>
    8. <nz-switch [(ngModel)]="dark"></nz-switch>
    9. Change Theme
    10. <br />
    11. <br />
    12. <ul nz-menu [nzMode]="mode ? 'vertical' : 'inline'" [nzTheme]="dark ? 'dark' : 'light'">
    13. <li nz-submenu nzTitle="Navigation One" nzIcon="mail">
    14. <ul>
    15. <li nz-menu-group nzTitle="Item 1">
    16. <ul>
    17. <li nz-menu-item>Option 1</li>
    18. <li nz-menu-item>Option 2</li>
    19. </ul>
    20. </li>
    21. <li nz-menu-group nzTitle="Item 2">
    22. <ul>
    23. <li nz-menu-item>Option 3</li>
    24. <li nz-menu-item>Option 4</li>
    25. </ul>
    26. </li>
    27. </ul>
    28. </li>
    29. <li nz-submenu nzTitle="Navigation Two" nzIcon="appstore">
    30. <ul>
    31. <li nz-menu-item>Option 5</li>
    32. <li nz-menu-item>Option 6</li>
    33. <li nz-submenu nzTitle="Submenu">
    34. <li nz-menu-item>Option 7</li>
    35. <li nz-menu-item>Option 8</li>
    36. </ul>
    37. </li>
    38. </ul>
    39. </li>
    40. <li nz-submenu nzTitle="Navigation Three" nzIcon="setting">
    41. <ul>
    42. <li nz-menu-item>Option 9</li>
    43. <li nz-menu-item>Option 10</li>
    44. <li nz-menu-item>Option 11</li>
    45. </ul>
    46. </li>
    47. </ul>
    48. `,
    49. styles: [
    50. `
    51. [nz-menu] {
    52. width: 240px;
    53. }
    54. `
    55. ]
    56. })
    57. export class NzDemoMenuSwitchModeComponent {
    58. mode = false;
    59. dark = false;
    60. }

    配合路由使用

    自动根据路由激活菜单项,需要结合 routerLink 一起使用。

    Menu导航菜单 - 图11

    递归生成菜单

    递归生成菜单,需要手动指定 nzPaddingLeft,仅在 nzModeinline 的模式,且 nzInlineCollapsedfalse 的情况下有效。

    1. import { Component } from '@angular/core';
    2. @Component({
    3. selector: 'nz-demo-menu-recursive',
    4. <ul nz-menu nzMode="inline" style="width: 240px;">
    5. <ng-container *ngTemplateOutlet="menuTpl; context: { $implicit: menus }"></ng-container>
    6. <ng-template #menuTpl let-menus>
    7. <ng-container *ngFor="let menu of menus">
    8. <li
    9. *ngIf="!menu.children"
    10. nz-menu-item
    11. [nzPaddingLeft]="menu.level * 24"
    12. [nzDisabled]="menu.disabled"
    13. [nzSelected]="menu.selected"
    14. >
    15. <i nz-icon [nzType]="menu.icon" *ngIf="menu.icon"></i>
    16. <span>{{ menu.title }}</span>
    17. </li>
    18. <li
    19. *ngIf="menu.children"
    20. nz-submenu
    21. [nzPaddingLeft]="menu.level * 24"
    22. [nzOpen]="menu.open"
    23. [nzTitle]="menu.title"
    24. [nzIcon]="menu.icon"
    25. [nzDisabled]="menu.disabled"
    26. >
    27. <ul>
    28. <ng-container *ngTemplateOutlet="menuTpl; context: { $implicit: menu.children }"></ng-container>
    29. </ul>
    30. </li>
    31. </ng-container>
    32. </ng-template>
    33. </ul>
    34. `
    35. })
    36. export class NzDemoMenuRecursiveComponent {
    37. mode = false;
    38. dark = false;
    39. menus = [
    40. {
    41. level: 1,
    42. title: 'Mail Group',
    43. icon: 'mail',
    44. open: true,
    45. selected: false,
    46. disabled: false,
    47. children: [
    48. {
    49. level: 2,
    50. title: 'Group 1',
    51. icon: 'bars',
    52. open: false,
    53. selected: false,
    54. disabled: false,
    55. children: [
    56. {
    57. level: 3,
    58. title: 'Option 1',
    59. selected: false,
    60. disabled: false
    61. },
    62. {
    63. level: 3,
    64. title: 'Option 2',
    65. selected: false,
    66. disabled: true
    67. }
    68. ]
    69. },
    70. {
    71. level: 2,
    72. title: 'Group 2',
    73. icon: 'bars',
    74. selected: true,
    75. disabled: false
    76. },
    77. {
    78. level: 2,
    79. title: 'Group 3',
    80. icon: 'bars',
    81. selected: false,
    82. disabled: false
    83. }
    84. ]
    85. },
    86. {
    87. level: 1,
    88. title: 'Team Group',
    89. icon: 'team',
    90. open: false,
    91. selected: false,
    92. disabled: false,
    93. children: [
    94. {
    95. level: 2,
    96. title: 'User 1',
    97. icon: 'user',
    98. selected: false,
    99. disabled: false
    100. },
    101. {
    102. level: 2,
    103. title: 'User 2',
    104. icon: 'user',
    105. selected: false,
    106. disabled: false
    107. }
    108. ]
    109. }
    110. ];
    111. }
    1. <ul nz-menu>
    2. <li nz-menu-item>Menu 1</li>
    3. <li nz-menu-item>Menu 2</li>
    4. <li nz-submenu nzTitle="SubMenu Title">
    5. <ul>
    6. <li nz-menu-item>SubMenu Item 1</li>
    7. <li nz-menu-item>SubMenu Item 2</li>
    8. <li nz-menu-item>SubMenu Item 3</li>
    9. </ul>
    10. </li>
    11. </ul>

    你可以使用以下三种方式来定义 nz-submenu 的标题

    1. <li nz-submenu nzTitle="SubTitle" nzIcon="appstore"></li>
    2. <li nz-submenu><span title><i nz-icon nzType="appstore"></i><span>SubTitle</span></span></li>
    3. <li nz-submenu [nzTitle]="titleTpl"></li>

    菜单项分割线,只用在弹出菜单内。