UNPKG

17.3 kBTypeScriptView Raw
1import { ComponentType } from 'react'
2import { BaseEventOrigFunction, CommonEventFunction, StandardProps } from './common'
3interface ScrollViewProps extends StandardProps {
4 /** 允许横向滚动
5 * @default false
6 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony, harmony_hybrid
7 * @rn 二选一
8 */
9 scrollX?: boolean
10 /** 允许纵向滚动
11 * @default false
12 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony, harmony_hybrid
13 * @rn 二选一
14 */
15 scrollY?: boolean
16 /** 距顶部/左边多远时(单位px),触发 scrolltoupper 事件
17 * @default 50
18 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
19 */
20 upperThreshold?: number
21 /** 距底部/右边多远时(单位px),触发 scrolltolower 事件
22 * @default 50
23 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
24 */
25 lowerThreshold?: number
26 /** 设置竖向滚动条位置
27 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
28 */
29 scrollTop?: number
30 /** 设置横向滚动条位置
31 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
32 */
33 scrollLeft?: number
34 /** 值应为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在哪个方向滚动到该元素
35 * @supported weapp, alipay, swan, tt, qq, jd, h5, harmony_hybrid
36 */
37 scrollIntoView?: string
38 /** 在设置滚动条位置时使用动画过渡
39 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
40 * @default false
41 */
42 scrollWithAnimation?: boolean
43 /** iOS 点击顶部状态栏、安卓双击标题栏时,滚动条返回顶部,只支持竖向
44 * @supported weapp, alipay, swan, qq, jd, rn
45 * @default false
46 */
47 enableBackToTop?: boolean
48 /** 启用 flexbox 布局。开启后,当前节点声明了 `display: flex` 就会成为 flex container,并作用于其孩子节点。
49 * @supported weapp, jd
50 * @default false
51 */
52 enableFlex?: boolean
53 /** 开启 scroll anchoring 特性,即控制滚动位置不随内容变化而抖动,仅在 iOS 下生效,安卓下可参考 CSS `overflow-anchor` 属性。
54 * @supported weapp
55 * @default false
56 */
57 scrollAnchoring?: boolean
58 /** 开启自定义下拉刷新
59 * @supported weapp
60 * @default false
61 */
62 refresherEnabled?: boolean
63 /** 设置自定义下拉刷新阈值
64 * @supported weapp
65 * @default 45
66 */
67 refresherThreshold?: number
68 /** 设置自定义下拉刷新默认样式,支持设置 `black | white | none`, none 表示不使用默认样式
69 * @supported weapp
70 * @default 'black'
71 */
72 refresherDefaultStyle?: string
73 /** 设置自定义下拉刷新区域背景颜色
74 * @supported weapp
75 * @default '#FFF'
76 */
77 refresherBackground?: string
78 /** 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
79 * @supported weapp
80 * @default false
81 */
82 refresherTriggered?: boolean
83 /** 启用 scroll-view 增强特性
84 * @supported weapp, swan
85 * @default false
86 */
87 enhanced?: boolean
88 /** 使 scroll-view 下的 position sticky 特性生效,否则滚动一屏后 sticky 元素会被隐藏
89 * @supported weapp
90 * @default false
91 */
92 usingSticky?: boolean
93 /** iOS 下 scroll-view 边界弹性控制 (同时开启 enhanced 属性后生效)
94 * @supported weapp, swan
95 * @default true
96 */
97 bounces?: boolean
98 /** 滚动条显隐控制 (同时开启 enhanced 属性后生效)
99 * @supported weapp, harmony
100 * @default true
101 */
102 showScrollbar?: boolean
103 /** 分页滑动效果 (同时开启 enhanced 属性后生效)
104 * @supported weapp
105 * @default false
106 */
107 pagingEnabled?: boolean
108 /** boolean false 滑动减速速率控制 (同时开启 enhanced 属性后生效)
109 * @supported weapp
110 * @default false
111 */
112 fastDeceleration?: boolean
113 /** 当 scroll-with-animation设置为 true 时,可以设置 scroll-animation-duration 来控制动画的执行时间,单位 ms。
114 * @supported alipay
115 */
116 scrollAnimationDuration?: string
117 /** 纵向滚动时,当滚动到顶部或底部时,强制禁止触发页面滚动,仍然只触发 scroll-view 自身的滚动。
118 * @supported alipay
119 * @default false
120 */
121 trapScroll?: string
122 /** 发生滚动前,对滚动方向进行判断,当方向是顶部/左边时,如果值为 always 将始终禁止滚动,如果值为 out-of-bounds 且当前已经滚动到顶部/左边,禁止滚动。
123 * @supported alipay
124 */
125 disableLowerScroll?: string
126 /** 发生滚动前,对滚动方向进行判断,当方向是底部/右边时,如果值为 always 将始终禁止滚动,如果值为 out-of-bounds 且当前已经滚动到底部/右边,禁止滚动。
127 * @supported alipay
128 */
129 disableUpperScroll?: string
130 /** 无障碍访问,(属性)元素的额外描述
131 * @supported qq
132 */
133 ariaLabel?: string
134 /** 开启 passive 特性,能优化一定的滚动性能
135 * @supported weapp
136 * @default false
137 */
138 enablePassive?: boolean
139 /** 渲染模式
140 * list - 列表模式。只会渲染在屏节点,会根据直接子节点是否在屏来按需渲染,若只有一个直接子节点则性能会退化
141 * custom - 自定义模式。只会渲染在屏节点,子节点可以是 sticky-section list-view grid-view 等组件
142 * nested - 嵌套模式。用于处理父子 scroll-view 间的嵌套滚动,子节点可以是 nested-scroll-header nested-scroll-body 组件或自定义 refresher
143 * @supported weapp, harmony
144 * @default 'list'
145 */
146 type?: 'list' | 'custom' | 'nested'
147 /** 关联的滚动容器
148 * draggable-sheet - 关联 draggable-sheet 组件 3.2.0
149 * nested-scroll-view - 关联 type=nested 嵌套模式 3.2.0
150 * pop-gesture - 关联 页面手势返回 3.4.0
151 * @supported weapp
152 * @default ''
153 */
154 associativeContainer?: 'draggable-sheet' | 'nested-scroll-view' | 'pop-gesture'
155 /** 是否反向滚动。一般初始滚动位置是在顶部,反向滚动则是在底部。
156 * @supported weapp
157 * @default false
158 */
159 reverse?: boolean
160 /** 是否对溢出进行裁剪,默认开启
161 * @supported weapp
162 * @default true
163 */
164 clip?: boolean
165 /** 指定视口外渲染区域的距离,默认情况下视口外节点不渲染。指定 cache-extent 可优化滚动体验和加载速度,但会提高内存占用且影响首屏速度,可按需启用。
166 * @supported weapp
167 */
168 cacheExtent?: number
169 /** 指定 scroll-view 触发滚动的最小拖动距离。仅在 scroll-view 和其他组件存在手势冲突时使用,可通过调整该属性使得滚动更加灵敏。
170 * @supported weapp
171 * @default 18
172 */
173 minDragDistance?: number
174 /** 长度为 4 的数组,按 top、right、bottom、left 顺序指定内边距
175 * @supported weapp
176 * @default [0,0,0,0]
177 */
178 padding?: [number, number, number, number]
179 /** 只 scroll-into-view 到 cacheExtent 以内的目标节点,性能更佳
180 * @supported weapp
181 * @default false
182 */
183 scrollIntoViewWithinExtent?: boolean
184 /** 指定 scroll-into-view 目标节点在视口内的位置。
185 * start - 目标节点显示在视口开始处
186 * center - 目标节点显示在视口中间
187 * end - 目标节点显示在视口结束处
188 * nearest - 目标节点在就近的视口边缘显示,若节点已在视口内则不触发滚动
189 * @supported weapp, h5, harmony_hybrid
190 * @default 'start'
191 */
192 scrollIntoViewAlignment?: 'start' | 'center' | 'end' | 'nearest'
193 /** 开启下拉二级能力
194 * @supported weapp
195 * @default false
196 */
197 refresherTwoLevelEnabled?: boolean
198 /** 设置打开/关闭二级
199 * @supported weapp
200 * @default false
201 */
202 refresherTwoLevelTriggered?: boolean
203 /** 下拉二级阈值
204 * @supported weapp
205 * @default 150
206 */
207 refresherTwoLevelThreshold?: number
208 /** 滑动返回时关闭二级的阈值
209 * @supported weapp
210 * @default 80
211 */
212 refresherTwoLevelCloseThreshold?: number
213 /** 处于二级状态时是否可滑动
214 * @supported weapp
215 * @default false
216 */
217 refresherTwoLevelScrollEnabled?: boolean
218 /** 惯性滚动是否触发下拉刷新
219 * @supported weapp
220 * @default false
221 */
222 refresherBallisticRefreshEnabled?: boolean
223 /** 即将打开二级时否定住
224 * @supported weapp
225 * @default false
226 */
227 refresherTwoLevelPinned?: boolean
228 /** 滚动到顶部/左边,会触发 scrolltoupper 事件
229 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
230 */
231 onScrollToUpper?: CommonEventFunction
232 /** 滚动到底部/右边,会触发 scrolltolower 事件
233 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony_hybrid
234 */
235 onScrollToLower?: CommonEventFunction
236 /** 滚动时触发
237 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony, harmony_hybrid
238 */
239 onScroll?: BaseEventOrigFunction<ScrollViewProps.onScrollDetail>
240 /** 滚动开始事件
241 * @supported weapp
242 */
243 onScrollStart?: BaseEventOrigFunction<ScrollViewProps.onScrollDetail>
244 /** 滚动结束事件
245 * @supported weapp
246 */
247 onScrollEnd?: BaseEventOrigFunction<ScrollViewProps.onScrollDetail>
248 /** 自定义下拉刷新控件被下拉
249 * @supported weapp
250 */
251 onRefresherPulling?: CommonEventFunction
252 /** 自定义下拉刷新被触发
253 * @supported weapp
254 */
255 onRefresherRefresh?: CommonEventFunction
256 /** 自定义下拉刷新被复位
257 * @supported weapp
258 */
259 onRefresherRestore?: CommonEventFunction
260 /** 自定义下拉刷新被中止
261 * @supported weapp
262 */
263 onRefresherAbort?: CommonEventFunction
264 /** 自定义下拉刷新即将触发刷新(拖动超过 refresher-threshold 时)的事件
265 * @supported weapp
266 */
267 onRefresherWillRefresh?: CommonEventFunction
268 /** 下拉刷新状态回调
269 * @supported weapp
270 */
271 onRefresherStatusChange?: CommonEventFunction<ScrollViewProps.RefresherStatusChange>
272 /** 滑动开始事件 (同时开启 enhanced 属性后生效)
273 * @supported weapp
274 */
275 onDragStart?: CommonEventFunction<ScrollViewProps.onDragDetail>
276 /** 滑动事件 (同时开启 enhanced 属性后生效)
277 * @supported weapp
278 */
279 onDragging?: CommonEventFunction<ScrollViewProps.onDragDetail>
280 /** 滑动结束事件 (同时开启 enhanced 属性后生效)
281 * @supported weapp
282 */
283 onDragEnd?: CommonEventFunction<ScrollViewProps.onDragDetail>
284 /** 触摸动作开始。
285 * @supported alipay
286 */
287 onTouchStart?: CommonEventFunction
288 /** 触摸后移动。
289 * @supported alipay
290 */
291 onTouchMove?: CommonEventFunction
292 /** 触摸动作结束。
293 * @supported alipay
294 */
295 onTouchEnd?: CommonEventFunction
296 /** 触摸动作被打断,如来电提醒、弹窗。
297 * @supported alipay
298 */
299 onTouchCancel?: CommonEventFunction
300 /** 同 bindscrollstart,但仅支持 worklet 作为回调
301 * @supported weapp
302 */
303 onScrollStartWorklet?: string
304 /** 同 bindscroll ,但仅支持 worklet 作为回调
305 * @supported weapp
306 */
307 onScrollUpdateWorklet?: string
308 /** 同 bindscrollend,但仅支持 worklet 作为回调
309 * @supported weapp
310 */
311 onScrollEndWorklet?: string
312 /** 指定手指抬起时做惯性滚动的初速度。(velocity: number) => number
313 * @supported weapp
314 */
315 adjustDecelerationVelocityWorklet?: string
316}
317declare namespace ScrollViewProps {
318 interface onScrollDetail {
319 /** 横向滚动条位置 */
320 scrollLeft: number
321 /** 竖向滚动条位置 */
322 scrollTop: number
323 /** 滚动条高度 */
324 scrollHeight: number
325 /** 滚动条宽度 */
326 scrollWidth: number
327 deltaX: number
328 deltaY: number
329 isDrag?: boolean
330 }
331 interface onDragDetail {
332 /** 横向滚动条位置 */
333 scrollLeft: number
334 /** 竖向滚动条位置 */
335 scrollTop: number
336 /** 滚动速度 */
337 velocity: number
338 }
339 interface RefresherStatusChange {
340 status: RefreshStatus
341 dy: number
342 }
343 const enum RefreshStatus {
344 // 空闲
345 Idle,
346 // 超过下拉刷新阈值,同 bind:refresherwillRefresh 触发时机
347 CanRefresh,
348 // 下拉刷新,同 bind:refresherrefresh 触发时机
349 Refreshing,
350 // 下拉刷新完成,同 bind:refresherrestore 触发时机
351 Completed,
352 // 下拉刷新失败
353 Failed,
354 // 超过下拉二级阈值
355 CanTwoLevel,
356 // 开始打开二级
357 TwoLevelOpening,
358 // 打开二级
359 TwoLeveling,
360 // 开始关闭二级
361 TwoLevelClosing,
362 }
363}
364/** 可滚动视图区域。使用竖向滚动时,需要给scroll-view一个固定高度,通过 WXSS 设置 height。组件属性的长度单位默认为 px
365 *
366 * Tips:
367 * H5 中 ScrollView 组件是通过一个高度(或宽度)固定的容器内部滚动来实现的,因此务必正确的设置容器的高度。例如: 如果 ScrollView 的高度将 body 撑开,就会同时存在两个滚动条(body 下的滚动条,以及 ScrollView 的滚动条)。
368 * 微信小程序 中 ScrollView 组件如果设置 scrollX 横向滚动时,并且子元素为多个时(单个子元素时设置固定宽度则可以正常横向滚动),需要通过 WXSS 设置 `white-space: nowrap` 来保证元素不换行,并对 ScrollView 内部元素设置 `display: inline-block` 来使其能够横向滚动。
369 * @classification viewContainer
370 * @supported weapp, alipay, swan, tt, qq, jd, h5, rn, harmony, harmony_hybrid
371 * @example_react
372 * ```tsx
373 * export default class PageView extends Component {
374 * constructor() {
375 * super(...arguments)
376 * }
377 *
378 * onScrollToUpper() {}
379 *
380 * // or 使用箭头函数
381 * // onScrollToUpper = () => {}
382 *
383 * onScroll(e){
384 * console.log(e.detail)
385 * }
386 *
387 * render() {
388 * const scrollStyle = {
389 * height: '150px'
390 * }
391 * const scrollTop = 0
392 * const Threshold = 20
393 * const vStyleA = {
394 * height: '150px',
395 * 'backgroundColor': 'rgb(26, 173, 25)'
396 * }
397 * const vStyleB = {
398 * height: '150px',
399 * 'backgroundColor': 'rgb(39,130,215)'
400 * }
401 * const vStyleC = {
402 * height: '150px',
403 * 'backgroundColor': 'rgb(241,241,241)',
404 * color: '#333'
405 * }
406 * return (
407 * <ScrollView
408 * className='scrollview'
409 * scrollY
410 * scrollWithAnimation
411 * scrollTop={scrollTop}
412 * style={scrollStyle}
413 * lowerThreshold={Threshold}
414 * upperThreshold={Threshold}
415 * onScrollToUpper={this.onScrollToUpper.bind(this)} // 使用箭头函数的时候 可以这样写 `onScrollToUpper={this.onScrollToUpper}`
416 * onScroll={this.onScroll}
417 * >
418 * <View style={vStyleA}>A</View>
419 * <View style={vStyleB}>B</View>
420 * <View style={vStyleC}>C</View>
421 * </ScrollView>
422 * )
423 * }
424 * }
425 * ```
426 * @example_vue
427 * ```html
428 * <template>
429 * <view class="container">
430 * <view class="page-body">
431 * <view class="page-section">
432 * <view class="page-section-title">
433 * <text>Vertical Scroll - 纵向滚动</text>
434 * </view>
435 * <view class="page-section-spacing">
436 * <scroll-view :scroll-y="true" style="height: 300rpx;" `@scrolltoupper="upper" `@scrolltolower="lower" `@scroll="scroll" :scroll-into-view="toView" :scroll-top="scrollTop">
437 * <view id="demo1" class="scroll-view-item demo-text-1">1</view>
438 * <view id="demo2" class="scroll-view-item demo-text-2">2</view>
439 * <view id="demo3" class="scroll-view-item demo-text-3">3</view>
440 * </scroll-view>
441 * </view>
442 * </view>
443 * <view class="page-section">
444 * <view class="page-section-title">
445 * <text>Horizontal Scroll - 横向滚动</text>
446 * </view>
447 * <view class="page-section-spacing">
448 * <scroll-view class="scroll-view_H" :scroll-x="true" `@scroll="scroll" style="width: 100%">
449 * <view id="demo21" class="scroll-view-item_H demo-text-1">a</view>
450 * <view id="demo22" class="scroll-view-item_H demo-text-2">b</view>
451 * <view id="demo23" class="scroll-view-item_H demo-text-3">c</view>
452 * </scroll-view>
453 * </view>
454 * </view>
455 * </view>
456 * </view>
457 * </template>
458 *
459 * <script>
460 * const order = ['demo1', 'demo2', 'demo3']
461 * export default {
462 * name: 'Index',
463 * data() {
464 * return {
465 * scrollTop: 0,
466 * toView: 'demo2'
467 * }
468 * },
469 *
470 * methods: {
471 * upper(e) {
472 * console.log('upper:', e)
473 * },
474 *
475 * lower(e) {
476 * console.log('lower:', e)
477 * },
478 *
479 * scroll(e) {
480 * console.log('scroll:', e)
481 * }
482 * }
483 * }
484 * </script>
485 *
486 * <style>
487 * .page-section-spacing{
488 * margin-top: 60rpx;
489 * }
490 * .scroll-view_H{
491 * white-space: nowrap;
492 * }
493 * .scroll-view-item{
494 * height: 300rpx;
495 * }
496 * .scroll-view-item_H{
497 * display: inline-block;
498 * width: 100%;
499 * height: 300rpx;
500 * }
501 *
502 * .demo-text-1 { background: #ccc; }
503 * .demo-text-2 { background: #999; }
504 * .demo-text-3 { background: #666; }
505 * </style>
506 * ```
507 * @see https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html
508 */
509declare const ScrollView: ComponentType<ScrollViewProps>
510export { ScrollView, ScrollViewProps }