亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序中仿今日頭條AppTopbar實現教程

2020-03-21 16:19:15
字體:
來源:轉載
供稿:網友

今日頭條App的Topbar是一個典型的頻道管理和切換組件,自己前段時間研究了一番,在微信小程序上也實現了類似的效果。

我們先看具體效果好了 ↓↓↓

微信小程序,今日頭條,AppTopbar

微信小程序,今日頭條,AppTopbar

微信小程序,今日頭條,AppTopbar

接下來,簡要說一下實現思路。

先看視圖層,Topbar橫向滾動對應的WXML代碼如下:
 

  1. <scroll-view class="navbar" scroll-x="true" scroll-left="{{scrollNavbarLeft}}"> 
  2.  
  3.     <view class="navbar-item {{ navbarArray[item].type }}" id="{{ item }}" wx:for="{{ navbarShowIndexArray }}" catchtap="onTapNavbar"> 
  4.  
  5.         <view class="navbar-item-wrap">{{ navbarArray[item].text }}</view> 
  6.  
  7.     </view> 
  8.  
  9.     <view class="navbar-item visibility-hidden"> 
  10.  
  11.         <view class="navbar-item-wrap">空白</view> 
  12.  
  13.     </view> 
  14.  
  15. </scroll-view> 
  16.  
  17. <view class="navbar-arrow-down" catchtap="showChannelSettingModal"> 
  18.  
  19.     <view class="navbar-arrow-down-wrap"> 
  20.  
  21.         <image class="navbar-arrow-icon" src="/images/index/icon_arrow_down.png"></image> 
  22.  
  23.     </view> 
  24.  
  25. </view> 


scroll-view負責Topbar中各個頻道的呈現,所有頻道的相關數據都存儲在navbarArray這個對象數組里,而數組navbarShowIndexArray里存儲了要顯示頻道在數組navbarArray中的索引。

不難猜測,頻道是否選中高亮,與數組navbarArray有關;頻道是否顯示,與數組navbarShowIndexArray有關。

點擊某個頻道名稱,就會觸發對應頻道的切換操作。

view.navbar-arrow-down對應的是右上角的向下箭頭,可采用fixed定位類型,點擊后彈出管理頻道的Modal.

 

  1. <view class="channel-setting-modal {{ channelSettingModalShow }}" hidden="{{ channelSettingModalHide }}"> 
  2.  
  3.     <view class="channel-show-text"> 
  4.  
  5.         <view class="channel-show-text-wrap">顯示頻道</view> 
  6.  
  7.     </view> 
  8.  
  9.     <view class="channel-item" wx:for="{{ navbarShowIndexArray }}"> 
  10.  
  11.         <view class="channel-item-wrap"> 
  12.  
  13.             <view class="channel-item-left"> 
  14.  
  15.                 <image class="channel-item-icon-minus {{ !index || navbarShowIndexArray.length < 4 ? 'visibility-hidden' : '' }}" id="{{ item }}.0" src="/images/index/icon_minus.png" catchtap="hideChannel"></image> 
  16.  
  17.                 <view class="channel-item-text">{{ navbarArray[item].text }}</view> 
  18.  
  19.             </view> 
  20.  
  21.             <view class="channel-item-up {{ index < 2 ? 'visibility-hidden' : '' }}" id="{{ item }}.00" catchtap="upChannel">上移</view> 
  22.  
  23.         </view> 
  24.  
  25.     </view> 
  26.  
  27.     <view class="channel-hide-text"> 
  28.  
  29.         <view class="channel-hide-text-wrap">隱藏頻道</view> 
  30.  
  31.     </view> 
  32.  
  33.     <view class="channel-item" wx:for="{{ navbarHideIndexArray }}"> 
  34.  
  35.         <view class="channel-item-wrap"> 
  36.  
  37.             <view class="channel-item-left"> 
  38.  
  39.                 <image class="channel-item-icon-plus" id="{{ item }}.0" src="/images/index/icon_plus.png" catchtap="showChannel"></image> 
  40.  
  41.                 <view class="channel-item-text">{{ navbarArray[item].text }}</view> 
  42.  
  43.             </view> 
  44.  
  45.             <view class="channel-item-up visibility-hidden">上移</view> 
  46.  
  47.         </view> 
  48.  
  49.     </view> 
  50.  
  51. </view> 




