最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從零打造一個(gè)絲滑的Vue3的返回頂部組件

 更新時(shí)間:2026年04月16日 08:34:06   作者:不會(huì)寫DN  
本文介紹了一個(gè)使用Vue3開發(fā)的返回頂部組件,具有智能顯示,絲滑動(dòng)畫,平滑滾動(dòng)和類型安全等特性.文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

這個(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

在你的頁面組件(通常是 LayoutApp.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)文章

  • vue如何在多個(gè)不同服務(wù)器下訪問不同地址

    vue如何在多個(gè)不同服務(wù)器下訪問不同地址

    這篇文章主要介紹了vue如何在多個(gè)不同服務(wù)器下訪問不同地址,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • iview 權(quán)限管理的實(shí)現(xià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ì)步驟(避免踩坑)

    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)操作

    這篇文章主要介紹了Vue this.$router.push(參數(shù))實(shí)現(xiàn)頁面跳轉(zhuǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 一步步講解Vue如何啟動(dòng)項(xiàng)目

    一步步講解Vue如何啟動(dòng)項(xiàng)目

    這篇文章主要給大家介紹了關(guān)于Vue如何啟動(dòng)項(xiàng)目的相關(guān)資料,還介紹了解決vue啟動(dòng)項(xiàng)目時(shí)間很長問題的相關(guān)方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • Vue滑塊驗(yàn)證碼組件anji-captcha的使用案例詳解

    Vue滑塊驗(yàn)證碼組件anji-captcha的使用案例詳解

    滑塊驗(yàn)證是一種常見的人機(jī)識(shí)別方法,這篇文章主要介紹了Vue滑塊驗(yàn)證碼組件anji-captcha的使用,本文通過實(shí)例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 解決echart在vue中id重復(fù)問題

    解決echart在vue中id重復(fù)問題

    這篇文章主要介紹了解決echart在vue中id重復(fù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • VueTreeselect?參數(shù)options的數(shù)據(jù)轉(zhuǎn)換-參數(shù)normalizer解析

    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ò)誤解決方法

    這篇文章主要介紹了vue下history模式刷新后404錯(cuò)誤解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 淺談Vuex的狀態(tài)管理(全家桶)

    淺談Vuex的狀態(tài)管理(全家桶)

    本篇文章主要介紹了淺談Vuex狀態(tài)管理(全家桶),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11

最新評(píng)論

鸡泽县| 金堂县| 胶州市| 北辰区| 卢龙县| 武川县| 平湖市| 宁远县| 绥化市| 永吉县| 调兵山市| 余干县| 西华县| 江西省| 濮阳县| 平原县| 无锡市| 文化| 虎林市| 水富县| 西充县| 文登市| 黑龙江省| 孙吴县| 萨迦县| 汤阴县| 武威市| 唐海县| 隆昌县| 富锦市| 阿勒泰市| 永春县| 循化| 包头市| 义马市| 惠水县| 慈溪市| 兰考县| 西藏| 横峰县| 临武县|