javascript - 当页面标题在 sidenav 内容中不可见时,在工具栏中显示文本
问题描述
我正在做一个有角度的项目(我还在学习,还是个新手)。我想知道当用户向下滚动sidenav页面内容时,当工具栏与文本( JAMES SMITH-PLACA:ABC1234 )重叠时,如何在工具栏中设置标题(驱动程序名称和信息)。
我分叉了一个样板 sidenav 代码与您分享https://stackblitz.com/edit/angular-closing-side-nav-in-mobile-z35xfw?file=app/sidenav-responsive-example.html
这就是我想要实现的。
在此先感谢您的帮助。
解决方案
我做了这个功能,你基本上可以在stackblitz中看到它,我对标题做了一个引用(检查HTML中的第39行),检查这个标题是否可见的逻辑是:
this.titleIsVisible =
bounding.top >= 0 &&
bounding.left >= 0 &&
bounding.right <=
(window.innerWidth || document.documentElement.clientWidth) &&
bounding.bottom <=
(window.innerHeight || document.documentElement.clientHeight);
监听我@HostListener("window:scroll", ["$event"])
在 TS 和我刚刚使用的 HTML 中使用的滚动事件(滚动)。要查看这一点,请检查 TS 中的第 28 行和 HTML 中的第 30 行。
以防万一,这是代码。
import { Component, ViewChild, ElementRef, HostListener } from "@angular/core";
import {
BreakpointObserver,
Breakpoints,
BreakpointState
} from "@angular/cdk/layout";
import { FormControl } from "@angular/forms";
import { Observable } from "rxjs";
import { map } from "rxjs/operators";
/** @title Responsive sidenav */
@Component({
selector: "sidenav-responsive-example",
templateUrl: "sidenav-responsive-example.html",
styleUrls: ["sidenav-responsive-example.css"]
})
export class SidenavResponsiveExample {
@ViewChild("drawer") drawer: any;
@ViewChild("title") title: ElementRef;
public selectedItem: string = "";
public isHandset$: Observable<boolean> = this.breakpointObserver
.observe(Breakpoints.Handset)
.pipe(map((result: BreakpointState) => result.matches));
public titleIsVisible: boolean = true;
constructor(private breakpointObserver: BreakpointObserver) {}
@HostListener("window:scroll", ["$event"])
onScroll() {
const bounding = this.title.nativeElement.getBoundingClientRect();
this.titleIsVisible =
bounding.top >= 0 &&
bounding.left >= 0 &&
bounding.right <=
(window.innerWidth || document.documentElement.clientWidth) &&
bounding.bottom <=
(window.innerHeight || document.documentElement.clientHeight);
}
closeSideNav() {
if (this.drawer._mode == "over") {
this.drawer.close();
}
}
}
<mat-sidenav-container class="sidenav-container">
<mat-sidenav #drawer fixedInViewport="true" [attr.role]="(isHandset$ | async) ? 'dialog' : 'navigation'"
[mode]="(isHandset$ | async) ? 'over' : 'side'" [opened]="!(isHandset$ | async)">
<mat-toolbar color="primary" style="margin-top:30px;"> Business</mat-toolbar>
<mat-nav-list >
<mat-list-item (click)="closeSideNav()">
<mat-icon matListIcon>home</mat-icon>
<a matLine>Home</a>
</mat-list-item>
<mat-list-item (click)="closeSideNav()">
<mat-icon matListIcon>person</mat-icon>
<a matLine>Customers</a>
</mat-list-item>
<mat-list-item (click)="closeSideNav()">
<mat-icon matListIcon>group_work</mat-icon>
<a matLine>employees</a>
</mat-list-item>
<mat-list-item (click)="closeSideNav()">
<mat-icon matListIcon>business</mat-icon>
<a matLine>business</a>
</mat-list-item>
</mat-nav-list>
</mat-sidenav>
<mat-sidenav-content (scroll)="onScroll($event)">
<mat-toolbar color="primary">
<button type="button" aria-label="Toggle sidenav" mat-icon-button (click)="drawer.toggle()" *ngIf="isHandset$ | async">
<mat-icon aria-label="Side nav toggle icon">menu</mat-icon>
</button>
<h1 *ngIf=!titleIsVisible>TITLE</h1>
</mat-toolbar>
<div class="ylb-app-content">
<h1 #title >TITLE</h1>
<div >
"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."
"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."
"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."
"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."
"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."
"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."
"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."
</div>
<ng-content>
</ng-content>
</div>
</mat-sidenav-content>
</mat-sidenav-container>
推荐阅读
- android - 来自崩溃的 Android 应用程序的反馈消息出现在哪里?
- javascript - 使用简单的javascript返回格式化日期('YYYY-MM-DD')获取fromDate和toDate之间的日期
- sql-server - 编写通用存储过程以从表中获取值的缺点
- android - 此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 6.0 不兼容?当我降级 gradle 版本时
- django - 在 django_admin_log 中添加页面查看记录和更改详情
- redis - Redis MATCH操作中如何使用OR条件
- ajax - 在wordpress中将数组从ajax传递到php
- angular - Angular Reactive Forms 控件与 Get
- javascript - 带单选按钮的角度动态 html 绑定
- c - 在 C 中设置 open() 系统调用的权限