组件/Scroll 滚动

Scroll 滚动

基于 BetterScroll 或原生滚动的滚动容器

已验证自 0.3.4

用法

基础

示例加载中...

横向滚动

direction 选择滚动轴:vertical、horizontal 或 both。

示例加载中...

回弹与常显滚动条

内容不足一屏时,scrollbarAlwaysVisible 仍显示滚动条。

示例加载中...

滚动链

默认不把滚动传给外层;scrollChaining 让内层到达边界后继续滚动外层。

示例加载中...

原生滚动

native 跳过 BetterScroll,容器结构不变。

示例加载中...

下拉刷新与上拉加载

监听 pulling-down / pulling-up;异步任务无论成败,都调用 finishPullDown() / finishPullUp()。

示例加载中...

最佳实践

  • 普通文章或文档滚动用原生模式;需要一致的滚动条、滚轮桥接、回弹或下拉插件时才用 BetterScroll。
  • 嵌套面板保持 scrollChaining=false,只在父子交接是刻意设计且已验证时开启。
  • 子组件自带间距时(虚拟列表、表格、全出血媒体)设 noPadding。
  • 横向或双轴内容给出确定的内容宽度,否则 BetterScroll 无法可靠判断横向溢出。
  • 不要把大型可变对象塞进 options;已有 props 的行为用 props 配置。

API 参考

属性

属性名类型默认值说明
nativebooleanfalse强制原生滚动,跳过 BetterScroll 初始化。
unifiedbooleanfalse强制 BetterScroll,覆盖 Safari / Chromium 的自动原生;native 仍优先。
nativeAutoFallbackbooleantrue在 macOS + Chromium 145+ 上自动改用原生滚动;不影响 Safari。
noPaddingbooleanfalse去掉内容内边距;横向与双轴时内容宽度为 max-content。
scrollChainingbooleanfalse到达边界后把滚动交给外层。
direction'vertical' | 'horizontal' | 'both''vertical'滚动轴向。
scrollbarbooleantrue启用 BetterScroll 滚动条插件;原生模式用浏览器滚动条。
scrollbarFadebooleantrue滚动条闲置时淡出。
scrollbarInteractivebooleantrue允许拖拽滚动条。
scrollbarAlwaysVisiblebooleanfalse滚动条常显,适合回弹或内容不足一屏的场景。
scrollbarMinSizenumber18滑块最小尺寸,写入 --tx-scrollbar-min-size。
probeType0 | 1 | 2 | 33BetterScroll probeType,决定 scroll 事件频率。
bouncebooleantrue边界回弹与滚轮 overshoot。
clickbooleantrue透传 BetterScroll 的 click 选项。
wheelbooleantrueBetterScroll 模式的滚轮桥接;忽略 ctrl 滚轮。
refreshOnContentChangebooleantrue内容变更后自动 refresh()。
pullDownRefreshboolean | Record<string, unknown>false启用下拉刷新;对象作为 BetterScroll 插件选项。
pullDownThresholdnumber70触发 pulling-down 的下拉距离。
pullDownStopnumber56刷新时的停留位置,仅 BetterScroll 模式生效。
pullUpLoadboolean | Record<string, unknown>false启用上拉加载;对象作为 BetterScroll 插件选项。
pullUpThresholdnumber0触发 pulling-up 的距底阈值。
optionsRecord<string, unknown>{}额外的 BetterScroll 选项;wheelOvershoot 由组件自行消费。

事件

事件名参数说明
scroll{ scrollTop: number; scrollLeft: number }滚动时触发,参数为绝对偏移。
pulling-down-下拉刷新时触发;finishPullDown() 之前不再触发。
pulling-up-上拉加载时触发;finishPullUp() 之前不再触发。

插槽

插槽名说明
default主内容,渲染在 .tx-scroll__content 内。
header主内容之前;原生模式在 .tx-scroll__content 之前,BetterScroll 模式在其内。
footer主内容之后,常放加载状态。

暴露方法

名称类型说明
nativeScrollRefRef<HTMLElement | null>原生模式下的滚动元素。
scrollTo(x, y, time?)(x: number, y: number, time?: number) => void滚动到绝对偏移;time 仅 BetterScroll 模式生效。
getScrollInfo()() => TxScrollInfo当前偏移、滚动尺寸与可视尺寸。
refresh()() => void重新计算 BetterScroll 的可滚动范围;原生模式无操作。
finishPullDown()() => void结束本轮下拉,允许再次触发。
finishPullUp()() => void结束本轮上拉,允许再次触发。

概述

  • 模式按优先级决定:native → unified(BetterScroll)→ macOS Safari 用原生 → nativeAutoFallback 且 macOS + Chromium ≥ 145 用原生 → 其余用 BetterScroll。
  • 原生模式把 direction 映射为 overflow-x/y,scrollChaining=false 映射为 overscroll-behavior: contain;BetterScroll 模式映射为 scrollX、scrollY 与 freeScroll。
  • 尺寸与内容变化合并到同一帧再 refresh();refreshOnContentChange=false 只关闭内容变更刷新,尺寸刷新保留。
  • 原生模式的下拉刷新是 scrollTop=0 时基于触摸阈值的降级实现。
  • macOS 上同时开启 wheel 与 bounce 时默认注入 useTransition: false,可在 options 中覆盖。

技术实现

  • BetterScroll 模式按需加载 @better-scroll/core 与 @better-scroll/scroll-bar,滚轮由组件自己的桥接处理。
  • 源码:packages/tuffex/packages/components/src/scroll/。
查看源码
packages/tuffex/packages/components/src/scroll/index.ts