uniapp实现可滑动选项卡

本文实例为大家分享了uniapp实现可滑动选项卡的具体代码,供大家参考,具体内容如下

tabControl-tag.vue

<template name="tabControl">
 <scroll-view scroll-x="true" :style="'background-color:'+bgc+';top:'+top+'px;'" :class="fixed?'fxied':''" :scroll-left='scrollLeft' scroll-with-animation id="tabcard">
  <view class="tabList" :style="isEqually?'display: flex;justify-content: space-between;padding-left:0;':''">
  <view
   :class="'tabItem'+(currentIndex==index?' thisOpenSelect':'')"
   :style="isEqually? 'width:'+windowWidth/values.length+'px;margin-right:0;':''"
   v-for="(item,index) in values"
   :id="'item'+index"
   :key='index'
   @click="_onClick(index)">
   <text :style="(currentIndex==index?'font-size:'+activeSize+'rpx;color:'+activeColor:'font-size:'+itemSize+'rpx')">{{item}}</text>
   <view class="activeLine" :style="{width: lineWidth+'rpx'}"></view>
  </view>
  </view>
 </scroll-view>
</template>

<script>
 export default {
 name:'tabControl',
 props:{
  current: {
  type: Number,
  default: 0
  },
  values: {
  type: Array,
  default () {
   return []
  }
  },
  bgc:{
  type:String,
  default:''
  },
  fixed:{
  type:Boolean,
  default:false
  },
  scrollFlag:{
  type:Boolean,
  default:false
  },
  lineWidth:{
  type:Number,
  default: 100
  },
  itemSize:{
  type:Number,
  default: 30
  },
  activeSize:{
  type:Number,
  default: 32
  },
  activeColor:{
  type:String,
  default:''
  },
  top:{
  type:Number,
  default: 0
  },
  isEqually:{
  type:Boolean,
  default:false
  }
 },
 data() {
  return {
  currentIndex: 0,
  windowWidth:0, //设备宽度
  leftList:[], //选项距离左边的距离
  widthList:[], //选项宽度
  scrollLeft:0,  //移动距离
  newScroll:0,  //上一次移动距离(用来判断是左滑还是右滑)
  wornScroll:0,  //上一次移动距离(用来判断是左滑还是右滑)
  };
 },
 created(){

 },
 mounted(){
  setTimeout(()=>{
  uni.createSelectorQuery().in(this).select("#tabcard").boundingClientRect((res)=>{
   this.$emit('getTabCardHeight', {height:res.height})
  }).exec()
  uni.getSystemInfo({
    success: (res)=> {
   this.windowWidth = res.windowWidth;
      // console.log(this.windowWidth);
   this.values.forEach((i,v)=>{
    let info = uni.createSelectorQuery().in(this);
    info.select("#item"+v).boundingClientRect((res)=>{
    // 获取第一个元素到左边的距离
    // if(v==0){
    // this.startLenght = res.left
    // }
      this.widthList.push(res.width)
    this.leftList.push(res.left)

    }).exec()

   })
   // console.log(this.leftList)
   // console.log(this.widthList)
    }
  });
  })
 },
 created() {
  this.currentIndex = this.current
  if(this.scrollFlag){
  setTimeout(()=>{
   this.tabListScroll(this.current)
  },300)
  }
 },
 watch: {
  current(val) {
  if (val !== this.currentIndex) {
   this.currentIndex = val
   if(this.scrollFlag){
   this.tabListScroll(val)
   }
  }
  },

 },
 methods: {
  _onClick(index) {
  if (this.currentIndex !== index) {
   this.currentIndex = index
   this.$emit('clickItem', {currentIndex:index})
   // 开启滚动
   if(this.scrollFlag){
   this.tabListScroll(index)
   }
  }
  },
  // 选项移动
  tabListScroll(index){
  let scoll = 0;
  this.wornScroll = index;
  // this.wornScroll-this.newScroll>0 在向左滑 ←←←←←
  if(this.wornScroll-this.newScroll>0){
   for(let i = 0;i<this.leftList.length;i++){
   if(i>1&&i==this.currentIndex){
    scoll = this.leftList[i-1]
   }
   }
   // console.log('在向左滑',scoll)
  }else{
   if(index>1){
   for(let i = 0;i<this.leftList.length;i++){
    if(i<index-1){
    scoll = this.leftList[i]
    }
   }
   }else{
   scoll = 0
   }
   // console.log('在向右滑')
  }
  this.newScroll = this.wornScroll;
  this.scrollLeft = scoll;
  }
 }
 }
