前提・実現したいこと
AngularでWEBサイトを製作しており、スクロールすると色が変わるヘッダーメニューを作りました。
ページトップでは透明で、スクロールするとfixedクラスが付与されて黒になるというものです。
しかし、トップ(home)ページ以外のページ(今回のcontactページ)ではスクロール関係無しに常に黒いヘッダーにしたいです。
発生している問題
「ページ遷移後、URLがcontactであれば、not-homeクラスを付けて背景色を黒にする」というイメージで書きました。
確かにこれで遷移直後はnot-homeクラスが付いているのですが、スクロールするとnot-homeが消えてしまい、onWindowScrollの処理が優先されます。
そのため、ページトップまでスクロールするとfixedクラスも消え、透明なヘッダーになります。
トップページでは背景が動画のため、下へスクロールするまでは背景透明の白文字ヘッダーで良いのですが、トップ以外のページでは背景が白なので、ヘッダーが黒でないと文字が見辛く、その問題を解決したいです。
該当のソースコード
html
1 <!-- header.component.html --> 2<nav class="float-menu {{navbarStyle}}"> 3 <div class="head-wrap"> 4 <div class="pc-menu"> 5 <div class="ui secondary menu"> 6 <a class="item" href="#"> 7 <span class="color:white;">Logo</span> 8 </a> 9 <div class="right menu"> 10 <!-- #aboutはhomeページのアンカーリンク --> 11 <a href="#about">はじめに</a> 12 <a routerLink="/contact">お問合せ</a> 13 </div> 14 </div> 15 </div> 16 </div> 17</nav>
css
1// header.component.css 2.float-menu { 3 position: fixed; 4 top: 0; 5 width: 100%; 6 margin: 0 auto; 7 z-index: 10; 8 transition: all 0.5s ease; 9} 10 11.float-menu.fixed { 12 background: rgba(0,0,0,.6); 13} 14 15.float-menu.not-home { 16 background: rgba(0,0,0,.6); 17}
ts
1// header.component.ts 2import { Component, OnInit, HostListener } from '@angular/core'; 3import { Router, NavigationEnd, Event as NavigationEvent } from '@angular/router'; 4import { Constant } from '../constant'; 5 6@Component({ 7 selector: 'app-header', 8 templateUrl: './header.component.html', 9 styleUrls: ['./header.component.css'] 10}) 11export class HeaderComponent implements OnInit { 12 public navbarStyle = 'hidden'; 13 14 constructor( 15 private router: Router 16 ) { } 17 18 ngOnInit() { 19 this.router.events.forEach((event: NavigationEvent) => { 20 // ページ遷移後の処理 21 if (event instanceof NavigationEnd) { 22 if (event.urlAfterRedirects.indexOf(Constant.rpContact) >= 0) { 23 this.navbarStyle = 'not-home'; 24 } 25 } 26 }); 27 } 28 29 @HostListener('window:scroll', []) 30 onWindowScroll() { 31 if (window.pageYOffset > 20) { 32 this.navbarStyle = 'fixed'; 33 } else { 34 this.navbarStyle = ''; 35 } 36 } 37}
ts
1// constant.ts 2export class Constant { 3 //ルーティングパス 4 static readonly rpHome = ''; 5 static readonly rpContact = 'contact'; 6}
ts
1// app-routing.module.ts 2import { RouterModule, Routes } from '@angular/router'; 3import { NgModule } from '@angular/core'; 4import { HomeComponent } from './home/home.component'; 5import { ContactComponent } from './contact/contact.component'; 6 7const routes: Routes = [ 8 { path: '', component: HomeComponent }, 9 { path: 'contact', component: ContactComponent } 10]; 11@NgModule({ 12 imports: [ 13 RouterModule.forRoot(routes, { 14 scrollPositionRestoration: 'enabled', 15 anchorScrolling: 'enabled', 16 scrollOffset: [0, 0] 17 }) 18 ], 19 exports: [RouterModule], 20 providers: [] 21}) 22export class AppRoutingModule {}
開発環境
Angular CLI: 10.0.6 Node: 12.18.3 OS: darwin x64 Angular: 10.0.10 ... animations, common, compiler, compiler-cli, core, forms ... language-service, platform-browser, platform-browser-dynamic ... router Ivy Workspace: Yes Package Version ----------------------------------------------------------- @angular-devkit/architect 0.1000.6 @angular-devkit/build-angular 0.1000.6 @angular-devkit/build-optimizer 0.1000.6 @angular-devkit/build-webpack 0.1000.6 @angular-devkit/core 10.0.6 @angular-devkit/schematics 10.0.6 @angular/cdk 10.1.3 @angular/cli 10.0.6 @angular/material 10.1.3 @ngtools/webpack 10.0.6 @schematics/angular 10.0.6 @schematics/update 0.1000.6 rxjs 6.6.2 typescript 3.9.7 webpack 4.43.0
見様見真似で書いたコードで分かりづらく申し訳ありません。
また、初めて質問するので至らない点も多々あるかと思います。
どなたかAngularやTypeScriptの書き方に詳しい方、お知恵をお貸し下さい。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/20 01:33
2020/08/20 01:44
2020/08/20 01:49
2020/08/20 01:58
2020/08/20 02:34