1# ScrollBar 2 3滚动条组件ScrollBar,用于配合可滚动组件使用,如[ArcList](ts-container-arclist.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)、[Scroll](ts-container-scroll.md)、[WaterFlow](ts-container-waterflow.md)。 4 5> **说明:** 6> 7> - 该组件从API version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 8> - ScrollBar主轴方向不设置大小时,采用父组件[布局约束](../js-apis-arkui-frameNode.md#layoutconstraint12)中的maxSize作为主轴方向大小。如果ScrollBar的父组件存在可滚动组件,如[ArcList](ts-container-arclist.md)、[List](ts-container-list.md)、[Grid](ts-container-grid.md)、[Scroll](ts-container-scroll.md)、[WaterFlow](ts-container-waterflow.md),建议设置ScrollBar主轴方向大小,否则ScrollBar主轴方向大小可能为无穷大。 9 10 11## 子组件 12 13可以包含单个子组件。 14 15 16## 接口 17 18ScrollBar(value: ScrollBarOptions) 19 20创建滚动条组件。 21 22**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 23 24**系统能力:** SystemCapability.ArkUI.ArkUI.Full 25 26**参数:** 27 28| 参数名 | 类型 | 必填 | 说明 | 29| -------- | -------- | -------- | -------- | 30| value | [ScrollBarOptions](#scrollbaroptions对象说明)| 是 | 滚动条组件参数。 | 31 32## 属性 33 34除支持[通用属性](ts-component-general-attributes.md)外,还支持以下属性: 35 36### enableNestedScroll<sup>14+</sup> 37 38enableNestedScroll(enabled: Optional\<boolean>) 39 40设置滚动条是否嵌套滚动。 41 42**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。 43 44**系统能力:** SystemCapability.ArkUI.ArkUI.Full 45 46**参数:** 47 48| 参数名 | 类型 | 必填 | 说明 | 49| ------ | ------- | ---- | ------------------------------------- | 50| enabled | Optional\<boolean> | 是 | 是否执行嵌套滚动。设置为true执行嵌套滚动,设置为false不嵌套滚动。 <br/>默认值:false | 51 52> **说明:** 53> 54> 滚动条使能嵌套滚动时,滚动条的滚动偏移量会先发给绑定的内层滚动组件,内层滚动组件再根据设置的嵌套滚动优先级依次传递给外层父滚动组件。 55> 56> WaterFlow组件的布局模式为移动窗口式(SLIDING_WINDOW)时,不支持嵌套滚动。 57> 58> 设置嵌套滚动模式为PARALLEL时,父子组件同时滚动,需要开发者在onScrollFrameBegin中按照所需逻辑,自行设置父子组件滚动顺序。 59 60## ScrollBarOptions对象说明 61 62滚动条组件参数。 63 64**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 65 66**系统能力:** SystemCapability.ArkUI.ArkUI.Full 67 68| 名称 | 类型 | 必填 | 说明 | 69| -------- | -------- | -------- | -------- | 70| scroller | [Scroller](ts-container-scroll.md#scroller) | 是 | 可滚动组件的控制器。用于与可滚动组件进行绑定。 | 71| direction | [ScrollBarDirection](#scrollbardirection枚举说明) | 否 | 滚动条的方向,控制可滚动组件对应方向的滚动。<br/>默认值:ScrollBarDirection.Vertical | 72| state | [BarState](ts-appendix-enums.md#barstate) | 否 | 滚动条状态。<br/>默认值:BarState.Auto | 73 74> **说明:** 75> 76> ScrollBar组件负责定义可滚动区域的行为样式,ScrollBar的子节点负责定义滚动条的行为样式。 77> 78> 滚动条组件与可滚动组件通过Scroller进行绑定,且只有当两者方向相同时,才能联动,ScrollBar与可滚动组件仅支持一对一绑定。 79> 80> 从API version 12开始,ScrollBar组件没有子节点时,支持显示默认样式的滚动条。 81 82## ScrollBarDirection枚举说明 83 84滚动条方向枚举。 85 86**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 87 88**系统能力:** SystemCapability.ArkUI.ArkUI.Full 89 90| 名称 | 说明 | 91| -------- | -------- | 92| Vertical | 纵向滚动条。 | 93| Horizontal | 横向滚动条。 | 94 95 96## 示例1(设置子节点) 97 98该示例为ScrollBar组件有子节点时的滚动条样式。 99 100```ts 101// xxx.ets 102@Entry 103@Component 104struct ScrollBarExample { 105 private scroller: Scroller = new Scroller() 106 private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 107 108 build() { 109 Column() { 110 Stack({ alignContent: Alignment.End }) { 111 Scroll(this.scroller) { 112 Flex({ direction: FlexDirection.Column }) { 113 ForEach(this.arr, (item: number) => { 114 Row() { 115 Text(item.toString()) 116 .width('80%') 117 .height(60) 118 .backgroundColor('#3366CC') 119 .borderRadius(15) 120 .fontSize(16) 121 .textAlign(TextAlign.Center) 122 .margin({ top: 5 }) 123 } 124 }, (item:number) => item.toString()) 125 }.margin({ right: 15 }) 126 } 127 .width('90%') 128 .scrollBar(BarState.Off) 129 .scrollable(ScrollDirection.Vertical) 130 ScrollBar({ scroller: this.scroller, direction: ScrollBarDirection.Vertical,state: BarState.Auto }) { 131 Text() 132 .width(20) 133 .height(100) 134 .borderRadius(10) 135 .backgroundColor('#C0C0C0') 136 }.width(20).backgroundColor('#ededed') 137 } 138 } 139 } 140} 141``` 142 143 144 145 146## 示例2(不设置子节点) 147 148该示例为ScrollBar组件没有子节点时的滚动条样式。 149 150```ts 151@Entry 152@Component 153struct ScrollBarExample { 154 private scroller: Scroller = new Scroller() 155 private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] 156 157 build() { 158 Column() { 159 Stack({ alignContent: Alignment.End }) { 160 Scroll(this.scroller) { 161 Flex({ direction: FlexDirection.Column }) { 162 ForEach(this.arr, (item: number) => { 163 Row() { 164 Text(item.toString()) 165 .width('80%') 166 .height(60) 167 .backgroundColor('#3366CC') 168 .borderRadius(15) 169 .fontSize(16) 170 .textAlign(TextAlign.Center) 171 .margin({ top: 5 }) 172 } 173 }, (item:number) => item.toString()) 174 }.margin({ right: 15 }) 175 } 176 .width('90%') 177 .scrollBar(BarState.Off) 178 .scrollable(ScrollDirection.Vertical) 179 ScrollBar({ scroller: this.scroller, direction: ScrollBarDirection.Vertical,state: BarState.Auto }) 180 } 181 } 182 } 183} 184``` 185 186 187 188 189## 示例3(支持嵌套滚动) 190 191该示例通过enableNestedScroll属性使ScrollBar组件支持嵌套滚动。 192```ts 193@Entry 194@Component 195struct StickyNestedScroll { 196 listScroller: Scroller = new Scroller(); 197 @State array: number[] = [] 198 199 @Styles 200 listCard() { 201 .backgroundColor(Color.White) 202 .height(72) 203 .width("100%") 204 .borderRadius(12) 205 } 206 207 build() { 208 Stack() { 209 Scroll() { 210 Column() { 211 Text('Scroll Area') 212 .width("100%") 213 .height("40%") 214 .backgroundColor('#0080DC') 215 .textAlign(TextAlign.Center) 216 List({ space: 10, scroller: this.listScroller }) { 217 ForEach(this.array, (item: number) => { 218 ListItem() { 219 Text('item' + item) 220 .fontSize(16) 221 } 222 .listCard() 223 }, (item: string) => item) 224 } 225 .scrollBar(BarState.Off) 226 .nestedScroll({ 227 scrollForward: NestedScrollMode.PARENT_FIRST, 228 scrollBackward: NestedScrollMode.SELF_FIRST 229 }) 230 .height("100%") 231 } 232 .width("100%") 233 } 234 .edgeEffect(EdgeEffect.Spring) 235 .backgroundColor('#DCDCDC') 236 .scrollBar(BarState.Off) 237 .width('100%') 238 .height('100%') 239 ScrollBar({ scroller: this.listScroller}) 240 .position({right:0}) 241 .enableNestedScroll(true) 242 } 243 } 244 245 aboutToAppear() { 246 for (let i = 0; i < 15; i++) { 247 this.array.push(i) 248 } 249 } 250} 251``` 252