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

vue實現頁面加載動畫效果

 更新時間:2017年09月19日 11:26:48   作者:gang456789  
這篇文章主要為大家詳細介紹了vue實現頁面加載動畫效果,vue頁面出現正在加載的初始頁面與實現動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

我們經??吹綌祿闯霈F時,頁面中會有一條提示消息, 頁面正在加載中,如何實現該效果呢 ,請看下面代碼

<template>
 <section class="page" v-if="option" 
  :style="{background: option.background,color: option.color||'#fff'}"  
  :class="{'page-before': option.index < currentPage,
    'page-after': option.index > currentPage,
    'page-current': option.index === currentPage}">
  <div :class="{'all-center': option.isCenter}">
   <slot></slot>
  </div>
 </section>
 <section class="page" v-else>頁面正在渲染中。。。</section>
</template>

有木有感覺很簡單
下面上點干貨,實現頁面的動畫效果

<template>
 <nav class="controller">
  <button v-if="option.arrowsType" class="prev-btn" :class="{moving:option.arrowsType === 'animate'}" @click="changePage(prevIndex)"></button>
  <ul v-if="option.navbar">
   <li v-for="index in pageNum" @click="changePage(index)" :class="{current:option.highlight && index === currentPage}" :key="'controller-'+index" :data-index="index" class="controller-item"></li>
  </ul>
  <button v-if="option.arrowsType" class="next-btn" :class="{moving:option.arrowsType === 'animate'}" @click="changePage(nextIndex)"></button>
 </nav>
</template>

<script>
export default {
 name: 'page-controller',
 props: {
 pageNum: Number,
 currentPage: Number,
 option: {
  type: Object,
  default: {
  arrowsType: 'animate',
  navbar: true,
  highlight: true,
  loop: true  //是否開啟滾動循環(huán)
  }
 }
 },
 methods: {
 changePage (index) {
  this.$emit('changePage', index);
 }
 },
 computed: {
 nextIndex () {
  if (this.currentPage === this.pageNum) {
  if(this.option.loop){
   return 1
   }else{
   return this.pageNum
   }
  } else {
  return this.currentPage + 1;
  }
 },
 prevIndex () {
  if (this.currentPage === 1) {
  if(this.option.loop){
   return this.pageNum
   }else{
   return 1
   }
  } else {
  return this.currentPage - 1;
  }
 }
 },
 created () {
 if (this.option.navbar === undefined) {
  this.option.navbar = true;
 }
 },
 mounted () {
 let _this = this;
 let timer = null;
 let start = 0;
 // 滾輪處理
 function scrollHandler (direction) {
  // 防止重復觸發(fā)滾動事件
  if (timer != null) {
  return;
  }
  if (direction === 'down') {
  _this.changePage(_this.nextIndex);
  } else {
  _this.changePage(_this.prevIndex);
  }
  timer = setTimeout(function() {
  clearTimeout(timer);
  timer = null;
  }, 300);
 }
 // if (Object.hasOwnProperty.call(window,'onmousewheel')) {
 if (Object.hasOwnProperty.call(window,'onmousewheel')) {
  // 監(jiān)聽滾輪事件
  window.addEventListener('mousewheel',function (event) { // IE/Opera/Chrome
  let direction = event.wheelDelta > 0 ? 'up':'down';
  scrollHandler(direction);
  },false);
 } else {
  window.addEventListener('DOMMouseScroll',function (event) { // Firefox
  let direction = event.detail > 0 ? 'up':'down';
  scrollHandler(direction);
  },false);
 }
 // 移動端觸摸事件處理
 window.addEventListener('touchstart', function (event) {
  start = event.touches[0].clientY;
 })
 window.addEventListener('touchmove', function (event) {
  event.preventDefault();
 })
 window.addEventListener('touchend', function (event) {
  let spacing = event.changedTouches[0].clientY - start;
  let direction;  
  if (spacing > 50) {
  direction = 'up';
  scrollHandler(direction);
  } else if (spacing < -50) {
  direction = 'down';
  scrollHandler(direction);
  }
 })
 }
}
</script>

