scroller


可滚动视图区域。

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

属性

属性名类型必填默认值说明
heightNumberscroll-direction为vertical时必传0定义纵向滚动区域的高度
widthNumberscroll-direction为horizontal时必传0定义横向滚动区域的宽度
scroll-directionStringvertical定义滚动的方向。可选为 horizontal 或者 vertical
bottom-offsetNumber0距底部/右边多远时(单位cpx),触发 onBottom 事件
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="{{winHeight}}"
  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. import cml from "chameleon-api"
  27. class Scroller {
  28. data = {
  29. /**
  30. * scroller 配置
  31. */
  32. bottomOffset: 20,
  33. scrollDirection: 'vertical',
  34. panels: [
  35. ],
  36. rows: [],
  37. winHeight: 0
  38. }
  39. methods = {
  40. change (e) {
  41. let target = e.currentTarget
  42. let dataset = target.dataset
  43. let i = dataset.idx
  44. const item = this.panels[i]
  45. if (item) {
  46. item.height = item.height === 200 ? 400 : 200
  47. item.width = item.width === 330 ? 730 : 330
  48. item.computedStyle = this.$cmlStyle(`height:${item.height}cpx;width:${item.width}cpx;background-color:${item.bgc};opacity:${item.opacity}`)
  49. }
  50. },
  51. randomfn () {
  52. let ary = [];
  53. for(let i = 1; i<= 40; i++) {
  54. let item = {label: i ,height: 200 , width:730, bgc:'#69BE96',opacity:1}
  55. item.computedStyle = this.$cmlStyle(`height:${item.height}cpx;width:${item.width}cpx;background-color:${item.bgc};opacity:${item.opacity}`)
  56. ary.push(item)
  57. }
  58. return ary;
  59. },
  60. onScroll(e) {
  61. },
  62. onBottom(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. mounted (res) {
  73. cml.getSystemInfo().then((info)=>{
  74. this.winHeight = Number(info.viewportHeight)
  75. })
  76. }
  77. }
  78. export default new Scroller();
  79. </script>
  80. <style scoped>
  81. .container {
  82. position: absolute;
  83. top: 0;
  84. left: 0;
  85. right: 0;
  86. bottom: 0;
  87. }
  88. .title {
  89. text-align: center;
  90. flex-direction: row;
  91. justify-content: center;
  92. }
  93. .panel {
  94. display: flex;
  95. margin: 10cpx;
  96. top:10cpx;
  97. align-items: center;
  98. justify-content: center;
  99. text-align: center;
  100. border: 1px solid #666;
  101. border-radius: 10cpx;
  102. transition-property: width,height;
  103. transition-duration: 0.5s;
  104. transition-delay: 0s;
  105. transition-timing-function: cubic-bezier(0.25, 0.1, 0.25, 1.0);
  106. }
  107. .cell{
  108. display: flex;
  109. background-color:white;
  110. flex-direction: row;
  111. }
  112. .text {
  113. font-size: 60cpx;
  114. color: white;
  115. }
  116. </style>
  117. <script cml-type="json">
  118. {
  119. "base": {}
  120. }
  121. </script>
  122. </script>

scroller  - 图1wx

scroller  - 图2web

scroller  - 图3native

推荐使用

  • 视窗为设备屏幕,示例如下
  1. <view style="position:absolute;top: 0;left: 0;bottom: 0;right: 0;">
  2. <scroller>
  3. ...
  4. </scroller>
  5. </view>

Bug & Tip

  • 使用竖向滚动时,<scroller>需要有一个固定高度。
  • 如果子组件的总高度高于其本身,那么所有的子组件都可滚动。
  • <scroller>可以当作根元素或者嵌套元素使用。
  • <scroller> 中不可以使用 <textarea><video> 组件。