【微信小程序】用scroll-view實現展開與收縮的效果,讓ios和安卓統一的效果

前言

項目有一個功能,就是在頁面上可以彈出一個分頁加載的數據,滑到頂部時就收縮的容器。效果圖以下:bash

效果圖

效果圖的關鍵功能點:能分頁加載的半容器滑到頂部就收縮less

既然半容器並且數據要分頁加載,那就確定要到scroll-view,用view不能實現上拉加載。利用scroll-view組件的bindscrolltoupper(用來實現滑到頂部就收縮的效果),bindscrolltolower(用來實現分頁加載的功能),就這麼愉快的開工~xss

開工後,就屁顛屁顛的向老大展現效果~測試

測試幾次後,老大說Android和IOS不太同樣誒,安卓有點怪的...哈?我測試對比後,發現安卓首先要上滑,再下滑就能收縮的。蘋果直接下滑就能收縮的。而後老大說這安卓的用戶體驗不太好,最好直接下滑就收縮的,你再研究下吧~ui

WechatIMG38.jpeg

bindscrolltoupper用不了,那我用啥呢?誒,不是還有touchstart,touchmove,touchend?想了想,感受這個能夠呢,因而進行「手術」~this

果真能夠哈,但有點問題,就是滑的太快時,還沒到頂部就收縮的,emmm,再看文檔,發現事件對象有個target,官方文檔說法是"觸發事件的組件的一些屬性值集合",就是說會記錄下該組件的屬性,好比距離top多遠呢,就打印這個出來看看,果真有offsetTop(離外容器的頂部距離),用這個來判斷,若是0,那就是到頂部了,而後就能夠收縮的。爲了體驗好點的,我就用200來做爲判斷的條件。叨嘮就到此了,該上代碼了~spa

wxml:

<template>
  <scroll-view class="data-box" style="height: {{dataHei+'rpx'}};" scroll-y="{{isScroll}}" @scrolltolower="loadMore" @touchstart="startTap" @touchmove="moveTap" @touchend="endTap" scroll-with-animation="true">

    <!-- 更多的數據 -->
    <view class="more-box" hidden="{{!isShowMore}}" @tap="showTap"> 
      點擊查看更多結果
    </view>

    <!-- 顯示的數據 -->
    <view class="data-item" hidden="{{isShowMore}}">
      <block wx:for="{{dataList}}" wx:key="{{index}}">
        <view class="item">{{item}}</view>
      </block>
    </view>
  </scroll-view>
</template>
複製代碼
  • Tip: isScroll必需要有的,由於收縮時會有滾動的現象
  • Tip: isShowMore: 要來切換數據列表和點擊更多結果的顯示

js:

<script>
import wepy from 'wepy';

export default class index extends wepy.page{
  config={
    navigationBarTitleText:'scroll-view',
  }

  data={
    dataList:['迫不得已花落去','莊生曉夢迷蝴蝶','天涯何處無芳草','此情可待成追憶','人面不知何處','心悅君兮君不知'],
    dataHei:180,//scroll-view的高度
    isScroll:false,//是否開啓滾動
    isShowMore:true,//是否顯示更多結果
    startY:0,//滑動開始的座標Y
    endY:0,//滑動結束的座標Y
  }

  methods={
    showTap(){
      this.dataHei=750;
      this.setMoreData();
    },

    //滑動的開始事件
    startTap(e){
      this.startY=this.endY=e.touches[0].pageY;
    },

    //滑動的過程事件
    moveTap(e){
      this.endY=e.touches[0].pageY;
    },

    //滑動的結束事件
    endTap(e){
      this.endY=e.changedTouches[0].pageY;
      let top=e.target.offsetTop;
      //判斷是否是下滑,而且下滑的距離是否是超過120和top要小於200,不然就不能下滑
      if((this.endY>this.startY && Math.abs(this.endY-this.startY)>120  && top<200)){
        this.dataHei=180;
        // this.isScroll=false;
        this.setMoreData();
        return;
      }

    },

    loadMore(){
      this.dataList=this.dataList.concat(this.dataList);
    }
  }

  setMoreData(){
    if(this.dataHei===750){
      this.isScroll=true;
      this.isShowMore=false;
    }else{
      this.isScroll=false;
      this.isShowMore=true;
    }
  }
}
</script>
複製代碼

wxss:

<style lang="less" scoped>
  .data-box{
    background: #f5f5f5;
    overflow: hidden;
    transition: height 0.2s;
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    .more-box{
      width: 530rpx;
      height: 100rpx;
      line-height: 100rpx;
      margin: 40rpx auto;
      background: #FD9727;
      color: #fff;
      font-size: 34rpx;
      text-align: center;
      border-radius: 50rpx;
    }
    .data-item{
      .item{
        border-bottom: 1px solid #ccc;
        font-size: 34rpx;
        color: #333;
        height: 150rpx;
        line-height: 150rpx;
        text-align: center;
      }
    }
  }
</style>
複製代碼

就這樣了~這方案可能很小白的,若是有其餘更好的方案,不妨提出來哈~小弟就是要向大家看齊的~3d

相關文章
相關標籤/搜索