如果图像在sidenav中,则材质Sidenav会溢出内容

时间:2019-04-08 09:20:50

标签: html css angular material-design

早上好!

我在Angular应用中使用了Material Design侧面导航,以向用户提供页面选择。侧面导航首先包含徽标,然后包含用户可以选择的所有页面-如果已登录。

问题: 如果用户未登录,则徽标是宽度最大的元素;这会混淆页面内容的位置。页面内容被sidenav溢出,因为页面内容与页面链接而不是徽标相对应。

The sidenav respects the width of the logo. The content does not

您可以看到sidenav尊重徽标的宽度。内容不包含。

HTML:

<mat-card>
    <mat-sidenav-container>
        <mat-sidenav #drawer mode="side" opened role="navigation">
            <mat-nav-list>
                <div class="logo-nav">
                    <img src="./assets/MyLogo.png">
                </div>
                <a id="nav-home" mat-list-item routerLink='home' routerLinkActive="active">Home</a>
                <a id="nav-schulauswahl" mat-list-item routerLink='page1' routerLinkActive="active" *ngIf="loggedIn">
                    Page 1
                </a>
                <a id="nav-schule-list" mat-list-item routerLink='page2' routerLinkActive="active" *ngIf="loggedIn">
                    Page 2 with very long name
                </a>
                <a id="nav-logout" mat-list-item (click)='logout()' routerLinkActive="active">Logout</a>
            </mat-nav-list>
        </mat-sidenav>

        <mat-sidenav-content>
            Some Content
        </mat-sidenav-content>
    </mat-sidenav-container>
</mat-card>

打字稿:

import { Component } from '@angular/core';

@Component({
    selector: 'my-sidenav',
    templateUrl: './sidenav.component.html',
    styleUrls: ['./sidenav.component.scss']
})
export class SidenavComponent {

    get loggedIn(): boolean {
        return true; // <- Toogle this to see all page links
    }
}

问题的核心:margin-left中的mat-sidenav-content计算错误。作为解决方法,我将其硬编码为230px,但是如果用户未登录,这当然会在sidenav和内容之间产生难看的差距:

CSS:

@import '../../styles/colors.scss';

.logo-nav {
    width: 100%;
    text-align: center;
}

// Workaround
mat-sidenav-content {
    margin-left: 230px !important;
}

enter image description here

如果用户已登录,则会显示较长的页面名称,这将使left-margin的计算正确。

enter image description here

1 个答案:

答案 0 :(得分:1)

有多种方法可以解决此问题。例如:

  1. width属性应用于徽标图像。您可以使用100%230px
.logo-nav img {
  min-width: 230px;
}
  1. 为sidenav本身设置width属性。 https://material.angular.io/components/sidenav/overview#setting-the-sidenav-39-s-size
.mat-sidenav {
  width: 230px;
}
  1. mat-nav-list方向将flex的显示更改为column
.mat-nav-list {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}