vue 實現頁面左右切換效果踩坑

提示:此坑在css中

實現效果:全局app不實現頁面左右切換動畫。只有某個板塊進入以後實現該效果

問題重現: 進入板塊以後首次進入會出現兩個頁面打攪的現象

代碼如下:

由於只是某一模塊採用動畫。所以採用了嵌套路由方式 :以下home ,question,submit都位於answer這個路由之下,

answer頁面承接了一個router-view容器

-------------------------------路由---------------------------------

  {

        path: '/answer', 

        name: 'answer',

        redirect:"/answer/home",

        component: ()=>import('../views/Answer/answer.vue'),

        children:[

          {

            path: 'home', //分類

            name: 'home',

            component: ()=>import('../views/Answer/home.vue'),

          },

          {

            path: 'question', //分類

            name: 'question',

            component: ()=>import('../views/Answer/question.vue'),

          },

          {

            path: 'submit', //分類

            name: 'submit',

            component: ()=>import('../views/Answer/submit.vue'),

          }  

        ]

      },

 

answer頁面:

-----------------------------------------html-------------------

        <transition :name="direction" >

            <router-view  class='Router' ></router-view>

        </transition>

------------------------------------------js--------------------

export default {

    name:'answer',

    components:{},

    computed: {

        direction() {

        const viewDir = this.$store.state.direction;

        let tranName = "";

        if (viewDir === "left") {

            tranName = "slide-left";

        } else if (viewDir === "right") {

            tranName = "slide-right";

        }

        return tranName;

        }

    },

------------------css-------------------

.slide-left-enter,

.slide-right-leave-active {

  opacity: 0;

  -webkit-transform: translateX(100%, 0);

  transform: translate(100%, 0);

}

.slide-left-leave-active,

.slide-right-enter {

  opacity: 0;

  -webkit-transform: translate(-100%, 0);

  transform: translate(-100%, 0);

}

全局vuex:

import Vue from "vue"

import Vuex from "vuex"

Vue.use(Vuex)

const store=new Vuex.Store({

    state:{

        direction:"right"

    },

    mutations:{

        setAnimationDirection(state,payload){

            state.direction=payload

        }

    }

})

export default store

 

-------------------全局路由守衛----------------------

const router = new Router({

    routes

})

let arr = routes.filter(item=>item.name =='answer')

console.log("arr.children:",arr)

let list=[]

list=arr[0].children.map(item=>item.name)

router.beforeEach((to,from,next)=>{

  console.log("this.$store.state.direction:",store.state)

 

   //處理全局頁面切換動畫

   let toName = to.name

   let fromName = from.name

   let toIndex = list.indexOf(toName)

   let fromIndex = list.indexOf(fromName)

   let direction = 'left'

   if (toIndex > -1 && fromIndex > -1) {

     if (toIndex < fromIndex) {

       direction = 'right'

     } else {

       direction = 'left'

     }

   } 

  store.commit('setAnimationDirection', direction)

   next()

})

 

export default router

如果代碼寫到這裏。就會最開始提到的問題。首次進入的時候。會出現兩個頁面打攪。前一個頁面先出現一部分然後頂上去,然後再消失最後下一個頁面出來的詭異現象。

解決辦法:

修改answer.vue下的css

.Router {

  width: 100%;

  position:relative //給router-view容器添加一個相對定位

}

.slide-right-enter-active,

   .slide-right-leave-active,

   .slide-left-enter-active,

   .slide-left-leave-active {

     will-change: transform;

     transition: all 0.5s cubic-bezier(0.55, 0, 0.1, 1);

    position: absolute; //給子頁面添加一個絕對定位

  }

  .slide-right-enter {

    opacity: 0;

    transform: translate3d(-100%, 0, 0);

  }

  .slide-right-leave-active {

    opacity: 0;

    transform: translate3d(100%, 0, 0);

  }

  .slide-left-enter {

    opacity: 0;

    transform: translate3d(100%, 0, 0);

  }

  .slide-left-leave-active {

    opacity: 0;

    transform: translate3d(-100%, 0, 0);

  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章