当前位置:   article > 正文

【小程序】用scroll-view实现展开与收缩的效果,让ios和安卓统一的效果

微信小程序 scroll-view 滑动过程中同时放大和缩小

前言

项目有一个功能,就是在页面上能够弹出一个分页加载的数据,滑到顶部时就收缩的容器。效果图如下:

效果图的关键功能点:能分页加载的半容器滑到顶部就收缩

既然半容器而且数据要分页加载,那就肯定要到scroll-view,用view不能实现上拉加载。利用scroll-view组件的bindscrolltoupper(用来实现滑到顶部就收缩的效果),bindscrolltolower(用来实现分页加载的功能),就这么愉快的开工~

开工后,就屁颠屁颠的向老大展示效果~

测试几回后,老大说Android和IOS不太一样诶,安卓有点怪的...哈?我测试对比后,发现安卓首先要上滑,再下滑就能收缩的。苹果直接下滑就能收缩的。然后老大说这安卓的用户体验不太好,最好直接下滑就收缩的,你再研究下吧~

bindscrolltoupper用不了,那我用啥呢?诶,不是还有touchstart,touchmove,touchend?想了想,感觉这个可以呢,于是进行“手术”~

果然可以哈,但有点问题,就是滑的太快时,还没到顶部就收缩的,emmm,再看文档,发现事件对象有个target,官方文档说法是"触发事件的组件的一些属性值集合",就是说会记录下该组件的属性,比如距离top多远呢,就打印这个出来看看,果然有offsetTop(离外容器的顶部距离),用这个来判断,如果0,那就是到顶部了,然后就可以收缩的。为了体验好点的,我就用200来作为判断的条件。叨唠就到此了,该上代码了~

wxml:

  1. <template>
  2. <scroll-view class="data-box" style="height: {{dataHei+'rpx'}};" scroll-y="{{isScroll}}" @scrolltolower="loadMore" @touchstart="startTap" @touchmove="moveTap" @touchend="endTap" scroll-with-animation="true">
  3. <!-- 更多的数据 -->
  4. <view class="more-box" hidden="{{!isShowMore}}" @tap="showTap">
  5. 点击查看更多结果
  6. </view>
  7. <!-- 显示的数据 -->
  8. <view class="data-item" hidden="{{isShowMore}}">
  9. <block wx:for="{{dataList}}" wx:key="{{index}}">
  10. <view class="item">{{item}}</view>
  11. </block>
  12. </view>
  13. </scroll-view>
  14. </template>
  15. 复制代码
  • Tip: isScroll必须要有的,因为收缩时会有滚动的现象
  • Tip: isShowMore: 要来切换数据列表和点击更多结果的显示

js:

  1. <script>
  2. import wepy from 'wepy';
  3. export default class index extends wepy.page{
  4. config={
  5. navigationBarTitleText:'scroll-view',
  6. }
  7. data={
  8. dataList:['无可奈何花落去','庄生晓梦迷蝴蝶','天涯何处无芳草','此情可待成追忆','人面不知何处','心悦君兮君不知'],
  9. dataHei:180,//scroll-view的高度
  10. isScroll:false,//是否开启滚动
  11. isShowMore:true,//是否显示更多结果
  12. startY:0,//滑动开始的坐标Y
  13. endY:0,//滑动结束的坐标Y
  14. }
  15. methods={
  16. showTap(){
  17. this.dataHei=750;
  18. this.setMoreData();
  19. },
  20. //滑动的开始事件
  21. startTap(e){
  22. this.startY=this.endY=e.touches[0].pageY;
  23. },
  24. //滑动的过程事件
  25. moveTap(e){
  26. this.endY=e.touches[0].pageY;
  27. },
  28. //滑动的结束事件
  29. endTap(e){
  30. this.endY=e.changedTouches[0].pageY;
  31. let top=e.target.offsetTop;
  32. //判断是不是下滑,并且下滑的距离是不是超过120和top要小于200,否则就不能下滑
  33. if((this.endY>this.startY && Math.abs(this.endY-this.startY)>120 && top<200)){
  34. this.dataHei=180;
  35. // this.isScroll=false;
  36. this.setMoreData();
  37. return;
  38. }
  39. },
  40. loadMore(){
  41. this.dataList=this.dataList.concat(this.dataList);
  42. }
  43. }
  44. setMoreData(){
  45. if(this.dataHei===750){
  46. this.isScroll=true;
  47. this.isShowMore=false;
  48. }else{
  49. this.isScroll=false;
  50. this.isShowMore=true;
  51. }
  52. }
  53. }
  54. </script>
  55. 复制代码

wxss:

  1. <style lang="less" scoped>
  2. .data-box{
  3. background: #f5f5f5;
  4. overflow: hidden;
  5. transition: height 0.2s;
  6. position: fixed;
  7. bottom: 0;
  8. left: 0;
  9. right: 0;
  10. .more-box{
  11. width: 530rpx;
  12. height: 100rpx;
  13. line-height: 100rpx;
  14. margin: 40rpx auto;
  15. background: #FD9727;
  16. color: #fff;
  17. font-size: 34rpx;
  18. text-align: center;
  19. border-radius: 50rpx;
  20. }
  21. .data-item{
  22. .item{
  23. border-bottom: 1px solid #ccc;
  24. font-size: 34rpx;
  25. color: #333;
  26. height: 150rpx;
  27. line-height: 150rpx;
  28. text-align: center;
  29. }
  30. }
  31. }
  32. </style>
  33. 复制代码

就这样了~这方案可能很小白的,如果有其他更好的方案,不妨提出来哈~小弟就是要向你们看齐的~

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号