美文网首页前端开发笔记Web前端之路让前端飞
Vue2.0 过渡动画——仿微信左右切换效果

Vue2.0 过渡动画——仿微信左右切换效果

作者: Yunfly | 来源:发表于2017-06-08 18:00 被阅读13661次

    需要用到的技术栈Vue+Vuex

    先丢个图


    过渡动画.gif

    awesomes上寻找移动端框架的时候意外发现了vux的页面切换效果,后面由于其他考虑没有选用但是这个切换效果确实感觉很有新意,也就看了下源码,这里贴一份备用。

    //app.vue
    <transition :name="'vux-pop-' + (direction === 'forward' ? 'in' : 'out')">
          <keep-alive>
          <router-view class="router-view" ></router-view>
          </keep-alive>
    </transition>
    <script>
      import { mapState } from 'vuex'
      import sideFooter from "./components/Footer.vue"
    
      export default {
        name: 'app',
        data () {
          return {
            showFooter : false
          }
        },
        components : {
          sideFooter
        },
        computed:{
          ...mapState({
            direction: state => state.mutations.direction
          })
        },
      }
    </script>
    
    <style scoped>
     .vux-pop-out-enter-active,
      .vux-pop-out-leave-active,
      .vux-pop-in-enter-active,
      .vux-pop-in-leave-active {
        will-change: transform;
        transition: all 250ms;
        height: 100%;
        top: 0;
        position: absolute;
        backface-visibility: hidden;
        perspective: 1000;
      }
    
      .vux-pop-out-enter {
        opacity: 0;
        transform: translate3d(-100%, 0, 0);
      }
    
      .vux-pop-out-leave-active {
        opacity: 0;
        transform: translate3d(100%, 0, 0);
      }
    
      .vux-pop-in-enter {
        opacity: 0;
        transform: translate3d(100%, 0, 0);
      }
    
      .vux-pop-in-leave-active {
        opacity: 0;
        transform: translate3d(-100%, 0, 0);
      }
    </style>
    
    // main.js
    const history = window.sessionStorage;
    history.clear()
    let historyCount = history.getItem('count') * 1 || 0;
    history.setItem('/', 0);
    
    router.beforeEach(function (to, from, next) {
    
      const toIndex = history.getItem(to.path);
      const fromIndex = history.getItem(from.path);
    
      if (toIndex) {
        if (!fromIndex || parseInt(toIndex, 10) > parseInt(fromIndex, 10) || (toIndex === '0' && fromIndex === '0')) {
          store.commit('UPDATE_DIRECTION', {direction: 'forward'})
        } else {
          store.commit('UPDATE_DIRECTION', {direction: 'reverse'})
        }
      } else {
        ++historyCount;
        history.setItem('count', historyCount);
        to.path !== '/' && history.setItem(to.path, historyCount);
        store.commit('UPDATE_DIRECTION', {direction: 'forward'})
      }
        next()
    });
    

    这里还用到了vuex,但是我stroe写了很多就不提出来了,主要就是通过 UPDATE_DIRECTION方法更新每一次的路由方向是前进还是后退。


    man.js里面主要思想就是给路由增加一个索引存到sessionStorage里面,以点击过的索引值不变,新增加的路由,索引增加1,同时count+1,这样在页面切换时通过比较索引值的大小,大的向右小的向左,做到左右有规律的过渡。

    好了至此一个左右切换的过渡效果就成了,最近由于一直在开发也没怎么更新文章,如果有朋友有好的想法欢迎与我交流。


    另附github地址:https://github.com/Yunfly/vue-wechatAnimation

    相关文章

      网友评论

      • 學著往前走:跳转的时候整体页面先乱一下,然后才好。建议将这里的宽度设成100%:
        .vux-pop-out-enter-active,
        .vux-pop-out-leave-active,
        .vux-pop-in-enter-active,
        .vux-pop-in-leave-active{
        width:100%
        }
        Yunfly:@學著往前走 嗯,这篇文章只是给大家解析一下思路,可以根据自己的场景改动,满足项目要求
      • HuMengMing:请问这个demo,当跳转非子页面的时候动画不会乱吗
      • 1f2483162c46:请问一下滑动的效果 有白屏滑动 效果有点缓慢 应该怎么解决呢
        Yunfly:什么设备呢,可以试试提高css3性能的一些方法
      • 婚宴100网hunyan100:不错,应该就是你了,哈哈。
        有消息,请查看
      • 星枫岳:楼主,如果出现循环的界面怎么办,现在由 "详情页" 前往 "列表页" 这时候是前进的动画,然后点击了"列表页"上的项目要前往 "详情页"这个同样也是需要前进的动画,可是再路由判断上就会变成后退了
        Yunfly:@星枫岳 可在main.js里面的router.beforeEach直接写判断,也可以在session中删除详情页的序号让他重新获取序号
      • 开车去环游世界:vux(https://vux.li/#/) 在微信不用『返回』按钮点击返回的时候,用手势触摸屏幕返回的时候,会有两次过渡效果,这个有思路解决嘛?
        kevinlvhsl:@Yunfly 如果不是微信,而就是safari网页呢? 手势返回就是会播放两次动效, 也没有好的解决方案了是吧?
        Yunfly:手势返回是指向右滑动吗? 单页面应用好像就直接退出回到公众号了吧
      • 大桔子123:楼主,我又发现一个新问题,这个记录sessionStorage 的过程是从 第一个路由组件开始的,如果 路由地址是 http://192.168.31.13:8081/#/index2 而不是 http://192.168.31.13:8081/#/index1 ,此时 history 里记录的 toIndex 和 fromIndex 就乱掉了(即不是按照顺序点击每个tab页的),楼主有没有解决办法啊
        大桔子123:@Yunfly 效果还不错,,请问你这 gif 图片是怎么做的啊??我百度了一番也没找到好办法
        大桔子123:@Yunfly 对的,你这种方法我觉得可行,我试一下
        Yunfly:@大橘子小锦 比如底部导航栏或者说首页的的几个入口你是想按照顺序来切换,可以预先把这几个路由写入sessionStroage中,count的初始值也更改一下, 就可以解决了,至于里面的二级页面,只需要有一个切换效果就行。
      • 大桔子123:请问楼主,这个 状态为什么要存储在 session storage 中,为什么不存储在 localstorage 中,有什么特别的含义吗
      • 大桔子123:我发现切换的时候中间有根白条,在速度快的时候,白条很扎眼,
        Yunfly: @大橘子小锦 这个我只在底部有看到滚动条,你在中间是不是因为body跟htnl的高度没设置100%?
      • 罄难忘轩:思路跟官方的差不离,自己想出来很不错很不错。不过实际中特别是低端安卓机过场动画会有卡顿
        Yunfly: @蓟门忘轩 确实,所以我们把时间调整到300-100ms之间,速度快了,体验效果能稍微提上来点,移动端的动画确实不像PC那么好
      • b0833e25542b:其实没有什么卵用,我们实现了和微信转场动画一模一样的效果。但是无法解决手机手势右划返回上一页,导致体验会特别差。不如没有转场动画。 你发的这种根本和微信转场动画一点也不像
        Yunfly: @二哲 我说过有手势😳 是说别搞错了
        b0833e25542b:@Yunfly 别搞错重点,是即使这样做了,手势返回上一页,依旧会出现动画,导致用户体验就像bug。
        Yunfly:你觉得这种根本一点也不想,那请你把你一摸一样的贴出来供大家赞赏一下而不是在这里玩文字,谢谢。
      • thinkxzx:没有滚动条的问题?
        Yunfly:滚动条的问题倒是没出现过
      • Chris:<!-- 使用动态的 transition name -->
        <transition :name="transitionName">
        <router-view></router-view>
        </transition>
        // 接着在父组件内
        // watch $route 决定使用哪种过渡
        watch: {
        '$route' (to, from) {
        const toDepth = to.path.split('/').length
        const fromDepth = from.path.split('/').length
        this.transitionName = toDepth < fromDepth ? 'slide-right' : 'slide-left'
        }
        }
        这是vue官方的写法。。。

        还有楼主有没有试过微信右滑返回时的动效
        一个小小的蚂蚁:这个方法如果是平级的路由怎么办?路径长度都一样了。
        aa3c9fcd8f9b:你好这个api在那里找到的
        Yunfly:我留了一个手势库在github项目里,简单的右滑返回上一页有可能实现,但是要想微信那种的效果,暂时没有试过。
      • 天窗上的蚂蚁:源码呢楼主
        Yunfly:文末附上了github地址哈
      • garyhu1:有源码嘛,求楼主的源码
        Yunfly:文末附上了github地址哈

      本文标题:Vue2.0 过渡动画——仿微信左右切换效果

      本文链接:https://www.haomeiwen.com/subject/rcstqxtx.html