更改路线不会滚动到新页面的顶部

IT技术 javascript angularjs scroll angularjs-routing
2021-03-08 15:51:38

我发现了一些不受欢迎的,至少对我来说,当路线改变时的行为。在教程http://angular.github.io/angular-phonecat/step-11/app/#/phones的第 11 步中, 您可以看到电话列表。如果您滚动到底部并单击最新的一个,您会看到滚动条不在顶部,而是在中间。

我也在我的一个应用程序中发现了这个,我想知道如何让它滚动到顶部。我可以手动完成,但我认为应该有其他优雅的方式来做到这一点,我不知道。

那么,有没有一种优雅的方式在路由改变时滚动到顶部呢?

6个回答

问题是您的ngView在加载新视图时保留了滚动位置。您可以指示$anchorScroll“在视图更新后滚动视口”(文档有点模糊,但在此处滚动意味着滚动到新视图的顶部)。

解决方案是添加autoscroll="true"到您的 ngView 元素:

<div class="ng-view" autoscroll="true"></div>
这对我有用,页面可以很好地滚动到顶部,但是我正在使用带有 smoothScroll 指令的 scrollTo,有没有办法平滑滚动到顶部?另外,您的解决方案滚动到视图顶部而不是页面可以滚动到页面顶部?
2021-04-22 15:51:38
它对我不起作用,文档没有说它会滚动到顶部
2021-05-01 15:51:38
我发现如果 autoscroll 设置为 true,那么当用户“返回”时,他们会返回页面顶部,而不是离开页面的位置,这是不受欢迎的行为。
2021-05-05 15:51:38
这会将您的视图滚动到此 div。因此,仅当它恰好位于页面顶部时,它才会滚动到页面顶部。否则你将不得不$window.scrollTo(0,0)在 $stateChangeSuccess 事件监听器中运行
2021-05-06 15:51:38
文档状态如果该属性设置为没有值,则启用 scrolling因此,您可以将代码缩短为 just<div class="ng-view" autoscroll></div>并且它的工作原理相同(除非您想使滚动有条件)。
2021-05-10 15:51:38

只要把这段代码运行

$rootScope.$on("$routeChangeSuccess", function (event, currentRoute, previousRoute) {

    window.scrollTo(0, 0);

});
这对我来说效果最好: $rootScope.$on('$stateChangeSuccess',function(){ $("html, body").animate({ scrollTop: 0 }, 200); });
2021-04-29 15:51:38
$window.scrollTop 应该是 $window.scrollTo,否则它说它不存在。这个解决方案效果很好!
2021-05-02 15:51:38
$window.scrollTop(0,0)比自动滚动更适合我。在我的情况下,我有进入和离开转换的视图。
2021-05-06 15:51:38
@JamesGentes 我也需要这个。谢谢。
2021-05-12 15:51:38
这对我来说也比 autoscroll="true" 更好。由于某种原因自动滚动为时已晚,它会在新视图已经可见后滚动到顶部。
2021-05-19 15:51:38

这段代码对我很有用..我希望它也对你有用..你所要做的就是将 $anchorScroll 注入你的运行块并将监听器函数应用到 rootScope 就像我在下面的例子中所做的那样..

 angular.module('myAngularApp')
.run(function($rootScope, Auth, $state, $anchorScroll){
    $rootScope.$on("$locationChangeSuccess", function(){
        $anchorScroll();
    });

下面是 Angularjs module的调用顺序:

  1. app.config()
  2. app.run()
  3. directive's compile functions (if they are found in the dom)
  4. app.controller()
  5. directive's link functions (again, if found)

RUN BLOCK 在注入器创建后执行并用于启动应用程序..这意味着当您重定向到新的路由视图时,运行块中的侦听器调用

$anchorScroll()

您现在可以看到滚动条从新的路由视图开始到顶部:)

最后,一个使用粘性标题的解决方案!谢谢!
2021-04-23 15:51:38

在尝试了ui-view autoscroll=true, $stateChangeStart, $locationChangeStart, $uiViewScrollProvider.useAnchorScroll(),$provide('$uiViewScroll', ...)和许多其他组合的一两个小时后,我无法按预期滚动到新页面的顶部。

这最终对我有用。它捕获 pushState 和 replaceState 并且仅在导航到新页面时更新滚动位置(后退/前进按钮保留其滚动位置):

.run(function($anchorScroll, $window) {
  // hack to scroll to top when navigating to new URLS but not back/forward
  var wrap = function(method) {
    var orig = $window.window.history[method];
    $window.window.history[method] = function() {
      var retval = orig.apply(this, Array.prototype.slice.call(arguments));
      $anchorScroll();
      return retval;
    };
  };
  wrap('pushState');
  wrap('replaceState');
})
这对我的用例很有用。我正在使用带有嵌套视图的 Angular UI-Router(深度有几个级别)。谢谢!
2021-04-22 15:51:38
仅供参考 - 您需要在 angular 中处于 HTML5 模式才能使用 pushState:$locationProvider.html5Mode(true); @wkronkel 在 angular 中不使用 HTML5 模式时,有没有办法实现这一点?由于 html 5 模式处于活动状态,导致页面重新加载引发 404 错误
2021-04-25 15:51:38
@britztopher 您可以连接到内置事件并维护自己的历史记录,对吗?
2021-04-28 15:51:38
@Philll_t:是的,该run函数是每个 angular module对象上都可用的方法。
2021-05-07 15:51:38
你把这个附加.run到哪里?你的app物体的角度
2021-05-11 15:51:38

这是我的(看似)健壮、完整和(相当)简洁的解决方案。它使用与缩小兼容的样式(以及对module的 angular.module(NAME) 访问)。

angular.module('yourModuleName').run(["$rootScope", "$anchorScroll" , function ($rootScope, $anchorScroll) {
    $rootScope.$on("$locationChangeSuccess", function() {
                $anchorScroll();
    });
}]);

PS我发现自动滚动的东西无论设置为true还是false都没有影响。

嗯..这首先将视图滚动到顶部,然后屏幕上的视图对我来说发生了变化。
2021-05-02 15:51:38
我正在寻找的清洁解决方案。如果您单击“返回”,它会将您带到您离开的地方 - 这对某些人来说可能并不理想,但在我的情况下我喜欢它。
2021-05-16 15:51:38