scroll-view
简介
可滚动视图区域。使用竖向滚动时,需要给 scroll-view 一个固定高度,通过 CSS 设置 height。组件属性的长度单位默认为 px。
属性说明
属性名 | 类型 | 默认值 | 必填 | 说明 | 最低版本 |
---|---|---|---|---|---|
scroll-x | Boolean | FALSE | 否 | 允许横向滚动 | 2.2.0 |
scroll-y | Boolean | FALSE | 否 | 允许纵向滚动 | 2.2.0 |
upper-threshold | Number | 50 | 否 | 距顶部 / 左边多远时(单位 px),触发 scrolltoupper 事件 | 2.2.0 |
lower-threshold | Number | 50 | 否 | 距底部 / 右边多远时(单位 px),触发 scrolltolower 事件 | 2.2.0 |
scroll-top | Number | 否 | 设置竖向滚动条位置。 | 2.2.0 | |
scroll-left | Number | 否 | 设置横向滚动条位置。 | 2.2.0 | |
scroll-into-view | String | 否 | 值应为某子元素 id(id 不能以数字开头)。设置滚动方向后,按方向滚动到该元素 | 2.2.0 | |
scroll-with-animation | Boolean | FALSE | 否 | 在设置滚动条位置时使用动画过渡 | 2.2.0 |
scroll-animation-duration | Number | 200 | 否 | 在设置滚动条位置时使用动画过渡时长 | 2.2.0 |
refresher-enabled | Boolean | FALSE | 否 | 是否启用下拉刷新功能 | 2.2.0 |
refresh-state | Boolean | FALSE | 否 | 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发,结合 refresh 事件使用,可以控制下拉刷新的关闭 | 2.2.0 |
refresher-threshold | Number | 50 | 否 | 设置自定义下拉刷新阈值 | 2.2.0 |
pulling-refresh-text | String | Pulling | 否 | 设置自定义下拉刷新下拉过程提示文案,可配合插槽自定义下拉样式 | 2.2.0 |
loosing-refresh-text | String | Loosing | 否 | 设置自定义下拉刷新释放过程提示文案,可配合插槽自定义释放样式 | 2.2.0 |
loading-refresh-rext | String | Loading | 否 | 设置自定义下拉刷新加载过程提示文案,可配合插槽自定义加载样式 | 2.2.0 |
success-refresh-text | String | Success | 否 | 设置自定义下拉刷新刷新成功提示文案,可配合插槽自定义刷新成功样式 | 2.2.0 |
refresh-duration | Number | 300 | 否 | 设置自定义下拉刷新动画过度时长 | 2.2.0 |
scrolltoupper | EventHandle | 否 | 滚动到顶部 / 左边,会触发 scrolltoupper 事件 | 2.2.0 | |
scrolltolower | EventHandle | 否 | 滚动到底部 / 右边,会触发 scrolltolower 事件 | 2.2.0 | |
onscroll | EventHandle | 否 | 滚动时触发,event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth} | 2.2.0 | |
refresh | EventHandle | 否 | 下拉刷新时触发,触发后需要配合 refresh-state 手动关闭下拉刷新状态 | 3.3.1 | |
strict-mode | Boolean | TRUE | 否 | scrolltoupper 和 scrolltolower 这两个事件是否判断手势滑动方向 | 3.3.1 |
scroll-refresh-enabled | Boolean | FALSE | 否 | 是否启用上拉刷新功能 | 3.3.1 |
loadmore-enabled | Boolean | FALSE | 否 | 是否启用上拉加载更多功能 (建议当底部无更多内容时开启,避免上拉滚动过程冲突问题) | 3.5.1 |
loadmore-state | Boolean | FALSE | 否 | 设置当前上拉加载状态,true 表示上拉加载已经被触发,false 表示上拉加载未被触发,结合 loadmore 事件使用,可以控制上拉加载的关闭 | 3.5.1 |
loadmore-threshold | Number | 50 | 否 | 设置自定义上拉加载阈值 | 3.5.1 |
bottom-pulling-refresh-text | String | Pulling | 否 | 设置自定义上拉加载上拉过程提示文案,可配合插槽自定义下拉样式 | 3.5.1 |
bottom-loosing-refresh-text | String | Loosing | 否 | 设置自定义上拉加载释放过程提示文案,可配合插槽自定义释放样式 | 3.5.1 |
bottom-loading-refresh-text | String | Loading | 否 | 设置自定义上拉加载加载过程提示文案,可配合插槽自定义加载样式 | 3.5.1 |
bottom-success-refresh-text | String | Success | 否 | 设置自定义上拉加载加载成功提示文案,可配合插槽自定义刷新成功样式 | 3.5.1 |
loadmore-duration | Number | 300 | 否 | 设置自定义上拉加载动画过度时长 | 3.5.1 |
loadmore | EventHandle | 否 | 上拉刷新时触发,触发后需要配合loadmore-state手动关闭下拉刷新状态 | 3.5.1 |
示例
代码示例 1:Vertical Scroll 纵向滚动
<view class="page-section mt16">
<view class="page-section-title">
<text>Vertical Scroll 纵向滚动</text>
</view>
<view class="page-section-spacing">
<scroll-view
style="height: 300rpx"
:scroll-y="true"
:scroll-top="scrollTop"
:scroll-into-view="scrollIntoView"
:scroll-with-animation="true"
:scroll-animation-duration="120"
:refresh-state="freshY"
:refresher-enabled="true"
loosing-refresh-text="释放触发下拉刷新"
bind:refresh="refreshY"
bind:scrolltoupper="scrolltoupperY"
bind:scrolltolower="scrolltolowerY"
bind:onscroll="handleScrollY"
>
<template v-slot:pulling>
<h1>自定义pulling</h1>
</template>
<view id="demo1" class="scroll-view-item demo-text-1">A</view>
<view id="demo2" class="scroll-view-item demo-text-2">B</view>
<view id="demo3" class="scroll-view-item demo-text-3">C</view>
<view id="demo4" class="scroll-view-item demo-text-1">A</view>
<view id="demo5" class="scroll-view-item demo-text-2">B</view>
<view id="demo6" class="scroll-view-item demo-text-3">C</view>
</scroll-view>
</view>
<view class="mt12">
<button bind:tap="toNextY">to NextY</button>
<button class="ml12" bind:tap="tapMove">tap move</button>
<button class="ml12" bind:tap="scrollToDemo">scroll to demo3</button>
</view>
</view>
Page({
data: {
freshY: false,
scrollTop: 0,
scrollIntoView: '',
},
refreshY() {
this.setData({
freshY: true,
});
setTimeout(() => {
this.setData({
freshY: false,
});
}, 1000);
},
handleScrollY(data) {
console.log('handleScrollY', data);
},
scrolltoupperY() {
dlt.showToast('scrolltoupperY');
},
scrolltolowerY() {
dlt.showToast('scrolltolowerY');
},
toNextY() {
const top = this.data.scrollTop;
const step = Math.floor(top / 150);
const next = (step + 1) * 150;
this.setData({
scrollTop: next > 750 ? 0 : next,
});
},
tapMove() {
this.setData({
scrollTop: this.data.scrollTop + 20 > 750 ? 0 : this.data.scrollTop + 20,
});
},
scrollToDemo() {
this.setData({
scrollIntoView: 'demo3',
});
setTimeout(() => {
this.setData({
scrollIntoView: '',
});
}, 300);
},
});
.scroll-view-item {
height: 300rpx;
font-size: 18px;
color: #ffffff;
display: flex;
position: relative;
align-items: center;
justify-content: center;
position: relative;
z-index: 1000;
}
.demo-text-1 {
background-color: #1aad19;
}
.demo-text-2 {
background-color: #2782d7;
}
.demo-text-3 {
background-color: #f1f1f1;
color: #353535;
}
代码示例 2:Horizontal Scroll 横向滚动
<view class="page-section mt16">
<view class="page-section-title">
<text>Horizontal Scroll 横向滚动</text>
</view>
<view class="page-section-spacing">
<scroll-view
class="scroll-view_H"
:scroll-x="true"
bind:refresh="refreshX"
:refresh-state="freshX"
bind:scrolltoupper="scrolltoupperX"
bind:scrolltolower="scrolltolowerX"
>
<view id="demox1" class="scroll-view-item_H demo-text-1">A</view>
<view id="demox2" class="scroll-view-item_H demo-text-2">B</view>
<view id="demox3" class="scroll-view-item_H demo-text-3">C</view>
</scroll-view>
</view>
</view>
Page({
data: {
freshX: false,
},
refreshX() {
this.setData({
freshX: true,
});
setTimeout(() => {
this.setData({
freshX: false,
});
}, 1000);
},
scrolltoupperX() {
dlt.showToast('scrolltoupperX');
},
scrolltolowerX() {
dlt.showToast('scrolltolowerX');
},
});