VUE单页面切换动画(全网最好的切换效果)

// 视图切换动画逻辑
let history = window.sessionStorage
let historyCount = history.getItem('count') * 1 || 0
function routerTransition (to, from) {
  const toIndex = history.getItem(to.name)
  const fromIndex = history.getItem(from.name)
  let direction = 'forward'
  if (toIndex) {
    if (toIndex >= fromIndex || !fromIndex) {
      store.commit('UPDATE_DIRECTION', {direction})
    } else {
      direction = 'reverse'
      store.commit('UPDATE_DIRECTION', {direction})
    }
  } else {
    ++historyCount
    history.setItem('count', historyCount)
    to.path !== '/' && history.setItem(to.name, historyCount)
    direction = 'forward'
    store.commit('UPDATE_DIRECTION', {direction})
  }
}
router.beforeEach(function (to, from, next) {
  routerTransition(to, from)
  next()
})
<template>
  <div id="app">
      <div v-transfer-dom >
        <loading :show="isLoading" :transition="''"></loading>
      </div>
      <transition  :name="viewAnimate">
               <router-view v-if="isNetworkOnline"></router-view>
               <no-network  v-if="!isNetworkOnline"></no-network>
      </transition>
  </div>
</template>

<script>
import '@/assets/iconfont/iconfont.css'
import { Loading, TransferDom } from 'vux'
import {mapState} from 'vuex'
import noNetwork from '@/page/system/callback/noNetwork.vue'
export default {
  directives: {
    TransferDom
  },
  computed: {
    ...mapState({
      isLoading: state => state.isLoading,
      direction: state => state.direction,
      isNetworkOnline: state => state.isNetworkOnline
    })
  },
    // dynamically set transition based on route change
  watch: {
    '$route' (to, from) {
      if (this.direction === 'forward') {
        this.viewAnimate = 'slide-left'
      } else {
        this.viewAnimate = 'slide-right'
      }
    }
  },
  data () {
    return {
      viewAnimate: 'slide-left'
    }
  },
  components: {
    Loading,
    noNetwork
  }
}
</script>

<style lang="less">
@import '~vux/src/styles/reset.less';
@import '~vux/src/styles/close.less';
@import '~@/styles/common.less';
body {
  background-color: #fbf9fe;
}
@keyframes slideInLeft {
    from {
        transform: translate3d(100%, 0, 0);
        opacity: 1;
    }
    to {
        transform: translate3d(0, 0, 0);
             opacity: 1;
    }
}
@keyframes slideInRight {
    from {
        transform: translate3d(-100%, 0, 0);
        opacity: 1;
    }
    to {
        transform: translate3d(0, 0, 0);
             opacity: 1;
    }
}
@keyframes slideLeftOut {
    from {
        transform: translate3d(0, 0, 0);
        opacity: 0;
    }
    to {
        transform: translate3d(100%, 0, 0);
        opacity: 0;
    }
}
@keyframes slideRightOut {
    from {
        transform: translate3d(0, 0, 0);
        opacity: 0;
    }
    to {
        transform: translate3d(-100%, 0, 0);
        opacity: 0;
    }
} 
.slide-left-enter-active {
    animation: slideInLeft .3s forwards;
    z-index:5;
}

.slide-left-leave-active {
    animation: slideLeftOut .3s forwards;
    z-index:3;
}
 .slide-right-enter-active {
    animation: slideInRight .3s forwards;
    z-index:5;
}

.slide-right-leave-active {
    animation: slideRightOut .3s forwards;
    z-index:3;
} 
</style>
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值