微信小程序滚动Tab实现左右可滑动切换


Posted in Javascript onAugust 17, 2017

 微信小程序滚动Tab实现左右可滑动切换

效果:

微信小程序滚动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拿到当前页

<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="http://ookzqad11.bkt.clouddn.com/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之类的库。

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样式

.tab-h{
  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;}
.tab-item{margin:0 36rpx;display: inline-block;}
.tab-item.active{color: #4675F9;position: relative;}
.tab-item.active:after{ content: "";display: block;height: 8rpx;width: 52rpx;background: #4675F9;position: absolute; bottom: 0;left: 5rpx;border-radius: 16rpx;}
.item-ans{ width: 100%;display: flex; flex-grow: row no-wrap;justify-content: space-between; padding: 30rpx;box-sizing: border-box; height: 180rpx;align-items: center;border-bottom: 1px solid #F2F2F2;}
.avatar{width: 100rpx;height: 100rpx;position: relative;padding-right: 30rpx;}
.avatar .img{width: 100%;height: 100%;}
.avatar .doyen{width: 40rpx;height: 40rpx;position: absolute;bottom: -2px;right: 20rpx;}
.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: 120rpx;height: 60rpx;line-height: 60rpx;text-align: center;font-size: 14px; border-radius: 60rpx;border: 1px solid #4675F9; color:#4675F9;}
.tab-content{margin-top: 80rpx;}
.scoll-h{height: 100%;}

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
jquery实现简单的拖拽效果实例兼容所有主流浏览器
Jun 21 Javascript
jquery的flexigrid无法显示数据提示获取到数据
Jul 19 Javascript
在线一元二次方程计算器实例(方程计算器在线计算)
Dec 22 Javascript
js中一维数组和二位数组中的几个问题示例说明
Jul 17 Javascript
jQuery之Deferred对象详解
Sep 04 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
BootStrap注意事项小结(五)表单
Mar 10 Javascript
浅谈 Vue 项目优化的方法
Dec 16 Javascript
JavaScript设计模式之职责链模式应用示例
Aug 07 Javascript
JavaScript链式调用原理与实现方法详解
May 16 Javascript
Vue记住滚动条和实现下拉加载的完美方法
Jul 31 Javascript
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 #Javascript
jQuery Layer弹出层传值到父页面的实现代码
Aug 17 #jQuery
jQuery条件分页 代替离线查询(附代码)
Aug 17 #jQuery
vue中appear的用法
Aug 17 #Javascript
Angularjs单选框相关的示例代码
Aug 17 #Javascript
js实现简易聊天对话框
Aug 17 #Javascript
node.js+captchapng+jsonwebtoken实现登录验证示例
Aug 17 #Javascript
You might like
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
php导入导出excel实例
2013/10/25 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
javascript中的作用域scope介绍
2010/12/28 Javascript
jQuery拖拽 &amp; 弹出层 介绍与示例
2013/12/27 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
angularJS 中$attrs方法使用指南
2015/02/09 Javascript
基于jquery实现的仿优酷图片轮播特效代码
2016/01/13 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
Angular设置title信息解决SEO方面存在问题
2016/08/19 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
使用vue制作滑动标签
2019/09/21 Javascript
vue 解决computed修改data数据的问题
2019/11/06 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
Python操作列表的常用方法分享
2014/02/13 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python使用PIL模块获取图片像素点的方法
2019/01/08 Python
详解Python 切片语法
2019/06/10 Python
pandas分批读取大数据集教程
2020/06/06 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
前端面试必备之CSS3的新特性
2017/09/05 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
国外的一些J2EE面试题一
2012/10/13 面试题
小学毕业演讲稿
2014/04/25 职场文书
四风问题对照检查材料
2014/09/22 职场文书
清明节网上祭英烈寄语2015
2015/03/04 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
认识实习感想
2015/08/10 职场文书
大学生村官工作心得体会
2016/01/23 职场文书