基于Vue的页面切换左右滑动效果

摘要:
HTML文本页:˂!

HTML文本页面:

<template>
  <div id="app>
    <transition :name="direction" mode="out-in"> <!--动态获得transition 的name值-->
      <router-view class="app-view" wechat-title></router-view>
    </transition>
  </div>
</template>

JS定义代码:定义在全局js文件里面

  router.beforeEach((to, from, next) => {
    const list = ['home', 'group', 'user']    // 将需要切换效果的路由名称组成一个数组
    const toName = to.name    // 即将进入的路由名字
    const fromName = from.name    // 即将离开的路由名字
    const toIndex = list.indexOf(toName)    // 进入下标
    const fromIndex = list.indexOf(fromName)   // 离开下标
    let direction = ''

    if (toIndex > -1 && fromIndex > -1) {   // 如果下标都存在
      if (toIndex < fromIndex) {          // 如果进入的下标小于离开的下标,那么是左滑
        direction = 'left'
      } else {
        direction = 'right'         // 如果进入的下标大于离开的下标,那么是右滑
      }
    }

    store.state.viewDirection = direction  //这里使用vuex进行赋值

    return next()
  })

在App.vue文件中,进行计算属性:

    computed: {

      direction () {
        const viewDir = this.$store.state.viewDirection
        let tranName = ''

        if (viewDir === 'left') {
          tranName = 'view-out'
        } else if (viewDir === 'right') {
          tranName = 'view-in'
        } else {
          tranName = 'fade'
        }

        return tranName
      },
    },

css3进行动画效果定义:使用sass

待定义引入样式文件:

// Variables
$AnimateHook: "animated";
$AnimateDuration: 0.8s;

// Mixins

// Base Style
.#{$AnimateHook} {
  -webkit-animation-duration: $AnimateDuration;
  animation-duration: $AnimateDuration;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;

  // Modifier for infinite repetition
  &.infinite {
    -webkit-animation-iteration-count: infinite;
    animation-iteration-count: infinite;
  }

}

// Slide
@-webkit-keyframes slideInLeft {
  from {
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

}

@keyframes slideInLeft {
  from {
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

}

.slideInLeft {
  -webkit-animation-name: slideInLeft;
  animation-name: slideInLeft;
}

@-webkit-keyframes slideInRight {
  from {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

}

@keyframes slideInRight {
  from {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
    visibility: visible;
  }

  to {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

}

.slideInRight {
  -webkit-animation-name: slideInRight;
  animation-name: slideInRight;
}

@-webkit-keyframes slideOutLeft {
  from {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

  to {
    visibility: hidden;
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
  }

}

@keyframes slideOutLeft {
  from {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

  to {
    visibility: hidden;
    -webkit-transform: translate3d(-100%, 0, 0);
    transform: translate3d(-100%, 0, 0);
  }

}

.slideOutLeft {
  -webkit-animation-name: slideOutLeft;
  animation-name: slideOutLeft;
}

@-webkit-keyframes slideOutRight {
  from {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

  to {
    visibility: hidden;
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }

}

@keyframes slideOutRight {
  from {
    -webkit-transform: translate3d(0, 0, 0);
    transform: translate3d(0, 0, 0);
  }

  to {
    visibility: hidden;
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0);
  }

}

.slideOutRight {
  -webkit-animation-name: slideOutRight;
  animation-name: slideOutRight;
}

@-webkit-keyframes inRight {
  0% {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0)
  }

  to {
    -webkit-transform: translateZ(0);
    transform: translateZ(0)
  }

}

@keyframes inRight {
  0% {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0)
  }

  to {
    -webkit-transform: translateZ(0);
    transform: translateZ(0)
  }

}

@-webkit-keyframes outLeft {
  0% {
    -webkit-transform: translateZ(0);
    transform: translateZ(0)
  }

  to {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0)
  }

}

@keyframes outLeft {
  0% {
    -webkit-transform: translateZ(0);
    transform: translateZ(0)
  }

  to {
    -webkit-transform: translate3d(100%, 0, 0);
    transform: translate3d(100%, 0, 0)
  }

}

定义进入与离开的动画过渡:

.fade-enter-active,
.fade-leave-active {
  transition: all .2s ease;
}

.fade-enter,
.fade-leave-active {
  opacity: 0;
}

.view-in-enter-active,
.view-out-leave-active {
  position: absolute;
  top: 0;
  width: 100%;
  padding-top: px2rem($titbarHeight);
  -webkit-animation-duration: .3s;
  animation-duration: .3s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}

.view-in-enter-active {
  -webkit-animation-name: inRight;
  animation-name: inRight;
}

.view-out-leave-active {
  -webkit-animation-name: outLeft;
  animation-name: outLeft;
}

免责声明:文章转载自《基于Vue的页面切换左右滑动效果》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇可能你不知道的,关于自动装箱和自动拆箱python split(),os.path.split()和os.path.splitext()函数用法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

解决IE8的兼容问题

本文分享下我在项目中积累的IE8+兼容性问题的解决方法。根据我的实践经验,如果你在写HTML/CSS时候是按照W3C推荐的方式写的,然后下面的几点都关注过,那么基本上很大一部分IE8+兼容性问题都OK了(这里的IE8+主要是指IE8,据个人目测,IE9+的渲染效果已经非常好了)。 前期准备 测试IE兼容性必须要在Windows中测,而且是Win7+,因为W...

Vue-Router基础知识点总结【vue系列】

Vue-Router 认识路由 1.什么是路由 2.后端路由阶段 3.前端路由阶段 前端路由的规则 1.URL的hash 2.HTML5的history模式 Vue-Router基础 1.认识vue-router 2.安装与使用vue-router 3.路由组件详解 路由配置其他补充 1.路由的默认路径 2.路径的History模式...

vue初级学习--组件的使用(自定义组件)

一、导语   突然冒出四个字,分即是合,嗯,有点道理。。。。。。。。。。。。。。。。。。。。。。。 二、正文   在搞的仿淘宝demo,之前加入购物车是与商品详情一块的,今天把它单独拆出来,复用性高点,那这样的话,就涉及到了组件开发了。vue的组件注册是超级超级容易的,接下来就简短的说说组件吧,直接上demo了。   1、理解组件     官方对于组件的解...

vue v-model 的注意点

在使用表单元素 input 的 v-model 指令时,碰到一个问题: 如上图,修改 input 的内容,以便随时显示;但显示时明显慢一步。 <template> <div> <input type="text" v-model="obj.val" @keyup="onUpdate"> <sp...

CSS reset

前面的话 大部分的时候,作为前端,我们在写 CSS 样式之前,需要添加一份reset.css。CSS reset不仅用于清除默认样式,更是一种全局样式定义。如果项目前期不定制好CSS reset,后期维护阶段再对其进行修改,将会牵一发而动全身。本文将详细介绍CSS reset reset 以网易NEC的CSS reset为例,来进行说明 /*reset *...

Vue 计数器

首先.我们先导入vue插件: <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>  然后建立一个<div> <div id="app"> <button>-</button>...