使用vue實現選單隱藏功能
最近用蝦皮買東西發現有個功能滿喜歡的,在app上搜尋商品的時候只要開始往下滑動畫面,選單欄就會消失,但如果只要往上移動一些些,選單欄就會跑出來可以執行想要的操作
想了一下這個功能可以如何實現,以下是透過改變class的方式
前置
框架:vue3 composition API
html畫面:上方是選單(class='navbar')
綁定class條件:當isHidden為true時,加上hidden這個class
下方是內容區塊
<template>
<div class="app">
<!-- 選單 (滾動時隱藏/顯示) -->
<div :class="['navbar', { 'hidden': isHidden }]">
選單
</div>
<!-- 內容區塊 -->
<div class="content">
</div>
</div>
</template>
Javascript
設定isHidden初始值(記得用ref)
給定滾動值lastScrollY = 0
設定監聽事件
<script setup>
import { ref, onMounted, onUnmounted } from "vue";
const isHidden = ref(false);
let lastScrollY = 0;
// 監聽滾動事件
const handleScroll = () => {
const currentScrollY = window.scrollY;
isHidden.value = currentScrollY > lastScrollY; // 如果往下滾動,隱藏選單
lastScrollY = currentScrollY;
};
// 掛載/移除滾動監聽
onMounted(() => {
window.addEventListener("scroll", handleScroll);
});
onUnmounted(() => {
window.removeEventListener("scroll", handleScroll);
});
</script>
<style>
/* 選單樣式 */
.navbar {
position: fixed;
top: 0;
left: 0;
width: 100%;
background: rgba(0, 0, 0, 0.8);
color: white;
text-align: center;
padding: 10px 0;
transition: transform 0.3s ease-in-out;
}
/* 隱藏選單 */
.hidden {
transform: translateY(-100%);
}
/* 內容區塊 */
.content {
margin-top: 60px;
padding: 20px;
height: 200vh; /* 增加可滾動的高度 */
background: linear-gradient(to bottom, #f8f9fa, #e9ecef);
}
</style>
使用 transform: translateY(-100%) 平滑隱藏選單transition 讓動作流暢
用一般js語法
後來發現w3school也有類似的功能
簡單總結一下
- 一樣是將navbar的位置固定
- 使用window.pageYOffset定義卷軸位置
- 藉由改變navbar的css:top值做出隱藏/浮出的效果
https://www.w3schools.com/howto/howto_js_navbar_hide_scroll.asp
scrollY vs. window.pageYOffset ?
MDN寫到
pageYOffset 属性是 scrollY 属性的别名:
window.pageYOffset == window.scrollY; // 总是返回 true

Comments