小程序左右聯動實現記錄


  最近在學習小程序,實現了左右聯動的功能,記錄一下思緒,方便以后參考。

  最終的界面如下, 點擊左邊任意一個項目,右邊會跳到相應項目的起始位置,右邊滑動,左則會跳到相應的位置。

  

  在這里,右則每一項的高度都是固定的,方便定位當前滑動距離在哪一個大項(左則)里。右則的 scroll-view 使用了一項關鍵的屬性:scroll-into-view,這個屬性用來確定 scrollTop 的值的,當 scroll-into-view 的值和 scroll-view 里面的元素的id的值相等時,scroll-view 會定位到該元素,scrollTop 的值就是滑動到該元素的值。

  做這個功能的時候,遇到一個問題,就是右則的小項種類不多的時候,例如某個類目只有1~2個,那么點擊左則的大項的時候,會出現點擊不到的現象。這里可以用點小技巧來解決:

點擊左則大項的時候,設置當前點擊標記為true,設置 classifySeleted 為當前點擊的項目。 然后在滑動觸發函數(onGoodsScroll)里面,判斷當前觸發滑動是否點擊產生的,如果是,則不設置 classifySeleted  的值,否則就計算 classifySeleted 的值並設置。

wxml代碼如下:

 1     <view class="content-container">
 2         <scroll-view class="classify-container" scroll-y="true">
 3             <view class="classify {{classifySeleted==classify.typeId?'active':''}}" wx:for="{{cakeTypes}}" wx:for-item="classify" wx:key="id" data-id="{{classify.typeId}}" bindtap="tapClassify">
 4                 <view class="name">{{classify.typeName}}</view>
 5             </view>
 6         </scroll-view>
 7         <scroll-view class="goods-container" scroll-y="true" scroll-into-view="{{'inToView' + typeIndex}}" bindscroll="onGoodsScroll" scroll-top="{{scrollTop}}">
 8             <view wx:for="{{cakeTypes}}" wx:for-item="classify" wx:key="id">
 9                 <view class="title" id="{{'inToView'+classify.typeId}}">{{classify.typeName}}</view>
10                 <view class="goods" wx:for="{{classify.productIds}}" wx:for-item="cake" wx:key="id">
11                     <image class="pic" src="{{cake.imgSrc}}" data-src="{{cake.imgSrc}}" data-list="{{cake.imgSrc}}" bindtap="tapImg"></image>
12                     <view class="name ellipsis">{{cake.name}}</view>
13                     <view class="sold">{{cake.introduce}}</view>
14                     <view class="price">¥{{cake.price}}</view>
15                 </view>
16             </view>
17         </scroll-view>
18     </view>

js代碼如下:

 1   onGoodsScroll: function (e) {
 2 
 3     var scrollTop = e.detail.scrollTop;
 4     var h = 0;
 5     var classifySeleted = this.data.classifySeleted;
 6     var titleHeight = Math.ceil(70 * this.data.percent);
 7     var itemHeight = Math.ceil(180 * this.data.percent);
 8 
 9     this.data.cakeTypes.forEach(function (classify, i) {
10       console.log("h:" + h + " scrollTop:" + scrollTop);
11       var _h = titleHeight + classify.productIds.length * itemHeight;  
12       if (scrollTop >= h - 10) {
13         classifySeleted = classify.typeId;
14       }
15       h += _h;
16     });
17 
18     if (this.data.isTap)  {
19       this.setData ({
20         isTap: false
21       })
22     } else {
23         this.setData({
24           classifySeleted: classifySeleted
25         });  
26     }  
27   },
28 
29   tapClassify: function (e) {
30     var id = e.target.dataset.id;
31     this.setData({
32       isTap: true,
33       classifySeleted: id,
34       typeIndex: id
35     });
36   },

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM