Angular:系统主页样式设置——菜单栏子菜单横向展开显示

在页面上想在上方展示菜单栏,一级菜单点击后加粗高亮显示,鼠标浮动在菜单上展开二三级菜单,二级菜单加粗,三级菜单展开显示在对应的上级菜单右侧,效果如下图所示:

在页面上显示标题logo,菜单,右侧展示当前用户收到的新消息和登录信息,nav-header.component.html代码如下(仅作参考):

<div class="top-menu-bar">
  <div class="logo-wrap">
    <img src="../../../assets/img/logo1.png" />
    <nz-divider nzType="vertical"></nz-divider>
    <span>{{ systemTitle }}</span>
  </div>
  <div class="top-menu-nav">
    <nz-tabset [(nzSelectedIndex)]="selectedNavIndex">
      <nz-tab *ngFor="let tab of tabMenus" [nzTitle]="titleTemplate">
        <ng-template #titleTemplate>
          <ng-container *ngIf="tab.childMenu && tab.childMenu.length > 0; else simpleTemp">
            <div nz-popover nzTitle="Title" [nzContent]="contentTemplate" nzPlacement="bottomLeft"
              style="color: #fff; font-size: 14px;" [(nzVisible)]="tab.isVisiblePop">
              {{ tab.menuName }}
            </div>
            <ng-template #contentTemplate>
              <nz-list class="demo-loadmore-list" [nzDataSource]="tab.childMenu" [nzItemLayout]="'horizontal'"
                [nzRenderItem]="child" nzSize="small">
                <ng-template #child let-child>
                  <nz-list-item [nzContent]="nzContent">
                    <ng-template #nzContent>
                      <div nz-row [nzGutter]="8" class="popover-menu"
                        *ngIf="child.childMenu && child.childMenu.length > 0; else subChildMenu;">
                        <div nz-col nzSpan="4">
                          <span class="menu-second"> {{child.menuName}}</span>
                        </div>
                        <div nz-col nzSpan="20">
                          <div nz-row nzType="flex" [nzGutter]="8">
                            <div nz-col *ngFor="let subChild of child.childMenu">
                              <a><span class="menu-thrid" (click)="navigate(tab, subChild)">
                                  {{subChild.menuName}}</span></a>
                            </div>
                          </div>
                        </div>
                      </div>
                      <ng-template #subChildMenu>
                        <div nz-row [nzGutter]="8" class="popover-menu">
                          <div nz-col>
                            <a><span class="menu-second" (click)="navigate(tab, child)"> {{child.menuName}}</span></a>
                          </div>
                        </div>
                      </ng-template>
                    </ng-template>
                  </nz-list-item>
                </ng-template>
              </nz-list>
            </ng-template>
          </ng-container>
          <ng-template #simpleTemp>
            <a (click)="navigate(tab)" class="simple-tab">
              {{ tab.menuName }}
            </a>
          </ng-template>
        </ng-template>
      </nz-tab>
    </nz-tabset>
  </div>
  <div class="right-action-wrap">
    <nz-badge [nzDot]="alarmNum > 0" [nzStyle]="{ 'box-shadow': 'none' }">
      <i nz-icon type="bell" theme="outline" style="font-size:21px;vertical-align:middle;cursor: pointer;"></i>
    </nz-badge>
    <nz-divider nzType="vertical" style="margin-left: 16px; margin-right: 16px"></nz-divider>
    <div>
      <nz-dropdown nzPlacement="bottomRight">
        <a nz-dropdown>
          <span class="user-icon">
            <i nz-icon type="user" theme="outline" style="font-size: 18px;"></i> </span>{{ loginName }}
        </a>
        <ul nz-menu style="top: 6px;">
          <li nz-menu-item nzDisabled>系统帮助</li>
          <li nz-menu-item nzDisabled>规章制度</li>
          <li nz-menu-item (click)="goMyCenter(1)">个人信息</li>
          <li nz-menu-item (click)="goMyCenter(2)">修改密码</li>
          <li nz-menu-item (click)="exitLogin()">退出系统</li>
        </ul>
      </nz-dropdown>
    </div>
  </div>
</div>

在nav-header.component.ts组件中,使用

@Component({
  selector: 'app-nav-header',
  templateUrl: './nav-header.component.html',
  styleUrls: ['./nav-header.component.scss']
})

 进行自定义标签,这样在其他页面上可以直接使用app-nav-header这个标签获取到当前页面上的所有数据。

页面代码解释:

1、{{ systemTitle }}是页面上使用插值表达式绑定组件(component)上的系统名称字段;

2、对于class="top-menu-nav"这个页面上方的菜单样式,在scss文件中进行设置:

.top-menu-nav {
    flex: 1;
    background: #2f3746;
    border-bottom: 0;
    color: #fff;
    overflow: hidden;
  }

3、使用*ngFor="let tab of tabMenus"进行菜单标签的遍历,组件上@Input() tabMenus = [];这个属性从main.component.html中获得(使用app-nav-header这个自定义标签将nav-header.component.html的内容拿过来显示):

在main.component.html上:

<!-- 使用自定义标签使用菜单栏内容 -->
<app-nav-header [tabMenus]="menus" (menuChange)="onMenuChange($event)">
</app-nav-header>

<nz-layout class="main-container">
  <nz-header>
    <app-nav-breadcrumb [breadcrumbList]="breadcrumbList" (menuChange)="onMenuChange($event)"></app-nav-breadcrumb>
  </nz-header>
  <nz-content>
    <nz-layout style="height: 100%">
      <nz-content style="height: 100%;overflow-y: hidden;">
        <div class="content-container" [style.height.px]="contentHeight">
          <div class="page-wrap">
            <router-outlet></router-outlet>
          </div>
        </div>
      </nz-content>
    </nz-layout>
  </nz-content>
</nz-layout>

其中menus是调用onMenuChange(event)方法查到菜单列表:

getMenuData() {
    this.menuProvider
      .getMenuList()
      .pipe(untilDestroyed(this))
      .subscribe(
        data => {
          this.menus = data;
          this.cdr.detectChanges();
        },
        error => {}
      );
  }

4、ng-zorro-antd提供的popover组件是基于angular/cdk的overlay组件构建的。而overlay组件是有背景层,交互方式是打开一个弹出层,要先关闭才能在打开另一个overlay组件。所以ng-zorro-antd的popover组件交互也是如此。

nzPlacement属性控制菜单内容的显示位置,[nzItemLayout]="'horizontal'"则表示菜单上的元素水平展示。[nzRenderItem]="child"属性渲染子菜单,也就是<ng-template #child let-child>标签中的内容。

同样的[nzContent]="nzContent"则是渲染了<ng-template #nzContent>标签中的内容。

// 弹出菜单
.popover-menu {
  width: 600px;
}

5、三级菜单点击动作:(click)="navigate(tab, subChild)"

  navigate(tab, menu) {
    tab['isVisiblePop'] = false;
    this.menuChange.emit(menu);
  }

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值