vue插件tab选项卡使用小结


Posted in Javascript onOctober 27, 2016

本文实例为大家分享了vue插件tab选项卡的使用方法,供大家参考,具体内容如下

基本用法

<template>
 <tab :options="tabOpt" :state.sync="stateIndex"></tab>
</template>
<script type="text/babel">
 import tab from 'components/tab_touch';
 export default {
 data(){
 tabOpt:undefined,
 stateIndex:0
 },
 components:{
 "tab":tab
 },
 ready(){
 this.tabOpt={
 count: 2.3,
 pin:true,
 htmls:[
  "<span>白日登山</span>",
  "<span>望烽火</span>",
  "<span>黄昏饮马</span>",
  "<span>傍交河</span>",
  "<span>行人刁斗</span>",
  "<span>风沙暗</span>",
  "<span>公主琵琶</span>",
  "<span>幽怨多</span>",
  "<span>野营万里</span>",
  "<span>无城郭</span>",
  "<span>雨雪纷纷</span>",
  "<span>连大漠</span>"
 ],
 slideCallback:function (dex) {
 console.log(dex);
 },
 tabClassName:"tab",
 tabActiveClassName: "active"
 }
 }
 }
</script>

options参数释义

vue插件tab选项卡使用小结

代码

tab.vue

<template>
 <div class="fixWrap">
 <div class="component-tabsWrap" :id="tabsWrapID"
 v-touch:pan="onPan">
 <div class="component-tabs" :style="wrapStyle">
 <div class="component-tab" v-for="item in options.htmls" track-by="$index" :style="'width:'+tWidth+'px'"
  @click.stop="this.state=$index"
  :class="[options.tabClassName,$index==state?options.tabActiveClassName:'']">
  {{{item}}}
 </div>
 </div>
 </div>
 </div>
</template>
<style lang="sass" rel="stylesheet/sass">
 @import "tab.sass"
