Vue实现移动端页面切换效果
找了好多博客实现效果都……emmm…… 应用Vue自带的过渡 《??》和 嵌套路由 和 fixed定位实现 其实还是挺简单的。 在子页面把整个页面做绝对定位,覆盖整个屏幕,子父页面将??用??套起来,并加上过渡动画就可以啦。 代码:
Document
下一层
第一层
<span style="color: #0000ff;">< <span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue/dist/vue.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">><span style="color: #0000ff;"><<span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue-router/dist/vue-router.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">script<span style="color: #0000ff;">><span style="background-color: #f5f5f5; color: #000000;"> const Foo <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> { template: </span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">div class</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">whole-page two</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">link to</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/foo/bar</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">下一层</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-link></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">link to</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">返回</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-link></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">h1</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">第二层</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">h1></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">transition</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">view</span><span style="background-color: #f5f5f5; color: #000000;">><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-view></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">transition></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">div></span> <span style="background-color: #f5f5f5; color: #000000;"> } const Bar <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> { template: </span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">div class</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">whole-page three</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">link to</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/foo</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">返回</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-link></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">h1</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">第三层</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">h1></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">transition</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">view</span><span style="background-color: #f5f5f5; color: #000000;">><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-view></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">transition></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">div></span> <span style="background-color: #f5f5f5; color: #000000;"> } const routes <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> [ { path: <span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">/foo<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">,component: Foo,children: [ { path: <span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">bar<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">,component: Bar } ] } ] const router <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> VueRouter({ routes }) const app <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> Vue({ router }).$mount(<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">#app<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">) <span style="color: #0000ff;"></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">> 效果: 有一个问题需要注意一下, 我们知道,在应用transform属性的时候,fixed定位会变成absolute。 这里,页面转换的时候,就变成了相对translation定位。所以如果子页面中有绝对定位的话,移动的过程中页面会变形。 简单举个栗子,
Document
我是一个标题
下一层
第一层
<span style="color: #0000ff;">< <span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue/dist/vue.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">><span style="color: #0000ff;"><<span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue-router/dist/vue-router.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">script<span style="color: #0000ff;">><span style="background-color: #f5f5f5; color: #000000;"> const Foo <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> { template: </span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">div class</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">whole-page two</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">link to</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">返回</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-link></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">header</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">我也是一个标题</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">header></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">h1</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">第二层</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">h1></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">transition</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">view</span><span style="background-color: #f5f5f5; color: #000000;">><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-view></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">transition></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">div></span> <span style="background-color: #f5f5f5; color: #000000;"> } const routes <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> [ { path: <span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">/foo<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">,component: Foo } ] const router <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> VueRouter({ routes }) const app <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> Vue({ router }).$mount(<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">#app<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">) <span style="color: #0000ff;"></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">> 看下效果: OKOK,反正就是这种bug嘛。 解决办法就是,就是,尽量让页面fixed定位都是0 0 0 0,然后偏移用padding实现。 大概吧……反正我是这么解决的…… 比如上面那个可以把CSS改成这样解决问题。 {:;:; }{:;:; }{:; }{:;:;}{:;:;:;:;:;:;:; }{:; }{:; }{:;:;:;:;:;:;:;:;:; }{:;:; }
嗯嗯 还有一个问题,还有个滑动穿透的问题,(真开心! 这么多问题! 我再举个栗子,
下一层
第一层<第一层<第一层<第一层<第一层
第一层<第一层<第一层<第一层<第一层
第一层<第一层<第一层<第一层<第一层
<span style="color: #0000ff;">< <span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue/dist/vue.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">><span style="color: #0000ff;"><<span style="color: #800000;">script <span style="color: #ff0000;">src<span style="color: #0000ff;">="https://unpkg.com/vue-router/dist/vue-router.js"<span style="color: #0000ff;">></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"><<span style="color: #800000;">script<span style="color: #0000ff;">><span style="background-color: #f5f5f5; color: #000000;"> const Foo <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> { template: </span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">div class</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">whole-page two</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">link to</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">返回</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-link></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">h1</span><span style="background-color: #f5f5f5; color: #000000;">></span><span style="background-color: #f5f5f5; color: #000000;">第二层</span><span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">h1></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">transition</span><span style="background-color: #f5f5f5; color: #000000;">></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">router</span><span style="background-color: #f5f5f5; color: #000000;">-</span><span style="background-color: #f5f5f5; color: #000000;">view</span><span style="background-color: #f5f5f5; color: #000000;">><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">router-view></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">transition></span> <span style="background-color: #f5f5f5; color: #000000;"><</span><span style="background-color: #f5f5f5; color: #000000;">/</span><span style="background-color: #f5f5f5; color: #000000;">div></span> <span style="background-color: #f5f5f5; color: #000000;"> } const routes <span style="background-color: #f5f5f5; color: #000000;">=<span style="background-color: #f5f5f5; color: #000000;"> [ { path: <span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">/foo<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">,component: Foo } ] const router <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> VueRouter({ routes }) const app <span style="background-color: #f5f5f5; color: #000000;">= <span style="background-color: #f5f5f5; color: #0000ff;">new<span style="background-color: #f5f5f5; color: #000000;"> Vue({ router }).$mount(<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">#app<span style="background-color: #f5f5f5; color: #000000;">'<span style="background-color: #f5f5f5; color: #000000;">) <span style="color: #0000ff;"></<span style="color: #800000;">script<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">> <span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">> 看效果,第二页的高度明明就是视窗的高度,但是它有一个滚动条,实际上那是第一个页面的滚动条。 网上找了好多方法,一一试了,全部不生效。(当然很有可能是我的方法不对。 最后没办法只有找最笨的方法啦,就是通过??? 把父页面不显示就好了。 当然不能直接不显示,因为动画还没结束父元素就空白了呀!setTimeout 就好了…… 具体代码就不写了,这个应该很容易理解。 还有什么问题,等我想起来在补充。或者还有什么没注意到的问题,欢迎路过的大佬们提出呀,反正我也解决不了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |