Доброе утро!
Я использую боковую навигацию Material Design в своем приложении Angular, чтобы предложить пользователю выбор страницы. Боковая навигация сначала содержит логотип, а затем все страницы, которые пользователь может выбрать, если он вошел в систему.
Проблема: Если пользователь не вошел в систему, логотип является элементом с наибольшей шириной; и это сбивает с толку позиционирование содержимого страницы. Содержимое страницы переполняется sidenav, потому что содержимое страницы совпадает со ссылками на страницы, но не с логотипом.
Как видите, 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
вычисляется неправильно. В качестве обходного пути я жестко запрограммировал его на 230 пикселей, но это, конечно, создает уродливый разрыв между sidenav и контентом, если пользователь не вошел в систему:
CSS:
@import '../../styles/colors.scss';
.logo-nav {
width: 100%;
text-align: center;
}
// Workaround
mat-sidenav-content {
margin-left: 230px !important;
}
Если пользователь вошел в систему, то отображаются более длинные имена страниц, что делает расчет left-margin
правильным.
Есть несколько способов исправить это. Например:
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;
}
Спасибо за все эти варианты. Я использовал второй из-за другой проблемы с материалом sidenav: когда появляется другая опция и изменяется ширина sidenav, левое поле mat-sidenav-content не пересчитывается сразу - только после обновления страницы. Но для моих целей подходит фиксированная ширина сиденава.
Вы развернули свой код на любом сервере? Если да поделитесь ссылкой. Спасибо