</style>
<script lang="babel" type="text/babel">
 var VueTouch = require ('vue-touch');
 Vue.use (VueTouch);
 import requestAnimFrame from "utils/requestAnimFrame"
 const sign = (num)=> {
 return num >= 0 ? 1 : -1
 }
 export default {
 props: ["options", "state"],
 data(){
 return {
 tabsWrapID: undefined,//外容器ID
 wrapWidth: "", //外容器宽度
 tWidth: 0, //每一个选项卡应该有多宽
 width: 0, //宽度。
 startTransX: 0,
 transX: 0, //元素样式偏移。
 cssX: 0 //动作中css实际完成的偏移。
 }
 },
 methods: {
 init(){
 this.wrapWidth = document.getElementById (this.tabsWrapID).offsetWidth;
 this.tWidth = this.wrapWidth / this.options.count;
 this.width = this.tWidth * this.options.htmls.length;
 setTimeout(function(){
  this.$el.style["height"]= this.$el.children[0].clientHeight+"px";
 }.bind(this),0)
 if (this.options.pin) {
  var elemRect = this.$el.getBoundingClientRect ();
  var windowOffset = this.getWindowOffset ();
  var winOffsetY = windowOffset.offsetY;
  this.elemOffsetY = elemRect.top + winOffsetY;
  document.addEventListener ('scroll', this.isTop);
 }
 },
 onPan(event){
 if (this.options.disPan) return;
 this.transX = event.deltaX + this.startTransX;
 this.cssX = this.transX;
 if (event.eventType == 4) {
  this.transX = -Math.round (-this.transX / this.tWidth) * this.tWidth; //整格滑动
  var start = null;
  if (this.transX > 0) {
  // 头部回弹
  this.transX = 0;
  var speed = 24;
  requestAnimFrame (step.bind (this));
  function step (timestamp) {
  this.cssX -= speed;
  if (this.cssX > this.transX) requestAnimFrame (step.bind (this));
  else this.startTransX = this.cssX = this.transX;
  };
  }
  else if (this.transX < this.wrapWidth - this.width) {
  // 尾部回弹
  this.transX = this.wrapWidth - this.width;
  var speed = 24;
  requestAnimFrame (step.bind (this));
  function step (timestamp) {
  this.cssX += speed;
  if (this.cssX < this.transX) requestAnimFrame (step.bind (this));
  else this.startTransX = this.cssX = this.transX;
  };
  }
  else {
  //整格落位
  let speed = 6;
  let _sign = sign (this.cssX - this.transX);
  if (_sign * (this.cssX - this.transX) > 1) requestAnimFrame (step.bind (this));
  else this.cssX = this.transX;
  function step (timestamp) {
  if (start === null) start = timestamp;
  let progress = timestamp - start;
  if (progress < 3000) speed *= 1 - progress / 3000;
  this.cssX -= _sign * speed;
  if (_sign * (this.cssX - this.transX) > 1) requestAnimFrame (step.bind (this));
  else this.cssX = this.transX;
  };
  }
  this.startTransX = this.transX; //滑动结束设置下次滑动起始值。
 }

 },
 slideTo(dex){
 this.state = dex;
 let speed = 10;
 // 开头几个
 if (dex + 1 <= this.options.count) {
  this.transX = 0; // 设置应到位置。
  if (this.startTransX < this.transX) {
  let _sign = sign (this.transX - this.startTransX);
  this.cssX = this.transX - _sign * this.tWidth;
  requestAnimFrame (step.bind (this));
  function step () {
  this.cssX += _sign * speed;
  if (_sign * (this.cssX - this.transX) < 0) requestAnimFrame (step.bind (this));
  else {
  this.cssX = this.startTransX = this.transX;
  if (this.options.slideCallback) this.options.slideCallback (dex);
  }
  ;
  };
  }
  //无需动画
  else {
  this.cssX = this.startTransX = this.transX;
  if (this.options.slideCallback) this.options.slideCallback (dex);
  }
 }
 // 结尾几个
 else if (this.options.htmls.length - dex <= this.options.count) {
  this.transX = this.wrapWidth - this.width;// 设置应到位置。
  if (this.startTransX > this.transX) {
  let _sign = sign (this.transX - this.startTransX);
  this.cssX = this.transX - _sign * this.tWidth;
  requestAnimFrame (step.bind (this));
  function step () {
  this.cssX += _sign * speed;
  if (_sign * (this.cssX - this.transX) < 0) requestAnimFrame (step.bind (this));
  else {
  this.cssX = this.startTransX = this.transX;
  if (typeof this.options.slideCallback == "function") this.options.slideCallback (dex);
  }

  };
  }
  else {
  this.cssX = this.startTransX = this.transX; //无需动画
  if (typeof this.options.slideCallback == "function") this.options.slideCallback (dex);
  }
 }
 //中
 else {
  this.transX = -this.tWidth * dex;// 设置应到位置。
  let _sign = sign (this.transX - this.startTransX);
  if (this.tWidth * (dex + 0.5 * (1 - _sign)) + this.startTransX >= 0 && this.tWidth * (dex + 0.5 * (1 - _sign)) + this.startTransX <= this.wrapWidth) {
  //无需动画
  this.cssX = this.transX = this.startTransX;
  if (typeof this.options.slideCallback == "function") this.options.slideCallback (dex);
  }
  else {
  //需要动画
  this.cssX = this.transX - _sign * this.tWidth;
  requestAnimFrame (step.bind (this));
  function step () {
  this.cssX += _sign * speed;
  if (_sign * (this.cssX - this.transX) < 0) requestAnimFrame (step.bind (this));
  else {
  this.cssX = this.startTransX = this.transX;
  if (typeof this.options.slideCallback == "function") this.options.slideCallback (dex);
  }
  };
  }
 }
 },
 isTop(){
 var windowOffset = this.getWindowOffset (),
  winOffsetY = windowOffset.offsetY,
  isTop;
 isTop = this.elemOffsetY <= winOffsetY;
 if (isTop) {
  this.$el.children[0].style['position'] = 'fixed';
  this.$el.children[0].style['top'] = '0';
  this.$el.children[0].style['left'] = '0';
 }
 else {
  this.$el.children[0].style['position']='relative';
 }
 return isTop;
 },
 getWindowOffset(){
 var t;
 var win = window;
 var pageXOffset = (typeof win.pageXOffset == 'number') ? win.pageXOffset : (((t = doc.documentElement) || (t = body.parentNode)) && typeof t.ScrollLeft == 'number' ? t : body).ScrollLeft;
 var pageYOffset = (typeof win.pageYOffset == 'number') ? win.pageYOffset : (((t = doc.documentElement) || (t = body.parentNode)) && typeof t.ScrollTop == 'number' ? t : body).ScrollTop;
 return {
  offsetX: pageXOffset,
  offsetY: pageYOffset
 };
 },
 },
 watch: {
 options(){
 this.tabsWrapID = parseInt (Math.random () * 1e10);
 setTimeout (this.init.bind (this), 10);
 },
 state(val){
 this.slideTo(val)
 }
 },
 computed: {
 wrapStyle(){
 var _str = "";
 if (this.width) _str += `width:${this.width}px;`;//宽度
 _str += `-webkit-transform:translateX(${this.cssX}px);` //位移。
 _str += `transform:translateX(${this.cssX}px);` //位移。
 return _str
 }
 }
 }
