從零打造一個(gè)絲滑的Vue3的返回頂部組件
這個(gè)組件具備以下特性:
- 智能顯示:滾動(dòng)超過指定距離(默認(rèn) 300px)后自動(dòng)出現(xiàn)。
- 絲滑動(dòng)畫:使用 Vue 內(nèi)置的
<Transition>實(shí)現(xiàn)淡入上滑的出現(xiàn) / 消失效果。 - 平滑滾動(dòng):點(diǎn)擊后通過
behavior: 'smooth'實(shí)現(xiàn)平滑回頂。 - 類型安全:使用 TypeScript 定義 Props,開發(fā)體驗(yàn)極佳。
它涵蓋了 Vue 3 開發(fā)中幾個(gè)非常核心的最佳實(shí)踐:
- Composition API 的邏輯復(fù)用與組織。
- 生命周期鉤子 的正確使用(特別是事件解綁)。
- 原生 DOM API (
window.scrollTo) 的結(jié)合。 - CSS Transition 的視覺效果優(yōu)化。
代碼解析
模板結(jié)構(gòu) (Template)
<template>
<!-- 使用 Transition 包裹,給按鈕加上場(chǎng)/退場(chǎng)動(dòng)畫 -->
<Transition name="slide-up">
<button
v-if="visible"
@click="scrollToTop"
class="back-to-top-btn"
:title="tooltip"
>
<!-- 內(nèi)嵌 SVG 向上箭頭圖標(biāo),避免引入外部圖片資源 -->
<svg class="icon" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M5 10l7-7m0 0l7 7m-7-7v18"
/>
</svg>
</button>
</Transition>
</template><Transition>:Vue 提供的內(nèi)置組件,當(dāng)v-if切換時(shí)自動(dòng)應(yīng)用 CSS 過渡類名。- SVG 圖標(biāo):直接內(nèi)嵌 SVG,減少網(wǎng)絡(luò)請(qǐng)求,且通過
currentColor繼承父元素顏色,方便樣式控制。
邏輯核心 (Script)
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
// 1. 定義 Props,使用 withDefaults 設(shè)置默認(rèn)值
const props = withDefaults(defineProps<{
threshold?: number // 滾動(dòng)閾值,超過此值顯示按鈕
tooltip?: string // 鼠標(biāo)懸停提示文字
}>(), {
threshold: 300,
tooltip: '返回頂部'
})
// 2. 響應(yīng)式狀態(tài):控制按鈕顯示/隱藏
const visible = ref(false)
// 3. 滾動(dòng)處理函數(shù):判斷當(dāng)前滾動(dòng)位置
const handleScroll = () => {
visible.value = window.scrollY > props.threshold
}
// 4. 核心動(dòng)作:執(zhí)行滾動(dòng)到頂部
const scrollToTop = () => {
window.scrollTo({
top: 0,
behavior: 'smooth' // 關(guān)鍵:實(shí)現(xiàn)平滑滾動(dòng),而非瞬間跳轉(zhuǎn)
})
}
// 5. 生命周期:掛載時(shí)監(jiān)聽滾動(dòng)事件
onMounted(() => {
window.addEventListener('scroll', handleScroll)
})
// 6. 生命周期:卸載時(shí)移除監(jiān)聽(非常重要,防止內(nèi)存泄漏)
onUnmounted(() => {
window.removeEventListener('scroll', handleScroll)
})
</script>
withDefaults:配合 TypeScript 的defineProps,優(yōu)雅地給 Props 賦默認(rèn)值。onUnmounted:這是新手容易忽略的點(diǎn)。如果組件銷毀了但不移除window上的事件監(jiān)聽器,會(huì)導(dǎo)致內(nèi)存泄漏或報(bào)錯(cuò)。behavior: 'smooth':原生 API,比自己寫定時(shí)器動(dòng)畫要高效得多。
樣式設(shè)計(jì) (Style)
<style scoped>
.back-to-top-btn {
position: fixed; /* 固定定位,懸浮在頁面右下角 */
bottom: 2rem;
right: 2rem;
width: 3rem;
height: 3rem;
background: #4f46e5; /* 靛藍(lán)色,現(xiàn)代感強(qiáng) */
color: white;
border: none;
border-radius: 50%; /* 圓形按鈕 */
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(79, 70, 229, 0.4); /* 柔和陰影 */
transition: all 0.3s ease;
z-index: 1000; /* 確保層級(jí)夠高,不被其他元素遮擋 */
}
.back-to-top-btn:hover {
background: #4338ca; /* 懸停變深色 */
transform: translateY(-4px); /* 懸停上浮效果 */
box-shadow: 0 8px 20px rgba(79, 70, 229, 0.5);
}
.back-to-top-btn:active {
transform: translateY(-2px); /* 點(diǎn)擊時(shí)的按壓反饋 */
}
/* Transition 動(dòng)畫對(duì)應(yīng)的 CSS 類 */
.slide-up-enter-active,
.slide-up-leave-active {
transition: all 0.3s ease;
}
.slide-up-enter-from,
.slide-up-leave-to {
opacity: 0;
transform: translateY(20px); /* 從下方 20px 處滑入 */
}
</style>- 交互反饋:通過
:hover和:active偽類配合transform,讓按鈕有 “呼吸感”。 - 動(dòng)畫類名:
slide-up-enter-from定義了初始狀態(tài)(透明且位置偏下),Vue 會(huì)自動(dòng)在合適的時(shí)機(jī)切換類名。
如何在項(xiàng)目中使用
將上述代碼保存為 BackToTop.vue。
在你的頁面組件(通常是 Layout 或 App.vue)中引入:
<template>
<div class="very-long-page-content">
<!-- 你的頁面內(nèi)容 -->
</div>
<!-- 直接使用,也可以傳入 threshold 自定義顯示距離 -->
<BackToTop :threshold="500" />
</template>
<script setup lang="ts">
import BackToTop from './components/BackToTop.vue'
</script>到此這篇關(guān)于從零打造一個(gè)絲滑的Vue3的返回頂部組件的文章就介紹到這了,更多相關(guān)Vue3返回頂部組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
iview 權(quán)限管理的實(shí)現(xiàn)
本文主要介紹了iview 權(quán)限管理,iview-admin2.0自帶權(quán)限管理??梢酝ㄟ^設(shè)置路由的meta對(duì)象的參數(shù)access來分配權(quán)限。感興趣的可以了解一下2021-07-07
vue前端獲取不同客戶端mac地址最詳細(xì)步驟(避免踩坑)
在開發(fā)過程中,綁定賬號(hào)和電腦的功能可以通過獲取電腦的MAC地址實(shí)現(xiàn),下面這篇文章主要介紹了vue前端獲取不同客戶端mac地址的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
Vue this.$router.push(參數(shù))實(shí)現(xiàn)頁面跳轉(zhuǎn)操作
這篇文章主要介紹了Vue this.$router.push(參數(shù))實(shí)現(xiàn)頁面跳轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Vue滑塊驗(yàn)證碼組件anji-captcha的使用案例詳解
滑塊驗(yàn)證是一種常見的人機(jī)識(shí)別方法,這篇文章主要介紹了Vue滑塊驗(yàn)證碼組件anji-captcha的使用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
VueTreeselect?參數(shù)options的數(shù)據(jù)轉(zhuǎn)換-參數(shù)normalizer解析
這篇文章主要介紹了VueTreeselect?參數(shù)options的數(shù)據(jù)轉(zhuǎn)換-參數(shù)normalizer解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
vue下history模式刷新后404錯(cuò)誤解決方法
這篇文章主要介紹了vue下history模式刷新后404錯(cuò)誤解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08

