Материал Sidenav переполняет содержимое, если изображение находится в sidenav - PullRequest
0 голосов
/ 08 апреля 2019

Доброе утро!

Я использую боковую навигацию Material Design в своем приложении Angular, чтобы предложить пользователю выбор страницы. Боковая навигация содержит сначала логотип, а затем все страницы, из которых пользователь может выбрать - если он вошел в систему.

Проблема: Если пользователь не вошел в систему, логотип является элементом с самой большой шириной; и это сбивает с толку позиционирование содержимого страницы. Содержание страницы переполняется 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 Ответ

1 голос
/ 08 апреля 2019

Есть несколько способов исправить это.Например:

  1. Применение свойства width к изображению вашего логотипа.Может быть 100% или 230px, как вы использовали.
.logo-nav img {
  min-width: 230px;
}
Установка свойства width для самого sidenav.https://material.angular.io/components/sidenav/overview#setting-the-sidenav-39-s-size
.mat-sidenav {
  width: 230px;
}
Изменение отображения с mat-nav-list на flex с направлением column.
.mat-nav-list {
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...