vue的动画组件(transition)

当插入或删除包含在 transition 组件中的元素时,Vue 将会做以下处理:

自动嗅探目标元素是否应用了 CSS 过渡或动画,如果是,在恰当的时机添加/删除 CSS 类名。

v-enter: 定义进入过渡的开始状态。在元素被插入时生效,在下一个帧移除。
v-enter-active: 定义过渡的状态。在元素整个过渡过程中作用,在元素被插入时生效,在 transition/animation 完成之后移除。 这个类可以被用来定义过渡的过程时间,延迟和曲线函数。
v-enter-to: 2.1.8版及以上 定义进入过渡的结束状态。在元素被插入一帧后生效(于此同时 v-enter 被删除),在 transition/animation 完成之后移除。
v-leave: 定义离开过渡的开始状态。在离开过渡被触发时生效,在下一个帧移除。
v-leave-active: 定义过渡的状态。在元素整个过渡过程中作用,在离开过渡被触发后立即生效,在 transition/animation 完成之后移除。 这个类可以被用来定义过渡的过程时间,延迟和曲线函数。
v-leave-to: 2.1.8版及以上 定义离开过渡的结束状态。在离开过渡被触发一帧后生效(于此同时 v-leave 被删除),在 transition/animation 完成之后移除。

配合上css的动画库,我们会有很好的效果:https://unpkg.com/[email protected]/animate.min.css"

demo01:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="../lib/vue.js"  type="text/javascript"></script>
        <link href="https://unpkg.com/[email protected]/animate.min.css" rel="stylesheet" type="text/css">
    </head>
    <body>
        <div id="app4">
            <button @click="show = !show">toggle coustom class</button>
            <transition name="bounce"
            enter-active-class="animated tada"
            leave-active-class="animated bounceOutRight">
                <p v-if="show">自定义过渡类名</p>
            </transition>
        </div>
    </body>
</html>
<script>
    new Vue({
    el:‘#app4‘,
    data:{
        show:true
    }
})
</script>

对于这些在 enter/leave 过渡中切换的类名,v- 是这些类名的前缀。使用
<transition name="my-transition" 可以重置前缀,比如 v-enter 替换为 my-transition-enter。

demo02

 <!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="../lib/vue.js"  type="text/javascript">
        </script>
        <script src="../lib/vue_router.js"></script>
        <style>
            .fade-enter-active,.fade-leave-active{
                transition: all .3s;

            }
            .fade-enter,.fade-leave-to{
                opacity:0
            }

            .style-enter-active,.style-leave-active{
                transition: all .3s;

            }
            .style-enter,.style-leave-to{
                opacity:0
            }
        </style>
    </head>
    <body>
        <div id="app">
              <h1>Hello App!</h1>
              <p>
                <!-- 使用 router-link 组件来导航. -->
                <!-- 通过传入 `to` 属性指定链接. -->
                <!-- <router-link> 默认会被渲染成一个 `<a>` 标签(默认),你也可以改变 -->
                <router-link to="/foo">Go to Foo</router-link>
                <router-link to="/bar">Go to Bar</router-link>
                <router-link to="/foo/ff">Go to foo ff</router-link>
              </p>
              <!-- 路由出口 -->
              <!-- 路由匹配到的组件将渲染在这里 -->
            <!---name="fade" fade成为类名的前缀(我们也可以进行自定义)---->
            <!--<transition name="fade" mode="out-in">
                  <keep-alive>
                        <router-view></router-view>
                  </keep-alive>
            </transition>
            -->
            <transition name="style" mode="out-in">
                <!--transition是vue的动画组件,会自动监听其中元素得状态改变,为其--->
                <router-view></router-view>
            </transition>
        </div>
    </body>
