返回目录
组件详情入口
数据展示
@vean/ui
SBacktop

Backtop

Backtop 属于 数据展示 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

回到顶部

概述

SBacktop 在滚动目标超过可配置阈值后显示浮动按钮,激活时平滑滚动目标回到顶部。它封装了 SButton,提供滚动位置追踪、基于 requestAnimationFrame 的平滑滚动和 prefers-reduced-motion 支持。用于让用户在长页面或可滚动容器中快速返回顶部。

注意:除了 SBacktop,Aria 层还导出了 Backtop,可用于自定义组合。

用法

功能

  • 📏 可见性阈值 — 滚动超过 visibilityHeight 像素后按钮才出现(默认 400)。
  • 🎬 平滑动画 — 使用 easeInOutCubic 缓动在 duration 毫秒内滚动到顶部(默认 300)。设 duration={0} 可即时滚动。
  • ♿ 减弱动画 — 尊重 prefers-reduced-motion: reduce;用户偏好减弱动画时跳过动画即时滚动。
  • 🎯 灵活目标 — target 接受 window(默认)、HTMLElement、Ref<HTMLElement> 或 CSS 选择器字符串。
  • 🔧 Aria 组合 — Aria Backtop 单独导出用于自定义按钮样式;SBacktop 提供预设 buttonVariants + 固定定位。
  • 🎨 完整 Button props — 继承所有 ButtonProps(color、size、variant、shape、shadow、disabled 等)及 icon/iconClass/iconProps 默认图标。
  • 📡 事件 — 发射 change(可见性切换)和 click(按钮点击)。
  • 🌐 SSR 安全 — 所有浏览器 API(window、document、matchMedia)均有守护;服务端渲染无错误。

演示

基础

Scroll inside the container to reveal the Backtop button.

目标容器

Backtop can observe a selector target and render custom content.

自定义样式

Use button style props, slot content, and custom positioning classes.

API

Aria 层

1

Backtop

17 属性2 事件
属性
属性名类型默认值描述
class
ClassValue
—
应用于根元素的额外类名。
color
ThemeColor
—
组件的主题颜色。
size
ThemeSize
—
组件的视觉尺寸。
variant
ButtonVariant
—
该组件的视觉变体。
shape
ButtonShape
—
组件的结构。
shadow
ButtonShadow
—
遵循该组件的样式规范。
fitContent
boolean
—
组件是否应适应其内容宽度。
icon
string
'lucide:arrow-up'
iconify 的图标名称。
iconClass
ClassValue
—
图标的类。
iconProps
Partial<IconProps>
—
图标的 props。
visibilityHeight
number
400
必须滚动到该距离后,“返回顶部”按钮才会显示。
target
AffixTarget | null
window
Backtop 监听并滚动的滚动目标。
duration
number
300
滚动至顶部动画的持续时间(单位:毫秒)。
disabled
boolean
—
该组件是否已禁用。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。
type
ButtonType
'button'
按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。
事件
事件名参数描述
change
boolean
在发生变更时触发。
click
PointerEvent
在发生点击时触发。

注意事项

架构与对标差异

SBacktop 拆分为 Aria 层(负责滚动追踪、目标解析、动画和可见性状态)和 styled 层(负责 backtopVariants 配方,扩展 buttonVariants 加 fixed z-50 和基于尺寸的 bottom-* end-* 定位)。遵循 VeanUI Aria/styled 分离模式。

维度VeanUIAnt Design BackTopElement Plus BacktopNaive UI BackTop
架构Aria + styled 分离仅 styled仅 styled仅 styled
平滑滚动requestAnimationFrame + easeInOutCubicrequestAnimationFramerequestAnimationFramerequestAnimationFrame
减弱动画✅ prefers-reduced-motion———
目标类型window / HTMLElement / Ref / CSS 选择器HTMLElement / 函数HTMLElement / 字符串HTMLElement / 字符串
可见性阈值visibilityHeight(number)visibilityHeight(number)visibilityHeight(number)visibilityHeight(number)
动画时长duration(ms)———
Aria 导出✅ Backtop———
禁用状态✅ 继承自 Button———

运行时注意事项

  • hidden 属性:按钮不可见时,Aria 层在 <button> 上设置 hidden,应用 display: none。这会阻止显示/隐藏的 CSS 过渡。如需淡入淡出过渡,覆盖 [hidden] { display: block; } 并在自定义类中使用 opacity/visibility 过渡。
  • 焦点管理:按钮在聚焦状态下变为不可见时(如滚动到顶部后),Aria 层自动失焦,防止焦点被困在隐藏元素上。
  • 滚动监听清理:Aria 层使用 useEventListener 配合 onWatcherCleanup,在目标变更或组件卸载时移除滚动监听器。无需手动清理。
  • target 响应性:运行时修改 target 或 visibilityHeight 会触发目标重新解析和通过 nextTick 的可见性重检。

常见问题

如何指定特定的可滚动容器作为目标? 传入元素或 CSS 选择器:<SBacktop target="#my-scroll-container" /> 或 <SBacktop :target="scrollRef" />。组件会解析目标并监听其 scroll 事件。

如何禁用平滑动画? 设 duration={0}:<SBacktop :duration="0" />。用户启用 prefers-reduced-motion: reduce 时组件也会自动跳过动画。

可以使用自定义按钮替代默认样式吗? 可以。从 @vean/aria/backtop 导入 Aria Backtop,用自定义按钮组合:

<script setup lang="ts">
import { Backtop } from '@vean/aria/backtop';
</script>

<template>
  <Backtop :visibility-height="200" class="my-custom-button">
    <MyIcon />
  </Backtop>
</template>

为什么点击后按钮立即消失? 滚动到顶部后,滚动位置低于 visibilityHeight,按钮因此隐藏。Aria 层在隐藏前自动失焦按钮,避免焦点被困在隐藏元素上。

如何更换默认图标? 传入 icon prop:<SBacktop icon="lucide:chevron-up" />。使用 iconClass 控制图标样式,iconProps 传递额外 SIcon props。

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.19.0

2026-05-11

对比版本

修复

在 onClick 函数中发出点击事件

范围: backtop作者: soybeanfe查看提交af273

修复

修复点击时出现的咏叹调隐藏警告

范围: backtop作者: soybeanfe查看提交437fe

v0.18.0

2026-05-05

对比版本

优化

更新 backtopVariants 与计算类中的尺寸处理

范围: backtop作者: soybeanjs查看提交fa0df

优化

将点击事件类型从 MouseEvent 更新为 PointerEvent,保持一致性

范围: backtop作者: soybeanfe, Copilot查看提交4666c