useScroll
跟踪滚动位置和统计数据
Usage
实时编辑器
function Demo() { const elementRef = useRef<HTMLDivElement>(null); const [x, y, isScrolling, arrivedState, directions] = useScroll(elementRef); const { left, right, top, bottom } = useMemo( () => arrivedState, [arrivedState], ); const { left: toLeft, right: toRight, top: toTop, bottom: toBottom, } = useMemo(() => directions, [directions]); const absoluteStyle: CSSProperties = { paddingTop: "0.25rem", paddingBottom: "0.25rem", paddingLeft: "0.5rem", paddingRight: "0.5rem", position: "absolute", }; return ( <div style={{ display: "flex" }}> <div ref={elementRef} style={{ width: 300, height: 300, margin: "auto", borderRadius: "0.25rem", overflow: "scroll", }} > <div style={{ width: 500, height: 400, position: "relative" }}> <div style={{ ...absoluteStyle, top: "0rem", left: "0rem", }} > TopLeft </div> <div style={{ ...absoluteStyle, bottom: "0rem", left: "0rem", }} > BottomLeft </div> <div style={{ ...absoluteStyle, top: "0rem", right: "0rem", }} > TopRight </div> <div style={{ ...absoluteStyle, bottom: "0rem", right: "0rem", }} > BottomRight </div> <div style={{ ...absoluteStyle, top: "33.33333%", left: "33.33333%", }} > Scroll Me </div> </div> </div> <div style={{ width: 280, margin: "auto", paddingLeft: "1rem", display: "flex", flexDirection: "column", gap: 5, }} > <div> Position: {x.toFixed(1)}, {y.toFixed(1)} </div> <div>isScrolling: {JSON.stringify(isScrolling)}</div> <div>Top Arrived: {JSON.stringify(top)}</div> <div>Right Arrived: {JSON.stringify(right)}</div> <div>Bottom Arrived: {JSON.stringify(bottom)}</div> <div>Left Arrived: {JSON.stringify(left)}</div> <div>Scrolling Up: {JSON.stringify(toTop)}</div> <div>Scrolling Right: {JSON.stringify(toRight)}</div> <div>Scrolling Down: {JSON.stringify(toBottom)}</div> <div>Scrolling Left: {JSON.stringify(toLeft)}</div> </div> </div> ); };
结果
Loading...
API
useScroll
Returns
readonly [number, number, boolean, UseScrollArrivedState, UseScrollDirection]
: 包含以下元素的元组:
- x 值。
- y 值。
- 是否在滚动。
- 到达边界状态。
- 滚动方向
Arguments
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
target | dom元素 | BasicTarget<Element> | Document | Window (必填) | - |
options | 可选参数 | UseScrollOptions | undefined | - |
UseScrollOptions
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
throttle | 滚动事件的节流时间,默认关闭。 | number | 0 |
idle | 滚动结束时的检查时间。当配置 throttle 时,此配置将设置为 (throttle +idle)。 | number | - |
offset | 将到达状态偏移 x 像素 | UseScrollOffset | - |
onScroll | 滚动的回调 | (e: Event) => void | - |
onStop | 滚动结束的回调 | (e: Event) => void | - |
eventListenerOptions | 滚动事件参数 | boolean | AddEventListenerOptions | {capture: false, passive: true} |
UseScrollArrivedState
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
left | 到达左边 | boolean (必填) | - |
right | 到达右边 | boolean (必填) | - |
top | 到达顶部 | boolean (必填) | - |
bottom | 到达底部 | boolean (必填) | - |
UseScrollDirection
参数名 | 描述 | 类型 | 默认值 |
---|---|---|---|
left | 向左滚动 | boolean (必填) | - |
right | 向右滚动 | boolean (必填) | - |
top | 向上滚动 | boolean (必填) | - |
bottom | 向下滚动 | boolean (必填) | - |
BasicTarget
export type BasicTarget<T extends TargetType = Element> = (() => TargetValue<T>) | TargetValue<T> | MutableRefObject<TargetValue<T>>;
TargetValue
type TargetValue<T> = T | undefined | null;
TargetType
type TargetType = HTMLElement | Element | Window | Document | EventTarget;
UseScrollOffset
export interface UseScrollOffset {
left?: number;
right?: number;
top?: number;
bottom?: number;
}