programing

Angular 5 클릭 할 때마다 맨 위로 스크롤

procenter 2021. 1. 16. 10:41
반응형

Angular 5 클릭 할 때마다 맨 위로 스크롤


앵귤러 5를 사용하고 있습니다. 작은 콘텐츠가있는 섹션이 거의없고 콘텐츠가 너무 큰 섹션이 거의없는 대시 보드가있어서 맨 위로 이동하는 동안 라우터를 변경할 때 문제가 발생합니다. 맨 위로 가기 위해 스크롤해야 할 때마다. 누구든지 라우터를 변경할 때 내 시야가 항상 맨 위에 있도록이 문제를 해결하도록 도와 줄 수 있습니까?

미리 감사드립니다.


라우터 아울렛은 새 구성 요소가 인스턴스화 될 때마다 활성화 이벤트를 생성하므로 (activate)이벤트가 맨 위로 스크롤 될 수 있습니다.

app.component.html

<router-outlet (activate)="onActivate($event)" ></router-outlet>

app.component.ts

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

또는 이 답변사용하여 부드러운 스크롤

    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);
    }

모든 구성 요소가 스크롤을 트리거해야하는 것은 아니라고 선택적으로 적용하려면 다음을 확인할 수 있습니다.

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


Angular6.1 이후로 우리는 { scrollPositionRestoration: 'enabled' }열심히로드 된 모듈이나 app.module에서만 사용할 수 있으며 모든 경로에 적용됩니다.

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

또한 부드러운 스크롤을 수행합니다.


Angular 6에서이 문제가 발생 scrollPositionRestoration: 'enabled'하면 app-routing.module.ts의 RouterModule에 매개 변수 추가하여 해결할 수 있습니다 .

@NgModule({
  imports: [RouterModule.forRoot(routes,{
    scrollPositionRestoration: 'enabled'
  })],
  exports: [RouterModule]
})

편집 : Angular 6+의 경우 Nimesh Nishara Indimagedara의 답변을 사용하십시오.

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

원래 답변 :

모두 실패하면 템플릿 (또는 상위 템플릿)에서 id = "top"을 사용하여 상단 (또는 원하는 위치로 스크롤)에 빈 HTML 요소 (예 : div)를 만듭니다.

<div id="top"></div>

그리고 구성 요소 :

  ngAfterViewInit() {
    // Hack: Scrolls to top of Page after page view initialized
    let top = document.getElementById('top');
    if (top !== null) {
      top.scrollIntoView();
      top = null;
    }
  }

이제 Angular 6.1에서 scrollPositionRestoration옵션 이있는 내장 솔루션이 있습니다 .

Angular 2대한 내 대답참조 하십시오 . Route Change에서 맨 위로 스크롤하십시오 .


@Vega가 귀하의 질문에 대한 직접적인 답변을 제공하지만 문제가 있습니다. 브라우저의 뒤로 / 앞으로 버튼이 깨집니다. 사용자가 브라우저 뒤로 또는 앞으로 버튼을 클릭하면 위치를 잃고 상단으로 스크롤됩니다. 사용자가 링크로 이동하기 위해 아래로 스크롤해야하고 스크롤바가 맨 위로 재설정 된 경우에만 뒤로 클릭하기로 결정한 경우 사용자에게 약간의 고통이 될 수 있습니다.

여기 문제에 대한 나의 해결책이 있습니다.

export class AppComponent implements OnInit {
  isPopState = false;

  constructor(private router: Router, private locStrat: LocationStrategy) { }

  ngOnInit(): void {
    this.locStrat.onPopState(() => {
      this.isPopState = true;
    });

    this.router.events.subscribe(event => {
      // Scroll to top if accessing a page, not via browser history stack
      if (event instanceof NavigationEnd && !this.isPopState) {
        window.scrollTo(0, 0);
        this.isPopState = false;
      }

      // Ensures that isPopState is reset
      if (event instanceof NavigationEnd) {
        this.isPopState = false;
      }
    });
  }
}

