从零打造一个丝滑的Vue3的返回顶部组件

 更新时间:2026年04月16日 08:34:06   作者:不会写DN  
本文介绍了一个使用Vue3开发的返回顶部组件,具有智能显示,丝滑动画,平滑滚动和类型安全等特性.文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

这个组件具备以下特性:

  • 智能显示:滚动超过指定距离(默认 300px)后自动出现。
  • 丝滑动画:使用 Vue 内置的 <Transition> 实现淡入上滑的出现 / 消失效果。
  • 平滑滚动:点击后通过 behavior: 'smooth' 实现平滑回顶。
  • 类型安全:使用 TypeScript 定义 Props,开发体验极佳。

它涵盖了 Vue 3 开发中几个非常核心的最佳实践:

  • Composition API 的逻辑复用与组织。
  • 生命周期钩子 的正确使用(特别是事件解绑)。
  • 原生 DOM API (window.scrollTo) 的结合。
  • CSS Transition 的视觉效果优化。

代码解析

模板结构 (Template)

<template>
  <!-- 使用 Transition 包裹,给按钮加上场/退场动画 -->
  <Transition name="slide-up">
    <button
      v-if="visible"
      @click="scrollToTop"
      class="back-to-top-btn"
      :title="tooltip"
    >
      <!-- 内嵌 SVG 向上箭头图标,避免引入外部图片资源 -->
      <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 提供的内置组件,当 v-if 切换时自动应用 CSS 过渡类名。
  • SVG 图标:直接内嵌 SVG,减少网络请求,且通过 currentColor 继承父元素颜色,方便样式控制。

逻辑核心 (Script)

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'

// 1. 定义 Props,使用 withDefaults 设置默认值
const props = withDefaults(defineProps<{
  threshold?: number  // 滚动阈值,超过此值显示按钮
  tooltip?: string    // 鼠标悬停提示文字
}>(), {
  threshold: 300,
  tooltip: '返回顶部'
})

// 2. 响应式状态:控制按钮显示/隐藏
const visible = ref(false)

// 3. 滚动处理函数:判断当前滚动位置
const handleScroll = () => {
  visible.value = window.scrollY > props.threshold
}

// 4. 核心动作:执行滚动到顶部
const scrollToTop = () => {
  window.scrollTo({
    top: 0,
    behavior: 'smooth' // 关键:实现平滑滚动,而非瞬间跳转
  })
}

// 5. 生命周期:挂载时监听滚动事件
onMounted(() => {
  window.addEventListener('scroll', handleScroll)
})

// 6. 生命周期:卸载时移除监听(非常重要,防止内存泄漏)
onUnmounted(() => {
  window.removeEventListener('scroll', handleScroll)
})
</script>
  • withDefaults:配合 TypeScript 的 defineProps,优雅地给 Props 赋默认值。
  • onUnmounted:这是新手容易忽略的点。如果组件销毁了但不移除 window 上的事件监听器,会导致内存泄漏或报错。
  • behavior: 'smooth' :原生 API,比自己写定时器动画要高效得多。

样式设计 (Style)

<style scoped>
.back-to-top-btn {
  position: fixed; /* 固定定位,悬浮在页面右下角 */
  bottom: 2rem;
  right: 2rem;
  width: 3rem;
  height: 3rem;
  background: #4f46e5; /* 靛蓝色,现代感强 */
  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; /* 确保层级够高,不被其他元素遮挡 */
}
.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); /* 点击时的按压反馈 */
}
/* Transition 动画对应的 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,让按钮有 “呼吸感”。
  • 动画类名slide-up-enter-from 定义了初始状态(透明且位置偏下),Vue 会自动在合适的时机切换类名。

如何在项目中使用

将上述代码保存为 BackToTop.vue

在你的页面组件(通常是 LayoutApp.vue)中引入:

<template>
  <div class="very-long-page-content">
    <!-- 你的页面内容 -->
  </div>
  <!-- 直接使用,也可以传入 threshold 自定义显示距离 -->
  <BackToTop :threshold="500" />
</template>
<script setup lang="ts">
import BackToTop from './components/BackToTop.vue'
</script>

到此这篇关于从零打造一个丝滑的Vue3的返回顶部组件的文章就介绍到这了,更多相关Vue3返回顶部组件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • <el-button>点击后如何跳转指定url链接

    <el-button>点击后如何跳转指定url链接

    这篇文章主要介绍了<el-button>点击后如何跳转指定url链接问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 详解如何使用 vue-cli 开发多页应用

    详解如何使用 vue-cli 开发多页应用

    本篇文章主要介绍了详解如何使用 vue-cli 开发多页应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 手写实现Vue计算属性

    手写实现Vue计算属性

    这篇文章主要介绍了手写实现Vue计算属性,本文从一个简单的计算属性例子开始,一步步实现了计算属性。并且针对这个例子,详细分析了页面渲染时的整个代码执行逻辑,需要的小伙伴可以参考一下
    2022-08-08
  • vue解决跨域问题的几种方式

    vue解决跨域问题的几种方式

    这篇文章主要给大家介绍了关于vue解决跨域问题的几种方式,跨域跨域报错是前端开发中非常经典的一个错误,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • vue + ele 实现下拉选择框和下拉多选选择框处理方案

    vue + ele 实现下拉选择框和下拉多选选择框处理方案

    这篇文章主要介绍了vue + ele 实现下拉选择框和下拉多选选择框处理方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Vue中使用eslint和editorconfig方式

    Vue中使用eslint和editorconfig方式

    这篇文章主要介绍了Vue中使用eslint和editorconfig方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • vue axios接口请求封装方式

    vue axios接口请求封装方式

    这篇文章主要介绍了vue axios接口请求封装方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • Vue在表单中使用el-upload手动上传图片方式

    Vue在表单中使用el-upload手动上传图片方式

    文章描述了两种上传图片的方式:自动上传和手动上传,并 分析了两种方式的优缺点; 幙提出了使用手动上传的方式,并 幨通过表单使用了`℘upload`组件; 幻重点介绍了手动上传时表单验证、图片规格检查、上传成功处理及提交表单的过程
    2026-04-04
  • 关于Vue中keep-alive的作用及使用方法

    关于Vue中keep-alive的作用及使用方法

    keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,该组件将不会销毁,这篇文章主要介绍了关于Vue中keep-alive的作用是什么?怎么使用,需要的朋友可以参考下
    2023-04-04
  • vue.js项目打包上线全流程

    vue.js项目打包上线全流程

    这篇文章主要介绍了vue.js项目打包上线全流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04

最新评论