一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - js教程 - 微信小程序tab切換可滑動切換導航欄跟隨滾動實現(xiàn)代碼

微信小程序tab切換可滑動切換導航欄跟隨滾動實現(xiàn)代碼

2022-01-19 15:23竹林中 js教程

這篇文章主要介紹了微信小程序tab切換可滑動切換導航欄跟隨滾動實現(xiàn)代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

簡介

看到今日頭條小程序頁面可以滑動切換,而且tab導航條也會跟著滾動,點擊tab導航,頁面滑動,切導航欄也會跟著滾動,就想著要怎么實現(xiàn)這個功能

像商城類商品類目如果做成左右滑動切換類目用戶體驗應(yīng)該會好很多,我這里只是一個小demo,沒有怎么去考慮數(shù)據(jù)的問題,主要是想著去實現(xiàn)這么個功能,有可能后期引入數(shù)據(jù)后會出現(xiàn)問題,歡迎提出互相討論

解決過程

1.在想要實現(xiàn)這個問題的時候找了不少別人的博客看,主體頁面布局方面是比較統(tǒng)一的,tab導航欄使用<scroll-view>標簽,內(nèi)容使用<swiper>,其中的使用方法和參數(shù)希望自行參考api文檔,不過多解釋

布局代碼如下:

wxml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<view class="container">
 <!-- tab導航欄 -->
 <!-- scroll-left屬性可以控制滾動條位置 -->
 <!-- scroll-with-animation滾動添加動畫過渡 -->
 <scroll-view scroll-x="true" class="nav" scroll-left="{{navScrollLeft}}" scroll-with-animation="{{true}}">
  <block wx:for="{{navData}}" wx:for-index="idx" wx:for-item="navItem" wx:key="idx">
   <view class="nav-item {{currentTab == idx ?'active':''}}" data-current="{{idx}}" bindtap="switchNav">{{navItem.text}}</view>
  </block> 
 </scroll-view>
 <!-- 頁面內(nèi)容 -->
 <swiper class="tab-box" current="{{currentTab}}" duration="300" bindchange="switchTab"
  <swiper-item wx:for="{{[0,1,2,3,4,5,6,7,8]}}" wx:for-item="tabItem" wx:for-index="idx" wx:key="idx" class="tab-content">
   {{tabItem}}
  </swiper-item>
 </swiper>
</view>

wxss

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/**index.wxss**/
page{
 width: 100%;
 height: 100%;
}
.container{
 width: 100%;
 height: 100%;
}
.nav {
 height: 80rpx;
 width: 100%;
 box-sizing: border-box;
 overflow: hidden;
 line-height: 80rpx;
 background: #f7f7f7;
 font-size: 16px;
 white-space: nowrap;
 position: fixed;
 top: 0;
 left: 0;
 z-index: 99;
}
.nav-item {
 width: 20%;
 display: inline-block;
 text-align: center;
}
.nav-item.active{
 color: red;
}
.tab-box{
 background: greenyellow;
 padding-top: 80rpx;
 height: 100%;
 box-sizing: border-box;
}
.tab-content{
 overflow-y: scroll;
}

js

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
//index.js
//獲取應(yīng)用實例
const app = getApp()
 
Page({
 data: {
  motto: 'Hello World',
  userInfo: {},
  hasUserInfo: false,
  canIUse: wx.canIUse('button.open-type.getUserInfo'),
  navData:[
   {
    text: '首頁'
   },
   {
    text: '健康'
   },
   {
    text: '情感'
   },
   {
    text: '職場'
   },
   {
    text: '育兒'
   },
   {
    text: '糾紛'
   },
   {
    text: '青蔥'
   },
   {
    text: '上課'
   },
   {
    text: '下課'
   }
  ],
  currentTab: 0,
  navScrollLeft: 0
 },
 //事件處理函數(shù)
 onLoad: function () {
  if (app.globalData.userInfo) {
   this.setData({
    userInfo: app.globalData.userInfo,
    hasUserInfo: true
   })
  } else if (this.data.canIUse) {
   // 由于 getUserInfo 是網(wǎng)絡(luò)請求,可能會在 Page.onLoad 之后才返回
   // 所以此處加入 callback 以防止這種情況
   app.userInfoReadyCallback = res => {
    this.setData({
     userInfo: res.userInfo,
     hasUserInfo: true
    })
   }
  } else {
   // 在沒有 open-type=getUserInfo 版本的兼容處理
   wx.getUserInfo({
    success: res => {
     app.globalData.userInfo = res.userInfo
     this.setData({
      userInfo: res.userInfo,
      hasUserInfo: true
     })
    }
   })
  }
 
 
  wx.getSystemInfo({
   success: (res) => {
    this.setData({
     pixelRatio: res.pixelRatio,
     windowHeight: res.windowHeight,
     windowWidth: res.windowWidth
    })
   },
  }) 
 },
 switchNav(event){
  var cur = event.currentTarget.dataset.current;
  //每個tab選項寬度占1/5
  var singleNavWidth = this.data.windowWidth / 5;
  //tab選項居中      
  this.setData({
   navScrollLeft: (cur - 2) * singleNavWidth
  }) 
  if (this.data.currentTab == cur) {
   return false;
  } else {
   this.setData({
    currentTab: cur
   })
  }
 },
 switchTab(event){
  var cur = event.detail.current;
  var singleNavWidth = this.data.windowWidth / 5;
  this.setData({
   currentTab: cur,
   navScrollLeft: (cur - 2) * singleNavWidth
  });
 }
})

