做过android
的都知道在android
里面实现Tab切换
非常简单,使用android
提供的TabLayout+ViewPager
很容器就实现了Tab切换
的效果。
但是小程序中是没有提供类似可以直接使用的组件,因此想要实现此功能需要我们自己去编码实现。在上一篇 文章中我提到的小程序练手项目就实现了Tab切换
效果,具体效果图可以参考文章微信小程序入门项目 。
实现思路 翻看小程序的文档可以发现,微信为我们提供了一个swiper
组件,通过该组件可以实现view
的滑动切换,它的功能与android
中的ViewPager
是类似的。因此实现Tab切换
现在只需要实现头部的Tabbar
即可,对于该功能我们可以采用多个横向排列的view
组件构成一个Tabbar
,每个view
组件作为一个Tab
项,然后再将其点击事件与swiper
进行关联即可实现Tab
的点击和滑动切换功能。而对于Tabbar
的当前Tab
项下面的指示器我们可以采用border-bottom
样式实现,也可以单独使用一个view
组件作为指示器,我这里采用的是第二种方式实现指示器。
代码 实现代码如下:
页面布局代码 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 <view class ="page" > <view class ="navbar" > <block wx:for ="{{tabs}}" wx:key ="*this" > <view id ="{{index}}" class ="navbar__item {{activeIndex == index ? 'navbar__item_on' : ''}}" bindtap ="navTabClick" > <view class ="navbar__title" > {{item.name}}</view > </view > </block > <view class ="navbar__slider" style ="width: {{sliderWidth}}px; transform: translateX({{sliderOffset}}px); -webkit-transform: translateX({{sliderOffset}}px);" > </view > </view > <view style ="position: absolute;top: 68rpx;width: 100%;height:{{contentHeight}}px" > <swiper current ="{{activeIndex}}" duration ="300" bindchange ="bindChange" > <swiper-item > <view > 热门视频</view > </swiper-item > <swiper-item > <view > 比赛集锦</view > </swiper-item > <swiper-item > <view > 你懂专栏</view > </swiper-item > <swiper-item > <view > 天下足球</view > </swiper-item > </swiper > </view > </view >
布局样式代码 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 view , page { padding : 0px ; margin : 0px ; } .page { height : 100% ; } .navbar { display : flex; position : absolute; z-index : 500 ; top : 0 ; width : 100% ; } .navbar__item { position : relative; display : block; flex : 1 ; padding : 10 rpx 0 ; text-align : center; font-size : 0 ; height : 48 rpx; line-height : 48 rpx; <!-- NavBar的总高度为:height + padding-top + padding-bottom = 68rpx --> } .navbar__item_on { color : #16B13A ; } .navbar__slider { position : absolute; display : block; content : " " ; left : 0 ; bottom : 0 ; height : 3px ; background-color : #16B13A ; transition : transform .3s ; } .navbar__title { display : inline-block; font-size : 15px ; max-width : 8em ; text-align : center; } swiper { height : 100% ; } swiper-item { width : 100% ; padding-top : 20 rpx; text-align : center; }
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 var tabs = [ { name: "热门视频" }, { name: "比赛集锦" }, { name: "你懂专栏" }, { name: "天下足球" } ]; Page({ data: { tabs: tabs, slideOffset: 0 , activeIndex: 0 , sliderWidth: 96 , contentHeight: 0 }, onLoad: function (options ) { var that = this ; wx.getSystemInfo({ success: function (res ) { that.setData({ sliderWidth: res.windowWidth / that.data.tabs.length, sliderOffset: res.windowWidth / that.data.tabs.length * that.data.activeIndex, contentHeight: res.windowHeight - res.windowWidth / 750 * 68 }); } }); }, bindChange: function (e ) { var current = e.detail.current; this .setData({ activeIndex: current, sliderOffset: this .data.sliderWidth * current }); console .log("bindChange:" + current); }, navTabClick: function (e ) { this .setData({ sliderOffset: e.currentTarget.offsetLeft, activeIndex: e.currentTarget.id }); console .log("navTabClick:" + e.currentTarget.id); } })
总结 上面的布局代码和js代码其实写起来都不难,关键在于css样式的编写,对于不熟悉CSS的人来说调样式太痛苦了。这个效果也是我调了好半天,参考了好多代码之后写出来的,真o(╯□╰)o,看来想写好小程序还得好好学学CSS样式。
原创文章,转载请出处注明。
下面是我的个人公众号,欢迎关注交流