属性 | 说明 |
---|---|
scroll-x | 允许横向滚动;最好也显式指定宽度;谨慎使用 % 宽度 |
scroll-y | 允许纵向滚动;需要指定高度 |
scroll-into-view | 滚动到值为id的某子元素;id不能以数字开头 |
scroll-with-animation | 使用动画过渡 |
scroll-top | 设置竖向滚动条位置 |
bindscroll | 滚动时触发 |
属性 | 说明 |
---|---|
enable-flex | 布尔;默认false;启用 flexbox 布局,使之成为 flex 容器!!! |
using-sticky | 布尔;默认false;启用 position: sticky 特性 |
属性 | 说明 |
---|---|
type |
渲染模式
list:列表模式;默认
custom:自定义模式; 子组件是sticky-section、list-view或grid-view
nested:嵌套模式
|
using-sticky | 布尔;默认false;启用 position: sticky 特性 |
方案1:容器不换行 nowrap;子项项调整为 inline-block
<scroll-view scroll-x class="wrap"> <view class="item">item1</view> ... <view class="item">item10</view> </scroll-view>
wxss - 如设置了每个子项的左右margin,通常最后和第一个需要特别处理,消除margin
.wrap{ white-space: nowrap; } .item{ display: inline-block; margin: 0 20rpx; }
清除margin
.wrap .item:last-child{ margin-right: 0; } .wrap .item:first-child{ margin-left: 0; }
方案2:在容器和子项之间增加一个view作为间接容器,view使用弹性盒子flex布局
默认情况下,flex会压缩子项;为了撑开,子项设置不缩放:flex-shrink: 0;
<scroll-view scroll-x class="wrap"> <view class="inner-wrap"> <view class="item">item1</view> ... <view class="item">item10</view> </view> </scroll-view>
.inner-wrap{ display: flex; gap: 40rpx; }
.item{ flex-shrink: 0; }
方案3:小程序默认方案:为容器增加enable-flex属性启用并使用弹性盒子flex布局
仍然需要单独设置各项的间隔;样式过于分散,不推荐
<scroll-view scroll-y using-sticky class="sc"></scroll-view>
滚动视图scroll-view和轮播swiper配合使用
单击滚动导航项,轮播跳转到指定项
拖动改变轮播时,滚动导航项也相应改变;且当前导航项样式高亮
滚动导航项使用自定义属性data-获取各项的索引
轮播使用改变时间获取当前current
<scroll-view scroll-x scroll-into-view="{{curIndex}}"> <view class="nav"> <view class="item {{index==curIndex?'active':''}}" wx:for="{{nav}}" wx:key="index" data-ind="{{item}}" bind:tap="selectItem"> {{item}} </view> </view> </scroll-view> <swiper current="{{curIndex}}" bindchange="changeItem" circular> <swiper-item class="swiper-item" wx:for="{{10}}" wx:key="index"> {{item}} </swiper-item> </swiper>
selectItem(e:any) { this.setData({ curIndex: e.target.dataset.ind }) }, changeItem(e:any){ this.setData({ curIndex: e.detail.current }) }
改进方案:使用双向绑定实现 - 简直不要太爽,详情请参考 双向绑定