</script>
<style lang="sass" rel="stylesheet/sass" type="sass">
.fixWrap
 z-index: 999
 position: relative
.component-tabsWrap
 width: 100%
 overflow: hidden
 min-height: .1rem
 position: relative
 background: #fff
 .component-tabs
 height: 100%
 display: table
 .component-tab
 display: table-cell
 box-sizing: border-box
 text-align: center
 vertical-align: middle
</style>

本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

如果大家还想深入学习,可以点击两个精彩的专题:javascript选项卡操作方法汇总 jquery选项卡操作方法汇总

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

Javascript 相关文章推荐
修改发贴的编辑功能
Mar 07 Javascript
你需要知道的JavsScript可以做什么?
Jun 29 Javascript
用JavaScript显示随机图像或引用
Apr 21 Javascript
node.js中的querystring.escape方法使用说明
Dec 10 Javascript
JavaScript中的call方法和apply方法使用对比
Aug 12 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
关于javascript获取内联样式与嵌入式样式的实例
Jun 01 Javascript
微信小程序之电影影评小程序制作代码
Aug 03 Javascript
分析javascript中9 个常见错误阻碍你进步
Sep 18 Javascript
前后端如何实现登录token拦截校验详解
Sep 03 Javascript
React Router V4使用指南(精讲)
Sep 17 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
Oct 27 #Javascript
微信小程序 action-sheet底部菜单详解
Oct 27 #Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
Oct 27 #Javascript
微信小程序  modal弹框组件详解
Oct 27 #Javascript
从0开始学Vue
Oct 27 #Javascript
微信小程序  Mustache语法详细介绍
Oct 27 #Javascript
利用JQuery直接调用asp.net后台的简单方法
Oct 27 #Javascript
You might like
php数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
laravel安装和配置教程
2014/10/29 PHP
PHP使用file_get_content设置头信息的方法
2016/02/14 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
thinkphp5 模型实例化获得数据对象的教程
2019/10/18 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
实例浅析js的this
2016/12/11 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
2017/03/10 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
vue-父子组件和ref实例详解
2019/11/10 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
python数字图像处理实现直方图与均衡化
2018/05/04 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
Python2与Python3的区别点整理
2019/12/12 Python
keras 多任务多loss实例
2020/06/22 Python
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
医药工作者的求职信范文
2013/09/21 职场文书
大四毕业生自荐书
2014/07/05 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
工作一年自我鉴定
2019/06/20 职场文书
html+css合并表格边框的示例代码
2021/03/31 HTML / CSS
springboot+VUE实现登录注册
2021/05/27 Vue.js
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python