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 相关文章推荐
javascript EXCEL 操作类代码
Jul 30 Javascript
js中关于new Object时传参的一些细节分析
Mar 13 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
Dec 24 Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
Jan 17 Javascript
探讨Vue.js的组件和模板
Oct 27 Javascript
vue项目关闭eslint校验
Mar 21 Javascript
简述vue状态管理模式之vuex
Aug 29 Javascript
vueJs实现DOM加载完之后自动下拉到底部的实例代码
Aug 31 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
如何配置vue.config.js 处理static文件夹下的静态文件
Jun 19 Javascript
JavaScript前端面试扁平数据转tree与tree数据扁平化
Jun 14 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用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
解析使用substr截取UTF-8中文字符串出现乱码的问题
2013/06/20 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
PHP正则验证Email的方法
2015/06/15 PHP
thinkPHP3.2.2框架行为扩展及demo示例
2018/06/19 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
JS版网站风格切换实例代码
2008/10/06 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
JavaScript操作HTML元素和样式的方法详解
2015/10/21 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
百度多文件异步上传控件webuploader基本用法解析
2016/11/07 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
微信小程序实现拖拽功能
2019/09/26 Javascript
mac下pycharm设置python版本的图文教程
2018/06/13 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
python写一个随机点名软件的实例
2019/11/28 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
浅谈anaconda python 版本对应关系
2020/10/07 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
开工庆典邀请函范文
2014/01/16 职场文书
物流管理毕业生自荐信范文
2014/03/15 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
广告宣传策划方案
2014/05/21 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
PHP控制循环操作的时间
2021/04/01 PHP