本文实例为大家分享了微信小程序实现滚动Tab选项卡的具体代码,供大家参考,具体内容如下
最终效果如上。问题:
1、tab标题总共8个,所以一屏无法全部显示。
2、tab内容区左右滑动切换时,tab标题随即做标记(active)。
3、当active的标题不在当前屏显示时,要使其能显示到当前屏中。
一、wxml结构
tab标题因一排八个,所以使用 scroll-view组件,使其可横向滚动。
tab内容可左右滑动切换,使用swiper组件实现
为了偷懒,所以数据都通过wx:for遍历重复出来。
说明:
1、设置data-current属性用于:点击当前项时,通过点击事件swichNav中处理e.dataset.current取到点击的目标值。
2、swiper组件的current组件用于控制当前显示哪一页
3、swiper组件绑定change事件switchTab,通过e.detail.current拿到当前页
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
|
< view > < scroll-view scroll-x = "true" class = "tab-h" scroll-left = "{{scrollLeft}}" > < view class = "tab-item {{currentTab==0?'active':''}}" data-current = "0" bindtap = "swichNav" >健康</ view > < view class = "tab-item {{currentTab==1?'active':''}}" data-current = "1" bindtap = "swichNav" >情感</ view > < view class = "tab-item {{currentTab==2?'active':''}}" data-current = "2" bindtap = "swichNav" >职场</ view > < view class = "tab-item {{currentTab==3?'active':''}}" data-current = "3" bindtap = "swichNav" >育儿</ view > < view class = "tab-item {{currentTab==4?'active':''}}" data-current = "4" bindtap = "swichNav" >纠纷</ view > < view class = "tab-item {{currentTab==5?'active':''}}" data-current = "5" bindtap = "swichNav" >青葱</ view > < view class = "tab-item {{currentTab==6?'active':''}}" data-current = "6" bindtap = "swichNav" >全部</ view > < view class = "tab-item {{currentTab==7?'active':''}}" data-current = "7" bindtap = "swichNav" >其他</ view > </ scroll-view > < swiper class = "tab-content" current = "{{currentTab}}" duration = "300" bindchange = "switchTab" style = "height:{{winHeight}}rpx" > < swiper-item wx:for = "{{[0,1,2,3,4,5,6,7]}}" > < scroll-view scroll-y = "true" class = "scoll-h" > < block wx:for = "{{[1,2,3,4,5,6,7,8]}}" wx:key = "*this" > < view class = "item-ans" > < view class = "avatar" > < image class = "img" src = "/avatar.png" ></ image > </ view > < view class = "expertInfo" > < view class = "name" >欢颜</ view > < view class = "tag" >知名情感博主</ view > < view class = "answerHistory" >134个回答,2234人听过 </ view > </ view > < navigator url = "/pages/askExpert/expertDetail" class = "askBtn" >问TA</ navigator > </ view > </ block > </ scroll-view > </ swiper-item > </ swiper > </ view > |
二、js部分
微信小程序在开发起来,个人感觉挺像vue的,以数据驱动视图的更新。所以在小程序中,不能直接操作dom,当然也不能使用jquery之类的库。
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
|
var app = getApp(); Page({ data:{ winHeight: "" , //窗口高度 currentTab:0, //预设当前项的值 scrollLeft:0, //tab标题的滚动条位置 expertList:[{ //假数据 img: "avatar.png" , name: "欢顔" , tag: "知名情感博主" , answer:134, listen:2234 }] }, // 滚动切换标签样式 switchTab: function (e){ this .setData({ currentTab:e.detail.current }); this .checkCor(); }, // 点击标题切换当前页时改变样式 swichNav: function (e){ var cur=e.target.dataset.current; if ( this .data.currentTaB==cur){ return false ;} else { this .setData({ currentTab:cur }) } }, //判断当前滚动超过一屏时,设置tab标题滚动条。 checkCor: function (){ if ( this .data.currentTab>4){ this .setData({ scrollLeft:300 }) } else { this .setData({ scrollLeft:0 }) } }, onLoad: function () { var that = this ; // 高度自适应 wx.getSystemInfo( { success: function ( res ) { var clientHeight=res.windowHeight, clientWidth=res.windowWidth, rpxR=750/clientWidth; var calc=clientHeight*rpxR-180; console.log(calc) that.setData( { winHeight: calc }); } }); }, footerTap:app.footerTap }) |
三、wxss样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
.tab-h{ height : 80 rpx; width : 100% ; box-sizing: border-box; overflow : hidden ; line-height : 80 rpx; background : #F7F7F7 ; font-size : 16px ; white-space : nowrap ; position : fixed ; top : 0 ; left : 0 ; z-index : 99 ;} .tab-item{ margin : 0 36 rpx; display : inline- block ;} .tab-item.active{ color : #4675F9 ; position : relative ;} .tab-item.active:after{ content : "" ; display : block ; height : 8 rpx; width : 52 rpx; background : #4675F9 ; position : absolute ; bottom : 0 ; left : 5 rpx;border-radius: 16 rpx;} .item-ans{ width : 100% ; display : flex; flex-grow: row no-wrap;justify- content : space-between; padding : 30 rpx;box-sizing: border-box; height : 180 rpx;align-items: center ; border-bottom : 1px solid #F2F2F2 ;} .avatar{ width : 100 rpx; height : 100 rpx; position : relative ; padding-right : 30 rpx;} .avatar .img{ width : 100% ; height : 100% ;} .avatar .doyen{ width : 40 rpx; height : 40 rpx; position : absolute ; bottom : -2px ; right : 20 rpx;} .expertInfo{ font-size : 12px ;flex-grow: 2 ; color : #B0B0B0 ; line-height : 1.5em ;} .expertInfo .name{ font-size : 16px ; color : #000 ; margin-bottom : 6px ;} .askBtn{ width : 120 rpx; height : 60 rpx; line-height : 60 rpx; text-align : center ; font-size : 14px ; border-radius: 60 rpx; border : 1px solid #4675F9 ; color : #4675F9 ;} .tab-content{ margin-top : 80 rpx;} .scoll-h{ height : 100% ;} |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Sophie_U/article/details/71745125