Angular 4 で TypeScript を使ってプラグインなしでスムーズスクロールをページアンカーに実装する方法
RouterModule を使用する
RouterModule は、Angular でルーティングを管理するためのサービスです。このサービスを使用して、ページ内アンカーへのルーティングを定義できます。
import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private router: Router) {}
scrollToAnchor(anchorName: string) {
this.router.navigate(['#', anchorName], { scroll: true });
}
}
上記コードでは、scrollToAnchor
関数が定義されています。この関数は、router.navigate
メソッドを使用して、#
記号とアンカー名を含む URL にルーティングします。scroll
オプションは、ルーティング時にアンカーまでスクロールするように設定します。
HTML テンプレートで、scrollToAnchor
関数を呼び出す a
タグを作成できます。
<a (click)="scrollToAnchor('myAnchor')">My Anchor</a>
ElementRef と Location を使用する
この方法は、ElementRef
と Location
サービスを使用して、ページ内アンカーまで直接スクロールします。
import { Component, ElementRef, ViewChild } from '@angular/core';
import { Location } from '@angular/common';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
@ViewChild('anchorElement') anchorElement: ElementRef;
constructor(private location: Location) {}
scrollToAnchor() {
const element = this.anchorElement.nativeElement;
const yCoordinate = element.offsetTop;
window.scrollTo({
top: yCoordinate,
behavior: 'smooth'
});
}
}
上記コードでは、anchorElement
プロパティを使用して、アンカー要素への参照を取得します。scrollToAnchor
関数は、window.scrollTo
メソッドを使用して、アンカー要素の offsetTop
プロパティに基づいて指定された座標までスクロールします。behavior
オプションは、スクロールをスムーズにするために設定されています。
HTML テンプレートで、#anchorElement
ディレクティブを使用して、アンカー要素に参照を割り当てます。
<div #anchorElement>My Anchor</div>
<button (click)="scrollToAnchor()">Scroll to Anchor</button>
NgOptimizedScroll ライブラリを使用する
NgOptimizedScroll は、Angular でページ内スクロールを処理するためのライブラリです。このライブラリを使用すると、より高度なスクロール アニメーションとオプションを利用できます。
import { Component } from '@angular/core';
import { ScrollToService } from 'ng-optimized-scroll';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private scrollToService: ScrollToService) {}
scrollToAnchor(anchorName: string) {
this.scrollToService.scrollTo(anchorName, {
duration: 500,
easing: 'easeInOutQuad'
});
}
}
上記コードでは、scrollToService
をインジェクションして、scrollTo
メソッドを使用します。このメソッドは、アンカー名、オプションのアニメーション設定 (オプション)、およびオプションのオフセットを渡して呼び出すことができます。
<a (click)="scrollToAnchor('myAnchor')">My Anchor</a>
注意事項
- いずれの方法を使用する場合も、アンカー要素に
id
属性を設定する必要があります。 RouterModule
を使用する場合は、AppRoutingModule
でルートを定義する必要があります。- NgOptimizedScroll ライブラリを使用するには、
npm install ng-optimized-scroll
コマンドを使用してインストールする必要があります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Smooth Scroll to Anchor</title>
</head>
<body>
<a href="#myAnchor">My Anchor</a>
<a href="#anotherAnchor">Another Anchor</a>
<button (click)="scrollToTop()">ページトップへスクロール</button>
<app-root></app-root>
</body>
</html>
app-root {
display: flex;
flex-direction: column;
height: 100vh;
overflow: auto;
}
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private router: Router) {}
ngOnInit() {
const anchorName = this.router.parseUrl(window.location.href).fragment;
if (anchorName) {
this.scrollToAnchor(anchorName);
}
}
scrollToAnchor(anchorName: string) {
this.router.navigate(['#', anchorName], { scroll: true });
}
scrollToTop() {
this.router.navigate([''], { scroll: true });
}
}
app.routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{ path: '', component: AppComponent }
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
このコードでは、app.component.html
テンプレートで 2 つのアンカーリンクを作成しています。app.component.ts
コンポーネントクラスには、scrollToAnchor
関数があります。この関数は、router.navigate
メソッドを使用して、アンカー名を含む URL にルーティングします。scroll
オプションは、ルーティング時にアンカーまでスクロールするように設定します。
ngOnInit
ライフサイクル フックは、コンポーネントが初めて初期化されたときに呼び出されます。このフック内で、router.parseUrl
メソッドを使用して現在の URL からフラグメントを取得します。フラグメントが存在する場合は、scrollToAnchor
関数を使用してそのアンカーまでスクロールします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Smooth Scroll to Anchor</title>
</head>
<body>
<div id="myAnchor">My Anchor</div>
<div id="anotherAnchor">Another Anchor</div>
<button (click)="scrollToTop()">ページトップへスクロール</button>
<app-root></app-root>
</body>
</html>
app-root {
display: flex;
flex-direction: column;
height: 100vh;
overflow: auto;
}
import { Component, ElementRef, ViewChild } from '@angular/core';
import { Location } from '@angular/common';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
@ViewChild('anchorElement') anchorElement: ElementRef;
constructor(private location: Location) {}
scrollToAnchor(anchorName: string) {
const element = document.getElementById(anchorName);
if (element) {
const yCoordinate = element.offsetTop;
window.scrollTo({
top: yCoordinate,
behavior: 'smooth'
});
}
}
scrollToTop() {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
}
}
このコードでは、app.component.html
テンプレートで 2 つのアンカー要素を作成しています。app.component.ts
コンポーネントクラスには、scrollToAnchor
関数があります。この関数は、document.getElementById
メソッドを使用してアンカー要素を取得します。要素が見つかった場合は、window.scrollTo
メソッドを使用して、要素の offsetTop
プロパティに基づいて指定された座標までスクロールします。behavior
オプションは、スクロールをスムーズにするために設定されています。
scrollToTop
関数は、window.scrollTo
メソッドを使用して、ページのトップ (0 ピクセル) までスクロールします。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Smooth Scroll to Anchor</title>
<script src="https://unpkg.com/ng-optimized-scroll@^6/fesm2015/ng-optimized-scroll.min.js"></script>
</head>
<body>
<div id="myAnchor">My Anchor</div>
<div id="anotherAnchor">Another Anchor</div>
<button (click)="scrollToTop()">ページトップへスクロール</button>
<app-root></app-root>
</body>
</html>
app-root {
display: flex;
flex-direction: column;
height: 100vh;
overflow: auto;
}
import { Component } from '@angular/core';
import { ScrollToService } from 'ng-optimized-scroll';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
constructor(private scrollToService: ScrollToService) {}
scrollToAnchor(anchorName: string) {
this.scrollToService.scrollTo(anchorName, {
duration: 500,
easing: 'easeInOutQuad'
});
}
scrollToTop() {
this.scrollToService.scrollTo('', {
duration: 500,
easing: 'easeInOutQuad'
});
}
}
angular typescript scroll