最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue插件tab選項卡使用小結(jié)

 更新時間:2016年10月27日 10:19:00   作者:柯少俠  
這篇文章主要為大家詳細介紹了vue插件tab選項卡的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了vue插件tab選項卡的使用方法,供大家參考,具體內(nèi)容如下

基本用法

<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參數(shù)釋義

代碼

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; //滑動結(jié)束設置下次滑動起始值。
 }

 },
 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);
  }
 }
 // 結(jié)尾幾個
 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選項卡操作方法匯總

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • vue項目實現(xiàn)頁面跳轉(zhuǎn)的方法

    vue項目實現(xiàn)頁面跳轉(zhuǎn)的方法

    這篇文章主要給大家分享的是vue項目實現(xiàn)頁面跳轉(zhuǎn)的方法,vue-router是前端開發(fā)中用來實現(xiàn)路由頁面跳轉(zhuǎn)的一個模塊。下面小編將帶來如何在已經(jīng)創(chuàng)建好的vue-router項目基礎下實現(xiàn)頁面跳轉(zhuǎn),需要的朋友可以參考一下
    2021-11-11
  • Vue使用vue-area-linkage實現(xiàn)地址三級聯(lián)動效果的示例

    Vue使用vue-area-linkage實現(xiàn)地址三級聯(lián)動效果的示例

    很多時候我們需要使用地址三級聯(lián)動,即省市區(qū)三級聯(lián)動,這篇文章主要介紹了Vue使用vue-area-linkage實現(xiàn)地址三級聯(lián)動效果的示例,感興趣的小伙伴們可以參考一下
    2018-06-06
  • vue中的localStorage使用方法詳解

    vue中的localStorage使用方法詳解

    在Vue項目中可以直接使用localStorage,它支持Vue2和Vue3,在Vue2中,可以通過`localStorage.setItem()`、`localStorage.getItem()`和`localStorage.removeItem()`來保存、讀取和刪除數(shù)據(jù),本文給大家介紹vue中的localStorage使用詳解,感興趣的朋友一起看看吧
    2025-03-03
  • vue checkbox 全選 數(shù)據(jù)的綁定及獲取和計算方法

    vue checkbox 全選 數(shù)據(jù)的綁定及獲取和計算方法

    下面小編就為大家分享一篇vue checkbox 全選 數(shù)據(jù)的綁定及獲取和計算方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • Vue3使用路由及配置vite.alias簡化導入寫法的過程詳解

    Vue3使用路由及配置vite.alias簡化導入寫法的過程詳解

    這篇文章主要介紹了Vue3使用路由及配置vite.alias簡化導入寫法,本文通過實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • vue3整合springboot打完整jar包

    vue3整合springboot打完整jar包

    本文主要介紹了vue3整合springboot打完整jar包,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • vue3+vite+ts?通過svg-sprite-loader?插件使用自定義圖標的詳細步驟

    vue3+vite+ts?通過svg-sprite-loader?插件使用自定義圖標的詳細步驟

    這篇文章主要介紹了vue3+vite+ts通過svg-sprite-loader插件使用自定義圖標,本文分步驟給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 利用vue+elementUI實現(xiàn)部分引入組件的方法詳解

    利用vue+elementUI實現(xiàn)部分引入組件的方法詳解

    這篇文章主要給大家介紹了關于利用vue+elementUI實現(xiàn)部分引入組件的相關資料,以及介紹了vue引入elementUI報錯的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-11-11
  • Vue.js表單標簽中的單選按鈕、復選按鈕和下拉列表的取值問題

    Vue.js表單標簽中的單選按鈕、復選按鈕和下拉列表的取值問題

    這篇文章主要介紹了Vue.js表單標簽中的單選按鈕、復選按鈕和下拉列表的取值問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-11-11
  • Vue3使用hooks函數(shù)實現(xiàn)代碼復用詳解

    Vue3使用hooks函數(shù)實現(xiàn)代碼復用詳解

    這篇文章主要介紹了Vue3使用hooks函數(shù)實現(xiàn)代碼復用詳解,Vue3的hook函數(shù)可以幫助我們提高代碼的復用性,?讓我們能在不同的組件中都利用hooks函數(shù)
    2022-06-06

最新評論

石景山区| 康平县| 广东省| 静海县| 东乌珠穆沁旗| 措美县| 永新县| 中方县| 长治县| 浮梁县| 建瓯市| 大荔县| 兴义市| 淳化县| 云龙县| 山西省| 乌兰察布市| 尖扎县| 枣庄市| 绥江县| 镇赉县| 丽江市| 昭觉县| 瑞安市| 托克逊县| 聂拉木县| 望江县| 民权县| 林口县| 南宁市| 武汉市| 怀宁县| 女性| 七台河市| 隆回县| 封丘县| 东兴市| 玉田县| 巴青县| 鄂州市| 大足县|