제 경우에는 방금 추가했습니다.

window.scroll(0,0);

에서 ngOnInit()잘 작동합니다.


다음은 각 구성 요소를 처음 방문하는 경우에만 구성 요소의 맨 위로 스크롤하는 솔루션입니다 (구성 요소별로 다른 작업을 수행해야하는 경우).

각 구성 요소에서 :

export class MyComponent implements OnInit {

firstLoad: boolean = true;

...

ngOnInit() {

  if(this.firstLoad) {
    window.scroll(0,0);
    this.firstLoad = false;
  }
  ...
}

AngularJS에있는 것처럼이 문제에 대한 기본 제공 솔루션을 계속 찾고 있습니다. 하지만 그때까지는이 솔루션이 저에게 효과적입니다. 간단하고 뒤로 버튼 기능을 유지합니다.

app.component.html

<router-outlet (deactivate)="onDeactivate()"></router-outlet>

app.component.ts

onDeactivate() {
  document.body.scrollTop = 0;
  // Alternatively, you can scroll to top by using this other call:
  // window.scrollTo(0, 0)
}

zurfyx 원본 게시물의 답변


화면 스크롤을 조정하는 기능을 생성하기 만하면됩니다.

예를 들면

window.scroll(0,0) OR window.scrollTo() by passing appropriate parameter.

window.scrollTo (xpos, ypos)-> 예상 매개 변수.


이 시도:

app.component.ts

import {Component, OnInit, OnDestroy} from '@angular/core';
import {Router, NavigationEnd} from '@angular/router';
import {filter} from 'rxjs/operators';
import {Subscription} from 'rxjs';

@Component({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit, OnDestroy {
    subscription: Subscription;

    constructor(private router: Router) {
    }

    ngOnInit() {
        this.subscription = this.router.events.pipe(
            filter(event => event instanceof NavigationEnd)
        ).subscribe(() => window.scrollTo(0, 0));
    }

    ngOnDestroy() {
        this.subscription.unsubscribe();
    }
}

export class AppComponent {
  constructor(private router: Router) {
    router.events.subscribe((val) => {
      if (val instanceof NavigationEnd) {
        window.scrollTo(0, 0);
      }
    });
  }

}


구성 요소 : 템플릿에서 작업을 생성하는 대신 모든 라우팅 이벤트를 구독하고 NavigationEnd b / c를 스크롤합니다. 그렇지 않으면 잘못된 탐색이나 차단 된 경로 등에서이 기능이 실행됩니다. 이것은 다음 사항을 알 수있는 확실한 방법입니다. 경로를 성공적으로 탐색 한 다음 스크롤을 부드럽게합니다. 그렇지 않으면 아무것도하지 마십시오.

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit, OnDestroy {

  router$: Subscription;

  constructor(private router: Router) {}

  ngOnInit() {
    this.router$ = this.router.events.subscribe(next => this.onRouteUpdated(next));
  }

  ngOnDestroy() {
    if (this.router$ != null) {
      this.router$.unsubscribe();
    }
  }

  private onRouteUpdated(event: any): void {
    if (event instanceof NavigationEnd) {
      this.smoothScrollTop();
    }
  }

  private smoothScrollTop(): void {
    const scrollToTop = window.setInterval(() => {
      const pos: number = window.pageYOffset;
      if (pos > 0) {
          window.scrollTo(0, pos - 20); // how far to scroll on each step
      } else {
          window.clearInterval(scrollToTop);
      }
    }, 16);
  }

}

HTML

<router-outlet></router-outlet>

이 시도

@NgModule({
  imports: [RouterModule.forRoot(routes,{
    scrollPositionRestoration: 'top'
  })],
  exports: [RouterModule]
})

이 코드는 각도 6 <=을 지원합니다.

ReferenceURL : https://stackoverflow.com/questions/48048299/angular-5-scroll-to-top-on-every-route-click

반응형