需求
类似淘宝商品详情的长列表滚动,点击顶部需要滚动到指定位置
So
使用了ScrollView的属性“scroll-into-view”实现
但是,会发现scrollView中使用的uchart(主要是canvas)不会跟随滚动,canvas就像使用了fixed布局一样
微信很直接的说了canvas是原生组件,层级是最高的,无法嵌套在scroll-view
、swiper
、picker-view
、movable-view
解决方案:
网上常说的:disable-scroll="true"、:canvas="true"均没啥用,既然问题是不能在scroll-view中使用,那就以此为出发点解决需求
主要使用三个东西点击可看API,“类似Jquery的选择器wx.createSelectorQuery()”、“滚动到指定位置wx.pageScrollTo()”、“生命周期函数:页面滚动监听onPageScroll()”
onPageScroll():当页面滚动超出第一屏时,显示出顶部的快捷导航
wx.createSelectorQuery():当点击顶部的快捷导航时获取指定容器的位置
wx.pageScrollTo():获取到指定容器的位置后利用此方法滚动过去
详见代码(以下uni开头写微信原生直接替换wx即可)
<view class="menubar" v-show="showQuickMenu">
<view @tap="changeNav(1)">商品</view>
<view @tap="changeNav(2)">评论</view>
<view @tap="changeNav(3)">详情</view>
</view>
<view id="pageContainer" >
<view id="part1">商品区域</view>
<view id="part2">评论区域</view>
<view id="part3">详情区域</view>
</view>
onPageScroll(e){
if(e.scrollTop>100){
this.showQuickMenu=true;
}else{
this.showQuickMenu=false;
}
},
changeNav(index){
let id = 'part' + index;
uni.createSelectorQuery().select('#pageContainer').boundingClientRect(contain => {
uni.createSelectorQuery().select('#'+id).boundingClientRect(part=> {
uni.pageScrollTo({
duration:0,
scrollTop:part.top - contain.top,
})
}).exec();
}).exec();
}