Angular2 Webアプリケーションに取り組んでいますが、次の支援が必要です。私のページは複数のコンポーネントで構成されています。ユーザーがボタンをクリックしたときにページの上部をスクロールしたい。私は試した document.body.scrollTop = 0;
しかし、これはChromeでは機能しません。 document.documentElement.scrollTop = 0; window.scrollTo(0、0);を試しました。しかし、動作していません
このようなインポート、
import { Inject} from "@angular/core";
import { DOCUMENT } from '@angular/platform-browser';
コンストラクタにこれを追加し、
constructor(@Inject(DOCUMENT) private document: Document) { }
次に、このようにスクロールを設定できます。
this.document.body.scrollTop = 0;
データバインディングを使用してangularスクロールの問題を解決しました。
<div class="container" [scrollTop]="scrollTop"> ... </div>
スタイル付き:
.container {
height: 100%;
scroll: auto;
position: relative;
}
App.component.tsで
const mainDiv = document.getElementById('mainDIV');
mainDiv.scrollTop = 0;
App.component.htmlで
<div id="mainDIV" style="height: 100vh;overflow: auto;">
<app-header></app-header>
<router-outlet></router-outlet>
<app-footer></app-footer>
</div>
ただ使用する:
window.scroll(0, 0);
そのための指令を書くことを提案します。使用しているモジュールに必ずインポートしてください。
import { Directive, HostListener } from '@angular/core';
@Directive({
selector: '[scrollToTop]'
})
export class ScrollToTopDirective {
@HostListener('click')
public onClick() {
if (window && window.pageYOffset) {
window.scroll(0, 0);
}
}
}
以下のように使用します
<button scrollToTop>Scroll to Top</button>
Angularベストプラクティスに従って、ディレクティブにプレフィックスを追加することも検討してください。
以下のコードを使用してください。私の場合
this.document.body.scrollTop = 0
働いていないが
this.document.documentElement.scrollTop = 0
ワーキング。ブラウザーの依存関係もあります。
import { Inject} from "@angular/core";
import { DOCUMENT } from '@angular/platform-browser';
constructor(@Inject(DOCUMENT) private document: Document) { }
this.document.documentElement.scrollTop = 0;
htmlコード:
<div class="scroll-to-top" [ngClass]="{'show-scroll': navIsFixed}">
<button (click)="scrollToTop()">
Top
</button>
</div>
cSSコード:
.scroll-to-top {
position: fixed;
bottom: 15px;
right: 15px;
opacity: 0;
transition: all .2s ease-in-out;
}
.show-scroll {
opacity: 1;
transition: all .2s ease-in-out;
}
tsコード:
import {Component, OnInit, Inject, HostListener} from '@angular/core';
import { DOCUMENT } from "@angular/platform-browser";
import { BrowserModule } from '@angular/platform-browser';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'Hard Hitter@Cool';
navIsFixed: boolean;
constructor(@Inject(DOCUMENT) private document: Document){
}
@HostListener("window:scroll", [])
onWindowScroll() {
if (window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop > 100) {
this.navIsFixed = true;
} else if (this.navIsFixed && window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop < 10) { this.navIsFixed = false; } } scrollToTop() { (function smoothscroll() { var currentScroll = document.documentElement.scrollTop || document.body.scrollTop; if (currentScroll > 0) {
window.requestAnimationFrame(smoothscroll);
window.scrollTo(0, currentScroll - (currentScroll / 5));
}
})();
}
}
それがウィンドウスクロールではなく、彼自身のスクロールを持つdivだけである場合、これは動作するはずです:
GloabalサービスWindowRef:
import { Injectable } from '@angular/core';
function _window(): any {
// return the global native browser window object
return window;
}
@Injectable()
export class WindowRef {
get nativeWindow(): any {
return _window().document;
}
}
コンストラクタに追加します:
constructor(private winRef: WindowRef) {}
そして、あなたがそれを置きたいコードで、この行を追加するだけです:
this.winRef.nativeWindow.getElementsByClass('nameOfClass')[0].scroll(0, 0);
もちろん、getElementByTagName、getElementById、getElementByNameなどの他のセレクターも使用できます...
この引数をコンストラクタに挿入します:@Inject(DOCUMENT) private document: Document
次に、scrollIntoView
関数を呼び出します。
this.document.body.scrollIntoView({
block: 'start',
behavior: 'smooth'
});
準備完了!! :)