</html>
<script>
    // 1. 定义(路由)组件。
    // 可以从其他文件 import 进来
    const Foo = { template: ‘<div>foo</div>‘ }
    const Bar = { template: ‘<div>bar</div>‘ }
    const Foo_ff={template: ‘<p>foo_ff</p>‘}
    // 2. 定义路由
    // 每个路由应该映射一个组件。 其中"component" 可以是
    // 通过 Vue.extend() 创建的组件构造器,
    // 或者,只是一个组件配置对象。
    // 我们晚点再讨论嵌套路由。
    const routes = [
       { path: ‘/foo‘, component: Foo },
       { path: ‘/foo/ff‘, component: Foo_ff },
       { path: ‘/bar‘, component: Bar },
    ]

    // 3. 创建 router 实例,然后传 `routes` 配置
    // 你还可以传别的配置参数, 不过先这么简单着吧。
    const router = new VueRouter({
      routes // (缩写)相当于 routes: routes

    })

    // 4. 创建和挂载根实例。
    // 记得要通过 router 配置参数注入路由,
    // 从而让整个应用都有路由功能
    const app = new Vue({
      router
    }).$mount(‘#app‘)    

</script>

如果过渡组件提供了 JavaScript 钩子函数,这些钩子函数将在恰当的时机会被自动调用。
如果没有找到 JavaScript 钩子并且也没有检测到 CSS 过渡/动画,DOM 操作(插入/删除)在下一帧中立即执行。

v-on:before-enter="beforeEnter"
v-on:enter="enter"
v-on:after-enter="afterEnter"
v-on:enter-cancelled="enterCancelled"
v-on:before-leave="beforeLeave"
v-on:leave="leave"
v-on:after-leave="afterLeave"
v-on:leave-cancelled="leaveCancelled">

钩子函数配合velocity.js动画使用,来完成动画效果,感觉不错(并且js动画相比css动画的好处,我不知道,好像可以百度到)

https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js

http://velocityjs.org/#reverse

demo

<!--http://velocityjs.org/#reverse-->

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="../lib/vue.js"></script>
    </head>
    <body>
        <div id="app5">
            <button @click="show = !show">toggle hook</button>
            <transition @before-enter="beforeEnter"
                        @enter="enter"
                        @leave="leave"
                      :css="false">
                    <p v-if="show">javascript 钩子使用</p>
            </transition>
        </div>
    </body>
</html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js"></script>
<script >
new Vue({
    el:‘#app5‘,
    data:{
        show:false
    },
    methods:{
        beforeEnter:function (el) {
            console.log(el);
            alert("beforeEnter");
            el.style.opacity = 0
            el.style.transformOrigin = ‘left‘
        },
        enter:function (el, done) {
            alert("enter");
        //    console.log(done);
            Velocity(el, {opacity:1, fontSize:‘1.4em‘}, {duration:300});
            Velocity(el, {fontSize:‘1em‘}, {complete:done});
            Velocity(el,"reverse", { duration: 6000 });
            Velocity(el,{
                        borderBottomWidth: [ "2px", "spring" ], // Uses "spring"
                     width: [ "100px", [ 250, 15 ] ], // Uses custom spring physics
                        height: "100px" // Defaults to easeInSine, the call‘s default easing
                    }, {
                            easing: "easeInSine" // Default easing
                    });
        },
        leave:function (el, done) {
            Velocity(el, {translateX:‘15px‘, rotateZ:‘50deg‘}, {duration:600})
            Velocity(el, {rotateZ:‘100deg‘}, {loop:2})
            Velocity(el,{
                rotateZ:‘45deg‘,
                translateY:‘30px‘,
                translateX:‘30px‘,
                opacity:0
            }, {complete:done})
        }
    }
})
</script>

参考:http://www.chairis.cn/blog/article/27

时间: 2024-08-10 21:28:51

vue的动画组件(transition)的相关文章

Vue实现动画的几种方式

1. vue内置组件transition 元素出现和消失都呈现动画 <!-- 将要使用动画的内容放在transition里即可 --> <transition name="fade"> <div v-show="show"></div> </transition> .fade-enter-active, .fade-leave-active { transition: opacity .5s } .fade

Vue.js说说组件

什么是组件:组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 如何注册组件? 需要使用Vue.extend方法创建一个组件,然后使用Vue.component方法注册组件.Vue.extend方法格式如下: var MyComponent = Vue.extend({ // 选项...后面再介绍 }) 如果想要其他地方使用这个创

[原]浅谈vue过渡动画,简单易懂

在vue中什么是动画 开始先啰嗦一下,动画的解释(自我理解??) 在一个标签里面的类容,我们视觉看到它,这时候,这个标签以什么形式出现,中间变化了什么,并且以什么形式消失,是有一个过渡的存在的方式,我叫做动画 (不是那种干出,干消失哈??,大神原谅我粗糙的说辞\(^o^)/~) 闲言碎语不多讲,上干货了 在vue中,提供给我们一个很好写过渡动画的内置组件transition 基本用法就是给我们需要动画的标签外面嵌套transition标签,并且给上属性,起码name不要忘了 <transitio

vue.js之组件篇

Vue.js 组件 模块化:是从代码逻辑的角度进行划分的: 组件化:是从UI界面的角度进行划分的. 组件(Component)是 Vue.js 最强大的功能之一,组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树,如下图所示: 使用Vue.extend来创建全局vue组件: var com1 = Vue.extend({ template: '<h3>这是使用 Vue.extend 创建的组件&

手把手教你实现一个 Vue 进度条组件!

最近在个人的项目中,想对页面之间跳转的过程进行优化,想到了很多文档或 npm 等都用到的页面跳转进度条,于是便想自己去实现一个,特此记录. 来看下 npm 搜索组件时候的效果: so 下面咱们一起动手实现一下呗.  定义使用方式  想实现一个组件的前提,一定要想好你的需求是什么,还要自己去定义一个舒服的使用方法,这其中也是有原则的,对使用者来说,使用方式越简单越好.那么对应的代价就是写这个组件的复杂度会变高. 我想要的使用方式是这样的:可以在任意的地方去调用到这个方法,可以随时控制其状态.  看

Vue.js 动画

transition 动画: 当插入或删除包含在 transition 组件中的元素时,Vue将会做以下处理: 1.自动嗅探目标元素是否应用了css过滤或动画,如果是,在恰当的时机添加/删除css类名 2.如果过滤组件提供了javascript钩子函数,这些钩子函数将在恰当的时机被调用. 3.如果没有找到javascript钩子并且也没有检测到css过渡/动画,DOM操作(插入/删除)在下一帧中立即执行.(注意:此指浏览器逐帧动画机制,和Vue的 nextTick 概念不同) 1.如果需要让一个

Vue的动画封装

问题:如果在slot标签上使用v-show,程序功能是无法实现的,必须改成v-if. 原因:slot实际是一个抽象元素,有点类似template,本质并不是一个元素. 而v-show是通过控制元素的display来进行显示和隐藏的,slot本身不是元素,所以压根就不会有display这个css属性 所以,slot显示隐藏,要使用v-if. css动画在<style>中定义,js动画在@before-enter="handleBeforEnter"中定义 步骤: 1.定义一个

Vue.js路由组件vue-router如何使用?

使用 Vue.js + vue-router 创建单页应用是非常简单的,只需要配置组件和路由映射,然后告诉 vue-router 在哪里渲染即可.本文和大家分享的就是vue-router的相关使用方法,希望对大家学习Vue.js有所帮助. 一 普通方式基本例子: <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <titl

vue css动画原理

从隐藏到显现 从显现到隐藏 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Vue中的动画</title> 6 <style> 7 .fade-enter, 8 .fade-leave-to { 9 opacity: 0; 10 } 11 .fade-enter-active, 12 .fade-leave-ac