teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コメントを受けて、より詳細に回答

2020/08/20 01:56

投稿

miyabi_pudding
miyabi_pudding

スコア9559

answer CHANGED
@@ -5,6 +5,54 @@
5
5
  対して、`@HostListener('window:scroll', [])`の処理は、
6
6
  **スクロールの度に**処理が実行されるので、そちらの処理が有効になるのは当然の話です。
7
7
 
8
+ コメントを受けまして、考え方と、例示をします。
9
+ `home`かどうかを、クラスプロパティとして、保持し、それをもって、
10
+ **スクロール20px以内時のクラス名を動的に変更**とすればいいかと。
11
+ 下記構文でいかがでしょうか。
12
+
13
+ ```typescript
14
+ // 上部構文は省略
15
+
16
+ export class HeaderComponent implements OnInit {
17
+ public navbarStyle = 'hidden';
18
+ // ホームかどうかをbooleanで保持するためのプロパティ
19
+ private homeFlg = true;
20
+
21
+ constructor(
22
+ private router: Router
23
+ ) { }
24
+
25
+ ngOnInit() {
26
+ this.router.events.forEach((event: NavigationEvent) => {
27
+ // ページ遷移後の処理
28
+ if (event instanceof NavigationEnd) {
29
+ if (event.urlAfterRedirects.includes(Constant.rpContact)) {
30
+ this.navbarStyle = 'not-home';
31
+ this.homeFlg = false;
32
+ } else {
33
+ this.homeFlg = true;
34
+ }
35
+ }
36
+ });
37
+ }
38
+
39
+ @HostListener('window:scroll', [])
40
+ onWindowScroll() {
41
+ if (window.pageYOffset > 20) {
42
+ this.navbarStyle = 'fixed';
43
+ } else {
44
+ this.navbarStyle = this.homeFlg ? '' : 'not-home';
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ つまりは、`home`かどうかを保持しておき、その真偽によって、当てるクラス文字列を変える、という感じです。
51
+ あとは、もし条件を増やしたいとなれば、
52
+ `ngOnInit`メソッド中にて、`switch`構文によって、条件を入れ替えたり、すればいいかと。
53
+
54
+ ---- 以下元構文回答 ----
55
+
8
56
  `onWindowScroll`の処理中の、
9
57
  `this.navbarStyle = '';`を
10
58
  `this.navbarStyle = 'not-home';`にすればいいのではないでしょうか?