Angular 5在显示mat-sidenav-container时停止背景滚动

Posted

技术标签:

【中文标题】Angular 5在显示mat-sidenav-container时停止背景滚动【英文标题】:Angular 5 Stop background scrolling when mat-sidenav-container displayed 【发布时间】:2018-09-28 08:14:21 【问题描述】:

我正在创建一个具有 mat-sidenav 的新 Angular 5 站点,但我遇到了问题。

我的mat-sidenav-container 位于我的position: fixed 主菜单下,这很好,但如果页面有垂直滚动,如果显示mat-sidenav,它也会滚动。

如果显示mat-sidenav,我想要停止返回内容滚动,但我不知道CSS 这样做,因为我已经尝试了所有position

HTML

<mat-toolbar>
    <mat-icon class="subMenuIcon" (click)="sidenav.toggle()" title="Click to open the sub-menu.">reorder</mat-icon>
    <img src="./assets/images/Crest.jpg">LEARNING SITE
    <div class="emptySpace"></div>        
    <mat-icon class="loggedInIcon">person</mat-icon>
    <span style="font-size: 15px">USERNAME</span>
</mat-toolbar>
<mat-sidenav-container>
    <mat-sidenav #sidenav mode="over" opened="false">
        <div class="closeButton">
            <mat-icon (click)="sidenav.toggle()" title="Click to close the sub-menu.">clear</mat-icon>
        </div>
        <a (click)="sidenav.toggle()" routerLink="/">
            <mat-icon>person</mat-icon>
            Dashboard
        </a>
        <a (click)="sidenav.toggle()" routerLink="search">
            <mat-icon>search</mat-icon>
            Search
        </a>
    </mat-sidenav>
</mat-sidenav-container>
<router-outlet></router-outlet>

CSS

mat-sidenav 
    background-color: gray;
    margin-top: 64px;
    color: #ffffff;
    transition: 0.5s;
    padding: 7px;


mat-sidenav a 
    margin-top: 15px;
    margin-bottom: 15px;
    font-size: 17px;
    color: #ffffff;
    display: block;


mat-sidenav a:hover 
    color: #c41230;
    cursor: pointer;


.closeButton 
    text-align: right;
    margin-bottom: 15px;
    cursor: pointer;


.mat-drawer-container 
    position: static;


/* Moves the side-nav to below the main menu */
.mat-drawer-backdrop 
    margin-top: 64px !important;

【问题讨论】:

【参考方案1】:

由于&lt;mat-sidenav #sidenav&gt; 有一个模板引用变量(#sidenav),&lt;mat-sidenav-container&gt; 可以使用条件样式固定(就位),从而在 sidnav 打开时有效地移除背景滚动。

<mat-sidenav-container [ngStyle] = " 'position' : sidenav.opened ? 'fixed' : 'relative'">

【讨论】:

它确实有效,但有一个错误。页面滚动到顶部,这不好。【参考方案2】:

方法一

在您的组件(side-nav 所在的位置)中,添加一个 hostListener,您可以在其中停止滚动事件的传播,然后只有您的 sidenav 会滚动,而不是背景。

  @HostListener("window:scroll", ["$event"])
  onWindowScroll(event) 
    // prevent the background from scrolling when the dialog is open.
    event.stopPropagation();
  

方法 2

您可以向 sidenav 添加滚动侦听器,并在那里停止传播。在你的组件中添加一个方法,并在你的 html 中使用它:

在 html 中添加: (scroll)="onSideNavScroll($event)" 到您的侧导航,如下所示:

<mat-sidenav-container (scroll)="onSideNavScroll($event)">
        <mat-sidenav #sidenav mode="over" opened="false">
            <div class="closeButton">
                <mat-icon (click)="sidenav.toggle()" title="Click to close the sub-menu.">clear</mat-icon>
            </div>
            <a (click)="sidenav.toggle()" routerLink="/">
                <mat-icon>person</mat-icon>
                Dashboard
            </a>
            <a (click)="sidenav.toggle()" routerLink="search">
                <mat-icon>search</mat-icon>
                Search
            </a>
        </mat-sidenav>
    </mat-sidenav-container>

在你的组件中,添加这个函数:

onSideNavScroll(event) event.stopPropagation() 

【讨论】:

请注意,onWindowScroll(event) 中的变量 event 未定义。将以下内容应用于方法 1 中的第一行:@HostListener("window:scroll", ["$event"])。我在 Angular 6+ 中使用过这个。 我尝试了这两个选项。他们都没有工作。您知道如何在显示 sidenav 时停止滚动主要内容吗? 没有看过你的代码很难说清楚。也许您可以提出问题、链接到该主题并从那里获得帮助?【参考方案3】:

在 mat-sidenav 中添加 fixedInViewport="true" 可能会解决此问题,同时添加 [style.marginTop.px]="56"

【讨论】:

这有助于将抽屉固定在适当的位置,但另一行会搞砸一切。 您可以使用fixedTopGap 属性来代替手动设置marginTop material.angular.io/components/sidenav/api#MatSidenav【参考方案4】:

设法做到了一点CSS。不用担心后面的内容会滚动,但现在我的 side-nav 和背景不会移动

使用的 CSS

.mat-drawer:not(.mat-drawer-side) 
    position: fixed;


.mat-drawer-backdrop 
    position: fixed !important;

【讨论】:

当 mat-sidenav 显示时,您是否设法避免在主要内容中显示滚动条?

以上是关于Angular 5在显示mat-sidenav-container时停止背景滚动的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 5 中显示来自 Json Mapper 的数据?

angular 5显示嵌套的问题和答案在它的父项下显示项目

显示 Json 数组 Angular 5 HttpClient

JSON响应的Angular 5显示结果

Angular 5在显示mat-sidenav-container时停止背景滚动

Angular 5:使用异步管道搜索 - 显示加载指示器