scroller


可滚动视图区域。

可容纳排成一列的子组件的滚动器。

属性

属性名类型必填默认值说明
heightNumberscroll-direction为vertical时必传定义纵向滚动区域的高度 注意: 1、<scroller> height="{{100}}" /> 这样传值才是Number类型 2、height为-1时,<scroller>的可滚动区域高度为scroller放置点至页面底部
widthNumberscroll-direction为horizontal时必传定义横向滚动区域的宽度 注意: height为-1时,<scroller>填充页面剩余宽度
scroll-directionStringvertical定义滚动的方向。可选为 horizontal 或者 vertical
cstyleString自定义组件内联样式
bottom-offsetNumber0距底部/右边多远时(单位cpx),触发 onBottom 事件
scroll-topNumber0scroll-direction为vertical时,设置滚动到的位置,(单位cpx)
scroll-leftNumber0scroll-direction为horizontal时,设置滚动到的位置,(单位cpx)
bounceBooleantrue上拉下拉是否回弹(仅支持web)
c-bind:scrolltobottomEventHandle滚动到底部,会触发 scrolltobottom 事件 返回事件对象: event.type= "scrolltobottom" event.detail = { direction }
c-bind:onscrollEventHandle滚动时触发, 返回事件对象: event.type = 'scroll' event.detail = {scrollLeft, scrollTop, scrollHeight, scrollWidth, deltaX, deltaY}

限制

不允许相同方向的 <list> 或者 <scroller> 互相嵌套,换句话说就是嵌套的 <list>/<scroller> 必须是不同的方向。

举个例子,不允许一个垂直方向的 <list> 嵌套的一个垂直方向的 <scroller> 中,但是一个垂直方向的 <list> 是可以嵌套的一个水平方向的 <list> 或者 <scroller> 中的。

示例

  1. <template>
  2. <view class="container">
  3. <scroller
  4. scroll-direction="{{scrollDirection}}"
  5. bottom-offset="{{bottomOffset}}"
  6. c-bind:scrolltobottom="onBottom"
  7. c-bind:onscroll="onScroll"
  8. height="{{-1}}"
  9. >
  10. <view
  11. class="cell"
  12. c-for="{{panels}}"
  13. c-for-index="i"
  14. c-for-item="item"
  15. c-bind:tap="change"
  16. data-idx="{{i}}"
  17. >
  18. <view class="panel" style="{{item.computedStyle}}">
  19. <text class="text">{{item.label}}</text>
  20. </view>
  21. </view>
  22. </scroller>
  23. </view>
  24. </template>
  25. <script>
  26. class Scroller {
  27. data = {
  28. /**
  29. * scroller 配置
  30. */
  31. bottomOffset: 20,
  32. scrollDirection: 'vertical',
  33. panels: [
  34. ],
  35. rows: []
  36. }
  37. methods = {
  38. change (e) {
  39. let target = e.currentTarget
  40. let dataset = target.dataset
  41. let i = dataset.idx
  42. const item = this.panels[i]
  43. if (item) {
  44. item.height = item.height === 200 ? 400 : 200
  45. item.width = item.width === 330 ? 730 : 330
  46. item.computedStyle = this.$cmlStyle(`height:${item.height}cpx;width:${item.width}cpx;background-color:${item.bgc};opacity:${item.opacity}`)
  47. }
  48. },
  49. randomfn () {
  50. let ary = [];
  51. for(let i = 1; i<= 40; i++) {
  52. let item = {label: i ,height: 200 , width:730, bgc:'#69BE96',opacity:1}
  53. item.computedStyle = this.$cmlStyle(`height:${item.height}cpx;width:${item.width}cpx;background-color:${item.bgc};opacity:${item.opacity}`)
  54. ary.push(item)
  55. }
  56. return ary;
  57. },
  58. onScroll(e) {
  59. console.log(e);
  60. },
  61. onBottom(e) {
  62. console.log(e);
  63. }
  64. }
  65. created (res) {
  66. this.panels = this.randomfn()
  67. for (let i = 0; i < 30; i++) {
  68. this.rows.push('row ' + i)
  69. }
  70. console.log('demo page created:', res)
  71. }
  72. }
  73. export default new Scroller();
  74. </script>
  75. <style scoped>
  76. .container {
  77. position: absolute;
  78. top: 0;
  79. left: 0;
  80. right: 0;
  81. bottom: 0;
  82. }
  83. .title {
  84. text-align: center;
  85. flex-direction: row;
  86. justify-content: center;
  87. }
  88. .panel {
  89. display: flex;
  90. margin: 10cpx;
  91. top:10cpx;
  92. align-items: center;
  93. justify-content: center;
  94. text-align: center;
  95. border: 1px solid #666;
  96. border-radius: 10cpx;
  97. transition-property: width,height;
  98. transition-duration: 0.5s;
  99. transition-delay: 0s;
  100. transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
  101. }
  102. .cell{
  103. display: flex;
  104. background-color:white;
  105. flex-direction: row;
  106. }
  107. .text {
  108. font-size: 60cpx;
  109. color: white;
  110. }
  111. </style>
  112. <script cml-type="json">
  113. {
  114. "base": {}
  115. }
  116. </script>

scroller  - 图1wx

scroller  - 图2web

scroller  - 图3native

Bug & Tip

  • 使用竖向滚动时,<scroller>需要有一个固定高度。
  • 如果子组件的总高度高于其本身,那么所有的子组件都可滚动。
  • <scroller>可以当作根元素或者嵌套元素使用。
  • <scroller> 中不可以使用 <textarea><video> 组件。
  • <scroller> 中不建议在<scroller>上面加class改变样式,可以通过cstyle属性传入内联样式。
  • <scroller> 的子组件定位无效。