前言
這篇主要記錄自己在寫玩具 (side project) 時遇到的小問題,也是蠻常見的需求。
我習慣開發時使用 Bootstrap4 ,而在 Bootstrap4 中有提供 NavBar 的元件供開發者快速套版,亦有相關的 ClassName 可供使用,那麼該如何進一步的提升使用者體驗呢 (UX)?
本文環境
- Angular CLI: 8.3.20
- Angular: 8.2.14
- Bootstrap: 4.3.1
實作
常常看到某些網站的 NavBar 在使用者往下捲動 ScrollBar 時, NavBar 會往上隱藏;反之,當往上捲動時則顯示。
那麼該如何調整 Angular & Bootstrap 來達成我們的需求呢?
Bootstrap
需要進行 HTML & CSS 的調整,程式碼如:
navbar.component.html
1 | <header class="sticky-top" [ngClass]="{'hidden': isNavBarHidden}"> |
navbar.component.scss
1 | .navbar-toggler { |
透過調整 .sticky-top
並且當 ClassName 內同時具有 sticky-top
、 hidden
時透過 transform
隱藏 NavBar 。
Angular
接著需要針對 scroll 進行監聽
navbar.component.ts
1 | import { Component, OnInit, OnDestroy } from '@angular/core'; |
說明:
- 監聽
scroll 滾動事件
- 於
ngOnDestroy
時將監聽卸掉 - 由於
scroll 滾動事件
觸發的非常頻繁,需要加上額外的措施- 如 MDN 建議
- 關於
requestAnimationFrame
的補充 - 使用一個屬性來記錄最後
scrollY
的位置,如last_known_scroll_position
- 這樣才有辦法比較當前的
window.scrollY
與last_known_scroll_position
是往上捲還是往下捲 - 先比較,最後才更新
last_known_scroll_position
的值
- 這樣才有辦法比較當前的
- 根據捲動的方向給予對應的 ClassName
成果展示
結論
因為還沒這個玩具還沒完成,暫時還不想公開,所以就不附上完整的 code 了。
不過這個範例還蠻簡單的,我想應該貼上片段就足夠了 (?)
這樣就達成強化 NavBar UX 的目的了:
- 往下捲可能代表使用者想看畫面的內容,所以隱藏 NavBar
- 往上捲可能代表使用者在找 NavBar ,所以顯示
如果不想只單純的使用 sticky-top
不妨嘗試這樣的方式,讓網站更加活潑哦~