</script>

<style lang="less" scoped>
 .fxied{
 position: fixed;
 z-index: 2;
 }
 .tabList{
 padding-top: 24rpx;
 padding-left: 24rpx;
 padding-bottom: 8rpx;
 white-space: nowrap;
 text-align: center;
 .tabItem{
  margin-right: 60rpx;
  display: inline-block;
  position: relative;
  text{
  // font-size: 30rpx;
  line-height: 44rpx;
  color: #666;
  transition: all 0.3s ease 0s;
  }
  .activeLine{
  // width: 48rpx;
  height: 8rpx;
  border-radius: 4rpx;
  background-color: #F57341;
  margin-top: 8rpx;
  margin-left: 50%;
  transform: translateX(-50%);
  opacity: 0;
  transition: all 0.3s ease 0s;
  }
 }
 .tabItem:first-child{
  // margin-left: 22rpx;
 }
 .tabItem:last-child{
  margin-right: 24rpx;
 }
 .thisOpenSelect{
  text{
  color: #333;
  font-weight:600;
  // font-size: 32rpx;
  }
  .activeLine{
  opacity: 1;
  }
 }
 }

</style>

页面引用

<template>
 <view class="page">
 <tabControl :current="current" :values="items" bgc="#fff" :fixed="true" :scrollFlag="true" :isEqually="false" @clickItem="onClickItem"></tabControl>
 <!-- 使用 swiper 配合 滑动切换 -->
 <swiper class="swiper" style="height: 100%;" @change="scollSwiper" :current="current">
  <swiper-item v-for="(item, index) in items" :key="index">
  <!-- 使用 scroll-view 来滚动内容区域 -->
  <scroll-view scroll-y="true" style="height: 100%;">{{ item }}</scroll-view>
  </swiper-item>
 </swiper>
 </view>
</template>

<script>
import tabControl from '@/components/tabControl-tag/tabControl-tag.vue';
export default {
 components: { tabControl },
 data() {
 return {
  items: ['业绩统计', '选项卡2', '选项卡3', '选项卡4', '选项卡5'],
  current: 0
 };
 },
 onLoad() {},
 methods: {
 onClickItem(val) {
  this.current = val.currentIndex;
 },
 scollSwiper(e) {
  this.current = e.target.current;
 }
 }
};
</script>

<style>
page {
 height: 100%;
}
.page {
 padding-top: 98rpx;
 height: 100%;
}
</style>

1.使用方式:

scrollFlag --是否开启选项滚动(true -开启 false -关闭) 根据自己需求如果选项长度超出屏幕长度 建议开启
fixed --固定定位
bgc --背景色
values --选项数组
current --当前选中选项索引
isEqually --是否开启选项平分宽度(true,false)
lineWidth --下划线长度(在非平分选项状态下 可能会影响选项盒子的宽度-自行调试想要的效果,默认为48rpx)
itemSize --未选中选项字体大小(默认为30rpx)
activeSize --选中选项字体大小(默认为32rpx)
activeColor --选中选项字体颜色(默认#333)
top --选项卡固定定位 自定义top距离

注意:

使用fixed固定头部的时候 要将页面整体padding-top:98rpx;不然会盖住内容区域。
使用swiper实现滑动切换时 要将page 高度设置100% swiper高度100% 才可以全屏滑动切换

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例

    本文实例讲述了微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能.分享给大家供大家参考,具体如下: 顶部滚动选项卡 话不多说,直接上代码 pages/home/home.wxml <scroll-view scroll-x="true" style='width: 100%; white-space:nowrap; '> <!-- tab --> <view class="tab"> <view class=&qu

  • vue中选项卡点击切换且能滑动切换功能的实现代码

    具体代码如下所述: <div> <div class="navlist"> <ul> <li class="navli" v-for="(item,index) in navList" :class="{'activeT':nowIndex===index}" @click="tabClick(index)"><i>{{item.name}}<

  • ionic实现可滑动的tab选项卡切换效果

    利用ionic的slide-box组件实现可滑动的tab,主要是监听tab点击以及slide页面滑动的事件,做相应的处理,用ng-repeat循环,优化.简略了代码,有需要的同学可以看看. 先来张效果图: 用到的css代码: .tab_default{ border-bottom:solid 1px #F2F2F2; padding:6px 0; } .tab_select{ border-bottom:solid 1px #3E89F5; box-shadow:0 -3px 8px #C1D3

  • uniapp实现可滑动选项卡

    本文实例为大家分享了uniapp实现可滑动选项卡的具体代码,供大家参考,具体内容如下 tabControl-tag.vue <template name="tabControl"> <scroll-view scroll-x="true" :style="'background-color:'+bgc+';top:'+top+'px;'" :class="fixed?'fxied':''" :scroll-l

  • jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结

    本文实例讲述了jQuery实现的Tab滑动选项卡及图片切换效果.分享给大家供大家参考.具体如下: 这里汇总了几个Tab,滑动门,选项卡,图片切换,在一个网页中实现了超多的常用效果,大家喜欢的滑动门,焦点图切换,标签选项卡以及文字轮番等都集中在了一起,无聊的功劳,忙的时候还顾不上写,另外还加入了圆角,都是参考以前学习的知识写的.期间使用了jquery-1.6.2.min.js框架库. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-n

  • 基于jQuery实现的仿百度首页滑动选项卡效果代码

    本文实例讲述了基于jQuery实现的仿百度首页滑动选项卡效果代码.分享给大家供大家参考,具体如下: 今天给大家分享一款基于jQuery的仿百度首页滑动选项卡,可实现tab选项卡内容上下翻滚切换的功能.这款选项卡适用浏览器有:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-f-baidu-hd-nav-style-codes/ 完整实例代码代码点击

  • 关于uniApp editor微信滑动问题

    uniapp 小程序在微信下会出现类似下拉问题 解决方法是在app.vue 的页面onLaunch方法内添加禁止下滑方法 this.$nextTick(() => { document.body.addEventListener("touchmove", this.addBodyTouchEvent, { passive: false }); }); 问题解决后在uniApp的editor组件内无法滑动 解决方法 data内添加这两个值 添加touchstart和touchend

  • uniapp实现可以左右滑动导航栏

    本文实例为大家分享了uniapp实现左右滑动导航栏的具体代码,供大家参考,具体内容如下 <template> <view> <home-view></home-view> <view class="content-box" :id="isScale?'content-box-too':''"> <view class="nav-head-box top-nav-fixed">

  • uniapp实现滑动评分效果

    本文实例为大家分享了uniapp实现滑动评分的具体代码,供大家参考,具体内容如下 uniapp开发. 滑动评分.点击评分 <template> <view> <view class="flex" style="margin:200rpx;"> <block v-for="(item,index) in scoreArray" :key='index' ><!-- 遍历评分列表 --> &

  • jQuery学习笔记(3)--用jquery(插件)实现多选项卡功能

    在Web中用到多选项卡功能的网站有很多,比如163和126邮箱,用过的人知道.本人在那么多的类似插件中,目前碰到这个比较好,花了点时间调试出来了,请看效果图: 这款插件叫jqueryMagicTabs,上图实现了基本功能,如添加选项卡,选择指定的选项卡.当添加的选项卡超过一定长度时会出现左右滑动的按钮,同时支持鼠标滑动选项卡. 这段代码如下所示: 复制代码 代码如下: <%@ page language="java"contentType="text/html; cha

  • jquery树形菜单效果的简单实例

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

  • JQuery animate动画应用示例

    本文实例讲述了JQuery animate动画.分享给大家供大家参考,具体如下: 滑动选项卡 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style type="text/css"> .btns input{ width: 100px; h

  • js实现简洁的滑动门菜单(选项卡)效果代码

    本文实例讲述了js实现简洁的滑动门菜单.分享给大家供大家参考.具体如下: 一个简洁实用的网页选项卡菜单,在同一个页面中实现两个选项卡,第一个是滑动门,从布局上来说基本是相似的,第二个是选项卡,这里主要使用了Js自定义函数:tabMenu,函数功能:实现tab菜单,参数说明:tabMenu(tabBox,navClass); 参数一:tabBox(tab容器id) 参数二:navClass(当前标签样式class) 备注:依赖指定html结构. 运行效果截图如下: 在线演示地址如下: http:/

随机推荐