当前位置: 首页 > 知识库问答 >
问题:

改变路线时向顶部滚动角度2

安建木
2023-03-14

在我的Angular 2应用程序中,当我向下滚动一个页面并点击页面底部的链接时,它会改变路径并带我进入下一个页面,但它不会滚动到页面顶部。因此,如果第一页很长,而第二页的内容很少,就会给人一种第二页缺少内容的印象。因为只有当用户滚动到页面顶部时,内容才可见。

我可以在组件的ngInit中滚动窗口到页面顶部但是,有没有更好的解决方案可以自动处理我的应用程序中的所有路线?

共有1个答案

鲁博赡
2023-03-14

Angular 6.1及更高版本:

Angular 6.1(发布于2018-07-25)通过一个名为“路由器滚动位置恢复”的功能增加了内置支持来处理这个问题。正如Angular官方博客中所描述的,您只需在路由器配置中启用此功能,如下所示:

RouterModule.forRoot(routes, {scrollPositionRestoration: 'enabled'})

此外,博客还说“预计这将成为未来主要版本的默认设置”。到目前为止,这还没有发生(从Angular 11.0开始),但最终您将不需要在代码中做任何事情,并且这将直接正确地工作。

您可以在官方文档中看到更多关于此特性的详细信息以及如何自定义此行为。

Angular 6.0及更早版本:

虽然@guilhermeireles的出色回答解决了原来的问题,但它引入了一个新的问题,打破了您在往后或向前导航时预期的正常行为(使用浏览器按钮或通过代码中的位置)。预期的行为是,当您导航回页面时,它应该保持向下滚动到与您单击链接时相同的位置,但到达每个页面时滚动到顶部显然打破了这种预期。

下面的代码通过订阅Location的PopStateEvent序列并跳过scroll-to-top逻辑来检测这种导航,如果新到达的页面是这样一个事件的结果的话。

如果返回的页面足够长,可以覆盖整个视区,滚动位置会自动恢复,但正如@Jordannelson正确指出的,如果页面较短,则需要跟踪原始的y滚动位置,并在返回页面时显式恢复。代码的更新版本也涵盖了这种情况,它总是显式地恢复滚动位置。

import { Component, OnInit } from '@angular/core';
import { Router, NavigationStart, NavigationEnd } from '@angular/router';
import { Location, PopStateEvent } from "@angular/common";

@Component({
    selector: 'my-app',
    template: '<ng-content></ng-content>',
})
export class MyAppComponent implements OnInit {

    private lastPoppedUrl: string;
    private yScrollStack: number[] = [];

    constructor(private router: Router, private location: Location) { }

    ngOnInit() {
        this.location.subscribe((ev:PopStateEvent) => {
            this.lastPoppedUrl = ev.url;
        });
        this.router.events.subscribe((ev:any) => {
            if (ev instanceof NavigationStart) {
                if (ev.url != this.lastPoppedUrl)
                    this.yScrollStack.push(window.scrollY);
            } else if (ev instanceof NavigationEnd) {
                if (ev.url == this.lastPoppedUrl) {
                    this.lastPoppedUrl = undefined;
                    window.scrollTo(0, this.yScrollStack.pop());
                } else
                    window.scrollTo(0, 0);
            }
        });
    }
}
 类似资料:
  • 问题内容: 我刚刚升级到从和我已经注意到,状态改变时,滚动位置跳到德子的顶部是新状态的主题。 很好,但是我有两个问题: 1)我在页面顶部和之间填充了30px的空白,我希望它滚动到页面顶部,并留出一定的空隙。目前,它正好到达看起来难看的顶部。为此,我想我要么需要知道如何使其滚动到ui视图所在的div的顶部(而不是浏览器),要么我需要找出如何重写才能滚动到负30px 。 我已经尝试过,但是如果这样做,

  • 当路线改变时,我发现了一些不受欢迎的行为,至少对我来说是这样。在本教程的第11步中http://angular.github.io/angular-phonecat/step-11/app/#/phones你可以看到电话列表。如果你滚动到底部,点击最新的一个,你可以看到滚动不是在顶部,而是在中间。 我在我的一个应用程序中也发现了这一点,我想知道如何才能让它滚动到顶部。我可以很有礼貌地做这件事,但我

  • 问题内容: 我想在用户滚动角度方式时更改CSS元素。 这是使用JQuery方式的代码 我尝试使用以下代码执行Angular方式,但是$ scope.scroll似乎无法正确获取滚动数据。 Muchos gracias好友! 问题答案: 请记住,在Angular中,DOM访问应从指令内部进行。这是一个简单的指令,可根据窗口的设置变量。 对我来说,您到底要寻找什么样的最终结果尚不清楚,所以这是一个简单

  • 问题内容: 我正在尝试进行反向无限滚动。我有,我收到了近10篇最近的评论,并希望用户能够滚动评论列表 最多 检索下一个10 -类似FB它显示了最近的评论的“获取前”链接,而是通过滚动事件,而不是链接。 我从http://jsfiddle.net/vojtajina/U7Bz9/开始,尝试将其修改为反向无限滚动,并很快以如下形式结束了: http://jsfiddle.net/digger69/Fw

  • 问题内容: 这是我的onCreate,它处理适配器,LinearLayoutManager等。我尝试了每个选项以尝试将其滚动到顶部,但不能。我什至尝试创建自己的自定义LinearLayoutManager。 问题答案: 您尝试过还是? RecyclerView不会在其中实现任何滚动逻辑,而是更加具体,它会根据实现的布局转到特定的索引,在您的情况下是线性的。

  • 本文向大家介绍jQuery 顶部导航跟随滚动条滚动固定浮动在顶部,包括了jQuery 顶部导航跟随滚动条滚动固定浮动在顶部的使用技巧和注意事项,需要的朋友参考一下