我当前正在使用Angular 6.1.5。当网站路由到其他页面时,我希望页面可以滚动回到顶部。我尝试使用{ scrollPositionRestoration: 'top' }
,但不起作用。
这是我在app.routing.ts中的代码。
export const routing = RouterModule.forRoot(appRoutes, { scrollPositionRestoration: 'top' });
是否有替代方法?我尝试从“最高”更改为“启用”,但效果不佳。我还尝试了window.scrollTo(0,0);
并将其放在ngOnInit()
中,但这也不起作用。
答案 0 :(得分:1)
在我的情况下不起作用,因为我的 CSS 上有这个。
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
我改成
scroll-behavior: auto;
然后它开始工作
答案 1 :(得分:0)
更新代码中的选项,并为其提供一个scrollOffset
。
export const routing = RouterModule.forRoot(appRoutes, { scrollOffset: [0, 0], scrollPositionRestoration: 'top' });
另一种选择是更“手动”执行。这是StackBlitz的演示方法。基本上,可以在应用程序的输入组件(或带有表单的应用程序区域的输入组件)中订阅路由器事件,并可以在NavigationEnd
上使用window.scrollTo
import { Component } from '@angular/core';
import { Router, Event, NavigationEnd } from '@angular/router';
import { filter } from 'rxjs/operators';
@Component({
selector: 'my-app',
template: '<router-outlet></router-outlet>'
})
export class AppComponent {
constructor(
router: Router
) {
router.events
.pipe(filter((routerEvent: Event) => routerEvent instanceof NavigationEnd))
.subscribe(() => window.scrollTo(0, 0));
}
}
答案 2 :(得分:0)
由于使用的是路由器插座,所以components元素的大小可能为0x0。
通过在app-root上添加CSS规则以显示块,使scrollPositionRestoration
起作用:
app-root {
display: block;
}
export const routing = RouterModule.forRoot(appRoutes, { scrollOffset: [0, 0], scrollPositionRestoration: 'top' });
应该可以。
答案 3 :(得分:0)
对我而言,在Angular 10.2.x上唯一适用的解决方案是使用setTimeout持续190毫秒!如果我将计时器设置为190ms以下,则无法滚动!
当我将计时器设置为300ms时,我可以看到路由后页面如何首先滚动到不需要的位置,然后页面滚动至0(应有的位置)。我仍然不知道Angular中的哪个过程会导致在转到页面后不必要的滚动。
我尝试了其他建议的解决方案。例如,例如更改scrollPositionRestoration属性的值并在AfterViewInit挂钩中执行强制滚动,更改body标签的全局高度并在路由器出口等上使用(激活),但这仅是有帮助的。这很可能是Angular 10.2.x路由器中的某种错误
constructor(
private router: Router,
) {
router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
setTimeout(() => {
document.documentElement.scrollTop = 0; // || window.scrollTo(0, 0);
}, 190);
}
}