頁面代碼如上面三部分,可以直接新建一項目進行測試

效果圖如下

微信小程序tab切換可滑動切換導航欄跟隨滾動實現(xiàn)代碼

注意事項

在處理頂部tab導航跟隨底部頁面滑動的時候遇到一個問題,就是在給<scroll-view>中的scrll-left賦值的時候遇到的問題

邏輯上講初始時tab導航下標小于2時導航欄不滾動,當大于2時向左滑動,以使被選中的導航欄居中,但是當最左側(cè)的選項因為左滑看不到后,我又點擊左側(cè)選項希望導航往右滑動,能夠看到左邊的導航,按上面的js代碼計算scroll-left會產(chǎn)生負值,但是scroll-left即使為負值,但是滾動條不會向左縮進去,所以即使為負值,相當于為0,當時做的時候一直在思考這個怎么用邏輯解決,想著要寫各種判斷,計算距離,結(jié)果到最后一句代碼直接賦值就搞定了,也是很無語。

總結(jié)

以上所述是小編給大家介紹的微信小程序tab切換可滑動切換導航欄跟隨滾動實現(xiàn)代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

原文鏈接:https://www.cnblogs.com/till-the-end/p/8935152.html

延伸 · 閱讀

精彩推薦
  • js教程JavaScript 中的六種循環(huán)方法

    JavaScript 中的六種循環(huán)方法

    這篇文章主要介紹了JavaScript 中的六種循環(huán)方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    Saku8622021-12-27
  • js教程Javascript的15種數(shù)組去重方法,總有一種適合你

    Javascript的15種數(shù)組去重方法,總有一種適合你

    數(shù)組去重,一般都是在面試的時候才會碰到,一般是要求手寫數(shù)組去重方法的代碼。如果是被提問到,數(shù)組去重的方法有哪些?你能答出其中的10種,面試...

    前端微視界9002021-12-31
  • js教程原生JavaScript實現(xiàn)購物車

    原生JavaScript實現(xiàn)購物車

    這篇文章主要為大家詳細介紹了原生JavaScript實現(xiàn)購物車,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    棟棟很優(yōu)秀啊4312021-12-29
  • js教程js實現(xiàn)碰撞檢測

    js實現(xiàn)碰撞檢測

    這篇文章主要為大家詳細介紹了js實現(xiàn)碰撞檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    搬磚大法8172022-01-11
  • js教程ES6字符串的擴展實例

    ES6字符串的擴展實例

    這篇文章主要介紹了ES6字符串的擴展實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小...

    知否5552021-12-16
  • js教程js仿淘寶放大鏡效果

    js仿淘寶放大鏡效果

    這篇文章主要為大家詳細介紹了js仿淘寶放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    屈小康11132021-12-21
  • js教程JavaScript 聲明私有變量的兩種方式

    JavaScript 聲明私有變量的兩種方式

    這篇文章主要介紹了JavaScript 聲明私有變量的兩種方式,幫助大家更好的理解和學習使用JavaScript,感興趣的朋友可以了解下...

    _Fatman3682022-01-17
  • js教程JS實現(xiàn)簡單抖動效果

    JS實現(xiàn)簡單抖動效果

    這篇文章給大家結(jié)束了通過js實現(xiàn)抖動效果,非常不錯,具有參考借鑒價值,感興趣的朋友參考下吧...

    catEatBird9142022-01-12
主站蜘蛛池模板: 99久久精品免费看国产高清 | 青青草99久久精品国产综合 | 国产成人综合久久精品红 | 成人国产第一区在线观看 | 人性本色 | 欧美精品久久久亚洲 | 精品免费视在线视频观看 | 成人精品免费网站 | 人妖欧美一区二区三区四区 | 欧美日韩综合网在线观看 | 日韩欧美亚洲天堂 | 黑人又大又硬又粗再深一点 | 国产成人精品日本亚洲网址 | 小鸟酱视频在线观看 | 亚洲欧美在线观看首页 | 亚洲精品一区二区三区在线看 | 国产精品久久免费观看 | 恩不要好大好硬好爽3p | 国产福利片在线 | 精品AV亚洲乱码一区二区 | 日本精品一区二区三区 | 日本十大顶级绝伦推理片 | 91啦在线视频 | 91肥熟国产老肥熟在线 | 四虎影视最新 | 精品午夜寂寞影院在线观看 | 国产无套在线播放 | 日本xxx18hd | 日本高清va不卡视频在线观看 | 亚洲春色综合另类网蜜桃 | 成人高辣h视频一区二区在线观看 | 国产亚洲福利一区二区免费看 | 色图18p| 免费理伦片在线观看全网站 | 国产99在线a视频 | 男女肉粗暴进来下面好紧 | 免费高清特黄a 大片 | 国产日日干 | 亚洲黄色网页 | 24adc年龄18岁欢迎大驾光临 | 日本老妇成熟 |