<style scoped>
.controller {
 position: fixed;
 right: 20px;
 top: 50%;
 z-index: 99;
}
.controller ul {
 transform: translate3d(0,-50%,0);
 list-style: none;
 margin: 0;
 padding: 0;
}
.controller-item {
 cursor: pointer;
 width: 20px;
 height: 20px;
 border-radius: 50%;
 margin-top: 10px;
 background-color: rgba(255, 255, 255, 0.3);
 transition: background-color 0.3s ease 0s;
}
.controller-item:hover {
 background-color: rgba(255, 255, 255, 0.7);
}
.controller-item.current {
 background-color: rgba(255, 255, 255, 1);
}
.prev-btn,.next-btn {
 cursor: pointer;
 display: block;
 text-align: center;
 width: 20px;
 height: 20px;
 position: fixed;
 left: 50%;
 margin-left: -10px;
 border: 4px solid #fff;
 background-color: transparent;
 outline: none;
}
.prev-btn {
 top: 80px;
 transform: rotate(-45deg);
 border-bottom-color: transparent;
 border-left-color: transparent;
}
.next-btn {
 bottom: 80px;
 transform: rotate(45deg);
 border-top-color: transparent;
 border-left-color: transparent;
}
.prev-btn.moving {
 animation: prev-up-down 0.7s linear 0s infinite;
}
.next-btn.moving {
 animation: next-up-down 0.7s linear 0s infinite;
}
@keyframes next-up-down {
 0% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
 25% {
 transform: translate3d(0,6px,0) rotate(45deg);
 }
 50% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
 75% {
 transform: translate3d(0,-6px,0) rotate(45deg);
 }
 100% {
 transform: translate3d(0,0,0) rotate(45deg);
 }
}
@keyframes prev-up-down {
 0% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
 25% {
 transform: translate3d(0,-6px,0) rotate(-45deg);
 }
 50% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
 75% {
 transform: translate3d(0,6px,0) rotate(-45deg);
 }
 100% {
 transform: translate3d(0,0,0) rotate(-45deg);
 }
}
</style>

本文已被整理到了《Vue.js前端組件學習教程》,歡迎大家學習閱讀。

關于vue.js組件的教程,請大家點擊專題vue.js組件學習教程進行學習。

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

相關文章

  • 使用antv替代Echarts實現數據可視化圖表詳解

    使用antv替代Echarts實現數據可視化圖表詳解

    這篇文章主要為大家介紹了使用antv替代Echarts實現數據可視化圖表詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Vue props 單向數據流的實現

    Vue props 單向數據流的實現

    這篇文章主要介紹了Vue props 單向數據流的實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • vue3組件的掛載更新流程詳解

    vue3組件的掛載更新流程詳解

    這篇文章主要介紹了vue3組件的掛載更新流程,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • vue3 setup的使用和原理實例詳解

    vue3 setup的使用和原理實例詳解

    這篇文章主要介紹了vue3的setup的使用和原理,結合實例形式詳細分析了vue3 setup的基本功能、原理與使用方法,需要的朋友可以參考下
    2023-06-06
  • Vue3 使用Vuex和router的注意事項及操作方法

    Vue3 使用Vuex和router的注意事項及操作方法

    在vue2中 使用的?this.$route?和?this.$router?this.$store的使用在vue3中完全適用,這篇文章主要介紹了Vue3 使用Vuex和router的注意事項及操作方法,需要的朋友可以參考下
    2022-12-12
  • vue--點擊當前增加class,其他刪除class的方法

    vue--點擊當前增加class,其他刪除class的方法

    今天小編就為大家分享一篇vue--點擊當前增加class,其他刪除class的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue輸入節(jié)流,避免實時請求接口的實例代碼

    vue輸入節(jié)流,避免實時請求接口的實例代碼

    今天小編就為大家分享一篇vue輸入節(jié)流,避免實時請求接口的實例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Vant Weapp組件踩坑:picker的初始賦值解決

    Vant Weapp組件踩坑:picker的初始賦值解決

    這篇文章主要介紹了Vant Weapp組件踩坑:picker的初始賦值解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue使用neovis操作neo4j圖形數據庫及優(yōu)缺點

    vue使用neovis操作neo4j圖形數據庫及優(yōu)缺點

    這篇文章主要介紹了vue使用neovis操作neo4j圖形數據庫,本文給大家介紹了與常規(guī)做法的優(yōu)缺點對比及使用技巧,對vue?neo4j圖形數據庫相關知識感興趣的朋友一起看看吧
    2022-02-02
  • vue對于低版本瀏覽器兼容問題的解決思路

    vue對于低版本瀏覽器兼容問題的解決思路

    很多時候使用vue開發(fā)的項目,由于無法在低版本瀏覽器上運行,所以需要解決下,下面這篇文章主要給大家介紹了關于vue對于低版本瀏覽器兼容問題的解決思路,需要的朋友可以參考下
    2023-02-02

最新評論

南涧| 车致| 吴忠市| 高尔夫| 新津县| 沁水县| 丹东市| 宁津县| 三明市| 平昌县| 武山县| 莲花县| 昌都县| 舟山市| 洛宁县| 无为县| 威远县| 万山特区| 吉水县| 桐柏县| 寿宁县| 高青县| 黑山县| 漾濞| 隆化县| 西吉县| 徐闻县| 简阳市| 万宁市| 鹤庆县| 莱西市| 新河县| 柳河县| 霍城县| 紫云| 东辽县| 贵阳市| 靖宇县| 泸定县| 东阳市| 林周县|