Barre d'outils flottante matériel 2 et sidenav
Commencé récemment matériel d'apprentissage 2 et a couru à la question. Mon approche est de faire une sidenav comme dans Youtube
site web. Il y a un hamburger menu sur la gauche qui se dilate/cacher le menu de gauche.
Code:
<md-toolbar class="fixed-header">
<button class="app-icon-button" (click)="start.toggle()">
<i class="material-icons app-toolbar-menu">menu</i>
</button>
</md-toolbar>
<md-sidenav-container>
<md-sidenav #start class="app-sidebar" mode="side">test</md-sidenav>
<div class="text">
{{ text }}
</div>
</md-sidenav-container>
Semble maintenant comme je l'ai réalisé la mise en page, mais la position n'est pas fixed
, si je scroll toolbar
se déplace et sidenav
contenu se déplace également.
Edit:
Sur angulaire du matériel de documentation plus tard, j'ai trouvé l'exemple que j'ai été à la recherche pour:
https://stackblitz.com/angular/rmjxrpxdgmx?file=app%2Fsidenav-responsive-example.html
si le lien sera supprimé, voici le code:
HTML File:
<div class="example-container" [class.example-is-mobile]="mobileQuery.matches" *ngIf="shouldRun">
<mat-toolbar color="primary" class="example-toolbar">
<button mat-icon-button (click)="snav.toggle()"><mat-icon>menu</mat-icon></button>
<h1 class="example-app-name">Responsive App</h1>
</mat-toolbar>
<mat-sidenav-container class="example-sidenav-container"
[style.marginTop.px]="mobileQuery.matches ? 56 : 0">
<mat-sidenav #snav [mode]="mobileQuery.matches ? 'over' : 'side'"
[fixedInViewport]="mobileQuery.matches" fixedTopGap="56">
<mat-nav-list>
<a mat-list-item routerLink="." *ngFor="let nav of fillerNav">{{nav}}</a>
</mat-nav-list>
</mat-sidenav>
<mat-sidenav-content>
<p *ngFor="let content of fillerContent">{{content}}</p>
</mat-sidenav-content>
</mat-sidenav-container>
</div>
TS File:
import {MediaMatcher} from '@angular/cdk/layout';
import {ChangeDetectorRef, Component, OnDestroy} from '@angular/core';
/** @title Responsive sidenav */
@Component({
selector: 'sidenav-responsive-example',
templateUrl: 'sidenav-responsive-example.html',
styleUrls: ['sidenav-responsive-example.css'],
})
export class SidenavResponsiveExample implements OnDestroy {
mobileQuery: MediaQueryList;
fillerNav = Array.from({length: 50}, (_, i) => `Nav Item ${i + 1}`);
fillerContent = Array.from({length: 50}, () =>
`Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in
voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.`);
private _mobileQueryListener: () => void;
constructor(changeDetectorRef: ChangeDetectorRef, media: MediaMatcher) {
this.mobileQuery = media.matchMedia('(max-width: 600px)');
this._mobileQueryListener = () => changeDetectorRef.detectChanges();
this.mobileQuery.addListener(this._mobileQueryListener);
}
ngOnDestroy(): void {
this.mobileQuery.removeListener(this._mobileQueryListener);
}
}
CSS File:
.example-container {
display: flex;
flex-direction: column;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
.example-is-mobile .example-toolbar {
position: fixed;
/* Make sure the toolbar will stay on top of the content as it scrolls past. */
z-index: 2;
}
h1.example-app-name {
margin-left: 8px;
}
.example-sidenav-container {
/* When the sidenav is not fixed, stretch the sidenav container to fill the available space. This
causes `<mat-sidenav-content>` to act as our scrolling element for desktop layouts. */
flex: 1;
}
.example-is-mobile .example-sidenav-container {
/* When the sidenav is fixed, don't constrain the height of the sidenav container. This allows the
`<body>` to be our scrolling element for mobile layouts. */
flex: 1 0 auto;
}
- Quel est exactement le problème que vous essayez de résoudre?
- Le problème est que sidenav et de l'en-tête n'est pas collant, je souhaite quand le défilement, ils doivent être corrigés...
Vous devez vous connecter pour publier un commentaire.
De garder la barre d'outils en haut, utilisez
position: fixed
etz-index: 999
. Pour garder lasidenav
à l'extérieur de la zone déroulante, il doit être pris à l'extérieur demd-sidenav-container
Merci pour la création d'un plnkr démo, il a beaucoup aidé à trouver rapidement une solution. Voici la modification de démo.
app.component.html:
app.component.css:
Laissez-moi savoir si c'est ce que vous cherchez.
@Nehal l'exemple a encore un problème où le
<md-sidenav-container>
est en vertu de la barre d'outils supérieure montré ici dans une mise à jour de plnkr:https://plnkr.co/edit/vXB6aUoJCkx8tAJkelbF?p=preview
Si vous suivez l'officiel Angulaire docs, voir le "Fixe sidenav" exemple à partir du lien ci-dessous, vous devriez obtenir le look désiré avec la barre d'outils flottante.
https://material.angular.io/components/sidenav/examples
Plein stackblitz exemple:
https://stackblitz.com/angular/qdpqnrlnpom?file=app%2Fsidenav-fixed-example.ts
J'ai eu le même problème. Je le fixe avec un peu de CSS. Maintenant, j'ai:
Voici le code:
Peut-être quelqu'un peut optimiser mon mauvais CSS à l'aide de certains angulaire/flex-directives de mise en page 🙂