📅  最后修改于: 2023-12-03 14:52:39.943000             🧑  作者: Mango
在Angular5中,我们可以使用@HostListener
来监听组件中DOM元素的事件。结合ElementRef
可以让我们控制DOM元素的行为。下面是一个示例,演示如何在每条路由中单击时使页面滚动到顶部。
import { Component, OnInit, HostListener, ElementRef } from '@angular/core';
import { Router, NavigationEnd } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private router: Router, private el: ElementRef) { }
ngOnInit() {
// 监听路由变化
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
// 每条路由渲染完成后,自动将页面滚动到指定位置
this.scrollToTop();
}
});
}
// 监听视口滚动事件
@HostListener('window:scroll', [])
onWindowScroll() {
const scrollPosition = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
// 根据当前滚动位置来确定是否需要显示返回顶部按钮
const button = document.getElementById('scroll-to-top');
if (button) {
if (scrollPosition > 500) {
button.style.display = 'block';
} else {
button.style.display = 'none';
}
}
}
// 点击返回顶部按钮时执行的操作
onScrollToTop() {
this.scrollToTop();
}
// 将页面滚动到顶部
scrollToTop() {
const scroller = this.el.nativeElement.querySelector('.content');
const scrollTop = Math.max(document.documentElement.scrollTop, document.body.scrollTop);
if (scrollTop > 0) {
window.scrollTo(0, 0);
}
}
}
在上述代码中,我们监听了两个事件,同时实现了两个方法。
首先,我们在ngOnInit
中监听路由变化事件,当每条路由渲染完成后,自动将页面滚动到指定位置。在此之后,我们使用@HostListener
监听了视口滚动事件,根据当前滚动位置来确定是否需要显示返回顶部按钮。最后,在点击返回顶部按钮时执行的操作中,我们通过使用scrollTo
函数实现将页面滚动到顶部。
我们需要在HTML文件中添加一个返回顶部按钮。
<button id="scroll-to-top" class="btn btn-sm btn-primary float-right" (click)="onScrollToTop()" style="display: none;">返回顶部</button>
这个按钮的点击事件将调用onScrollToTop
方法来执行具体的滚动操作。