Angular 5 Scroll to top on every Route click

后端 未结 18 1851
遇见更好的自我
遇见更好的自我 2020-11-29 17:49

I am using angular 5. I have a dashboard where I have few sections with small content and few sections with so large content that I am facing a problem when changing router

18条回答
  •  遥遥无期
    2020-11-29 18:18

    There are some solutions, make sure to check them all :)


    The router outlet will emit the activate event any time a new component is being instantiated, so we could use (activate) to scroll (for example) to the top:

    app.component.html

    
    

    app.component.ts

    onActivate(event) {
        window.scroll(0,0);
        //or document.body.scrollTop = 0;
        //or document.querySelector('body').scrollTo(0,0)
        ...
    }
    

    Use, for exemple, this solution for a smooth scroll:

        onActivate(event) {
            let scrollToTop = window.setInterval(() => {
                let pos = window.pageYOffset;
                if (pos > 0) {
                    window.scrollTo(0, pos - 20); // how far to scroll on each step
                } else {
                    window.clearInterval(scrollToTop);
                }
            }, 16);
        }
    

    If you wish to be selective, say not every component should trigger the scrolling, you can check it in an if statement like this:

    onActivate(e) {
        if (e.constructor.name)==="login"{ // for example
                window.scroll(0,0);
        }
    }
    

    Since Angular6.1, we can also use { scrollPositionRestoration: 'enabled' } on eagerly loaded modules and it will be applied to all routes:

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

    It will also do the smooth scrolling, already. However this has the inconvenient for doing it on every routing.


    An other solution is to do the top scrolling on router animation. Add this in every transition where you want to scroll to the top:

    query(':enter, :leave', style({ position: 'fixed' }), { optional: true }) 
    

提交回复
热议问题