在這個管理頻道的Modal里,通過改變數組navbarShowIndexArray來控制頻道是否顯示和顯示順序,同時,需要另外一個數組navbarHideIndexArray來存儲隱藏的頻道。

Modal顯示的時候,Topbar需要被另一個寫有“頻道設置”字樣的Bar覆蓋。
 

  1. <view class="channel-setting {{ channelSettingShow }}"> 
  2.  
  3.     <view class="channel-setting-text">頻道設置</view> 
  4.  
  5.     <view class="navbar-arrow-up" catchtap="hideChannelSettingModal"> 
  6.  
  7.         <image class="navbar-arrow-icon navbar-arrow-icon-up" src="/images/index/icon_arrow_up.png"></image> 
  8.  
  9.     </view> 
  10.  
  11. </view> 

然后,我們來看邏輯層的實現。初始化的部分data如下:
 

  1. data: { 
  2.  
  3.     navbarArray: [{ 
  4.  
  5.         text: '推薦'
  6.  
  7.         type: 'navbar-item-active' 
  8.  
  9.     }, { 
  10.  
  11.         text: '熱點'
  12.  
  13.         type: '' 
  14.  
  15.     }, { 
  16.  
  17.         text: '視頻'
  18.  
  19.         type: '' 
  20.  
  21.     }, { 
  22.  
  23.         text: '圖片'
  24.  
  25.         type: '' 
  26.  
  27.     }, { 
  28.  
  29.         text: '段子'
  30.  
  31.         type: '' 
  32.  
  33.     }, { 
  34.  
  35.         text: '社會'
  36.  
  37.         type: '' 
  38.  
  39.     }, { 
  40.  
  41.         text: '娛樂'
  42.  
  43.         type: '' 
  44.  
  45.     }, { 
  46.  
  47.         text: '科技'
  48.  
  49.         type: '' 
  50.  
  51.     }, { 
  52.  
  53.         text: '體育'
  54.  
  55.         type: '' 
  56.  
  57.     }, { 
  58.  
  59.         text: '汽車'
  60.  
  61.         type: '' 
  62.  
  63.     }, { 
  64.  
  65.         text: '財經'
  66.  
  67.         type: '' 
  68.  
  69.     }, { 
  70.  
  71.         text: '搞笑'
  72.  
  73.         type: '' 
  74.  
  75.     }], 
  76.  
  77.     navbarShowIndexArray: Array.from(Array(12).keys()), 
  78.  
  79.     navbarHideIndexArray: [], 
  80.  
  81.     channelSettingShow: ''
  82.  
  83.     channelSettingModalShow: ''
  84.  
  85.     channelSettingModalHide: true 
  86.  




11的數組,剛好是數組navbarArray的所有元素的索引。顯然,初始化的結果是所有頻道都將顯示。

為了實現頻道個性化配置的保存,navbarShowIndexArray還需要通過小程序的數據緩存API儲存起來。

storeNavbarShowIndexArray: function() {

    const that = this;

    wx.setStorage({

        key: 'navbarShowIndexArray',

        data: that.data.navbarShowIndexArray

    });

}

切換頻道的函數如下:
 

  1. switchChannel: function(targetChannelIndex) { 
  2.  
  3.     this.getArticles(targetChannelIndex); 
  4.  
  5.     let navbarArray = this.data.navbarArray; 
  6.  
  7.     navbarArray.forEach((item, index, array) => { 
  8.  
  9.         item.type = ''
  10.  
  11.         if (index === targetChannelIndex) { 
  12.  
  13.             item.type = 'navbar-item-active'
  14.  
  15.         } 
  16.  
  17.     }); 
  18.  
  19.     this.setData({ 
  20.  
  21.         navbarArray: navbarArray, 
  22.  
  23.         currentChannelIndex: targetChannelIndex 
  24.  
  25.     }); 
  26.  




這樣,頻道的管理和簡單切換我們就實現了。

但是,到此為止,頻道的切換只能通過點擊對應Topbar中頻道那一小塊區域來實現,要是在正文區域左滑和右滑也能切換頻道就好了。

一個容易想到的思路是,在正文區域綁定touch事件,通過坐標判斷滑動方向,然后使Topbar中當前頻道的上一個或下一個頻道高亮,同時,控制Topbar橫向滾動合適的偏移長度,以確保切換后的頻道能出現在視圖區域。
 

  1. onTouchstartArticles: function(e) { 
  2.  
  3.     this.setData({ 
  4.  
  5.         'startTouchs.x': e.changedTouches[0].clientX, 
  6.  
  7.         'startTouchs.y': e.changedTouches[0].clientY 
  8.  
  9.     }); 
  10.  
  11. }, 
  12.  
  13. onTouchendArticles: function(e) { 
  14.  
  15.     let deltaX = e.changedTouches[0].clientX - this.data.startTouchs.x; 
  16.  
  17.     let deltaY = e.changedTouches[0].clientY - this.data.startTouchs.y; 
  18.  
  19.     if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > 10) { 
  20.  
  21.         let deltaNavbarIndex = deltaX > 0 ? -1 : 1; 
  22.  
  23.         let currentChannelIndex = this.data.currentChannelIndex; 
  24.  
  25.         let navbarShowIndexArray = this.data.navbarShowIndexArray; 
  26.  
  27.         let targetChannelIndexOfNavbarShowIndexArray = navbarShowIndexArray.indexOf(currentChannelIndex) + deltaNavbarIndex; 
  28.  
  29.         let navbarShowIndexArrayLength = navbarShowIndexArray.length; 
  30.  
  31.         if (targetChannelIndexOfNavbarShowIndexArray >= 0 && targetChannelIndexOfNavbarShowIndexArray <= navbarShowIndexArrayLength - 1) { 
  32.  
  33.             let targetChannelIndex = navbarShowIndexArray[targetChannelIndexOfNavbarShowIndexArray]; 
  34.  
  35.             if (navbarShowIndexArrayLength > 6) { 
  36.  
  37.                 let scrollNavbarLeft; 
  38.  
  39.                 if (targetChannelIndexOfNavbarShowIndexArray < 5) { 
  40.  
  41.                     scrollNavbarLeft = 0; 
  42.  
  43.                 } else if (targetChannelIndexOfNavbarShowIndexArray === navbarShowIndexArrayLength - 1) { 
  44.  
  45.                     scrollNavbarLeft = this.rpx2px(110 * (navbarShowIndexArrayLength - 6)); 
  46.  
  47.                 } else { 
  48.  
  49.                     scrollNavbarLeft = this.rpx2px(110 * (targetChannelIndexOfNavbarShowIndexArray - 4)); 
  50.  
  51.                 } 
  52.  
  53.                 this.setData({ 
  54.  
  55.                     scrollNavbarLeft: scrollNavbarLeft 
  56.  
  57.                 }); 
  58.  
  59.             } 
  60.  
  61.             this.switchChannel(targetChannelIndex); 
  62.  
  63.         } 
  64.  
  65.     } 
  66.  



 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲最新中文字幕| 2021久久精品国产99国产精品| 欧美电影免费观看网站| 亚洲一区二区久久| 久久综合88中文色鬼| 欧美孕妇与黑人孕交| xvideos成人免费中文版| 亚洲精品电影久久久| 亚洲免费伊人电影在线观看av| 成人h视频在线观看播放| 亚洲精品久久久久中文字幕二区| 55夜色66夜色国产精品视频| 亚洲成色777777在线观看影院| 社区色欧美激情 | 欧美福利在线观看| 精品欧美激情精品一区| 亚洲第一免费播放区| 久久久国产一区二区三区| 欧美xxxx做受欧美.88| 亚洲精品第一国产综合精品| 91久久久在线| 日韩成人在线视频网站| 亚洲欧洲日产国产网站| 日韩毛片在线观看| 国产精品激情av在线播放| 色悠悠久久久久| 尤物yw午夜国产精品视频| 成人写真视频福利网| 久久躁狠狠躁夜夜爽| 国产精品日日摸夜夜添夜夜av| 国产精品一区二区性色av| 91精品久久久久久久久久入口| 亚洲第一天堂无码专区| 欧美在线一区二区三区四| 亚洲精选在线观看| 国产精品99久久久久久久久| 久久av红桃一区二区小说| 成人美女免费网站视频| 91精品久久久久久久久中文字幕| 午夜免费在线观看精品视频| 一本大道久久加勒比香蕉| 国产日韩在线亚洲字幕中文| 欧美激情性做爰免费视频| 欧美—级高清免费播放| 久久久亚洲国产天美传媒修理工| 欧美日韩另类视频| 日韩美女主播视频| 日韩经典第一页| 2021久久精品国产99国产精品| 久久九九有精品国产23| 欧美一级电影在线| 日韩在线观看成人| 午夜精品久久久久久久99热浪潮| 欧美性猛交xxxx黑人猛交| 欧美俄罗斯性视频| 午夜精品久久久久久久久久久久| 中文日韩电影网站| 亚洲欧美第一页| 久久久av网站| 国产精品天天狠天天看| 国产福利精品视频| 亚洲综合最新在线| 亚洲午夜国产成人av电影男同| 国产精品久久久久久亚洲影视| 91九色在线视频| 久久影视电视剧凤归四时歌| 国产成人精品电影| 茄子视频成人在线| 欧美日韩国产91| 日韩中文字在线| 91精品啪在线观看麻豆免费| 国产精品99蜜臀久久不卡二区| 国产成人啪精品视频免费网| 日韩在线欧美在线国产在线| 亚洲一级黄色av| 久久视频精品在线| 久久久精品日本| 欧美午夜宅男影院在线观看| 91po在线观看91精品国产性色| 亚洲福利视频网站| 久久久国产一区| 久久精品亚洲94久久精品| 国产精品视频网| 中文字幕久热精品视频在线| 亚洲国产精品一区二区久| 日本精品一区二区三区在线播放视频| 欧美日韩国产精品专区| 欧美在线亚洲一区| 国产精品精品视频| 欧美日韩精品在线播放| 国产精品久久久久久搜索| 欧美成人午夜剧场免费观看| 国产精品久久99久久| 国产欧美婷婷中文| 欧美有码在线观看| 中文日韩在线视频| 亚洲视频一区二区三区| 欧美大片免费观看| 欧美日韩在线视频一区| 精品久久久久久久久久久久| 精品美女永久免费视频| 亚洲性夜色噜噜噜7777| 久久久久久久久久国产精品| 国产精品日韩在线一区| 日本一区二区在线播放| 久久久久久久久国产| www.久久久久| 国产成人亚洲综合青青| 91精品久久久久久综合乱菊| 亚洲午夜激情免费视频| 欧美性xxxx18| 九九热最新视频//这里只有精品| 欧美成人午夜激情在线| 亚洲精品国产精品自产a区红杏吧| 2020欧美日韩在线视频| 91久久精品一区| 国产做受69高潮| 上原亚衣av一区二区三区| 亚洲欧美资源在线| 中文字幕免费精品一区高清| 在线观看欧美日韩国产| 欧美黑人一级爽快片淫片高清| 亚洲第一偷拍网| 亚洲精品456在线播放狼人| 欧美成人午夜免费视在线看片| 九九精品在线播放| 成人免费视频a| 色哟哟网站入口亚洲精品| 在线播放国产一区二区三区| 国产精品中文字幕在线| xvideos成人免费中文版| 一个人看的www久久| 中文字幕成人精品久久不卡| 亚洲美女视频网| 欧美在线免费视频| 日韩高清中文字幕| 国产欧美一区二区三区在线看| 欧美日韩福利电影| 亚洲国产第一页| 欧美成年人视频网站| 日韩免费高清在线观看| 欧美精品免费播放| 久久亚洲春色中文字幕| 日韩av成人在线| 国产美女精品视频免费观看| 国产在线精品成人一区二区三区| 美女999久久久精品视频| 国产精品美女www| 亚洲电影免费观看高清完整版| 亚洲a在线播放| 欧美激情精品久久久久久免费印度| 欧美成人免费全部观看天天性色| 8090理伦午夜在线电影| 日日噜噜噜夜夜爽亚洲精品| 国产精自产拍久久久久久蜜| 午夜精品久久久久久久99黑人| 久久91精品国产| 日韩中文字幕欧美| 欧美一性一乱一交一视频| 亚洲丁香久久久| 97视频在线观看亚洲| 性欧美暴力猛交69hd| 亚洲精品日韩在线| 欧美国产视频日韩|