Vue 中 CSS 动画原理

栏目: CSS · 发布时间: 6年前

内容简介:下面这段代码,是点击按钮实现此时有一个需求,希望是在显示与隐藏时,能实现渐隐渐现的动画效果。如果希望

下面这段代码,是点击按钮实现 hello world 显示与隐藏

<div id="root">
    <div v-if="show">hello world</div>
    <button @click="handleClick">按钮</button>
</div>
let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick(){
            this.show = !this.show
        }
    }
})

此时有一个需求,希望是在显示与隐藏时,能实现渐隐渐现的动画效果。

<div id="root">
    <transition name="fade">
        <div v-if="show">hello world</div>
    </transition>
    <button @click="handleClick">按钮</button>
</div>
let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick(){
            this.show = !this.show
        }
    }
})

如果希望 hello world 有一个动画效果的话,需要在外面套一层 transition 标签,意思它包裹的内容,有一个动画效果,可以给它一个名字 name="fade"

enter

当一个元素被 transition 标签包裹之后,Vue 会自动的分析元素的 css 样式,然后构建动画流程

Vue 中 CSS 动画原理

在动画还没有执行的一瞬间,Vue 会帮我们在 dom 标签上添加两个 class ,分别是 fade-enterfade-enter-active

当动画第一帧执行结束之后, transition 这个标签分析过,里面有一个动画效果,Vue 会在动画运行到第二帧的时候,会将 dom 标签上 v-enterclass 删除,再添加一个 v-enter-toclass

接着动画会继续执行,执行到结束的一瞬间,Vue 会干一件事,它会把之前添加的 v-enter-tov-enter-active 都删除,

.fade-enter{
    opacity: 0;
}
.fade-enter-active{
    transition: opacity 3s;
}
<div id="root">
    <transition name="fade">
        <div v-if="show">hello world</div>
    </transition>
    <button @click="handleClick">按钮</button>
</div>
let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick(){
            this.show = !this.show
        }
    }
})

我们只需要在 css 中给 fade-enterfade-enter-active 分别写上样式就行了。这里要注意的是 Vue 中默认以 v 开头,如: v-entertransition 加个 name 属性,就可以用 name 属性值做开头,如: fade-enter

现在这里两个 class 的意思是:

动画还没执行时,就已经有 fade-enterfade-enter-active ,动画第一帧运行时 fade-enter 就会被移除, css 效果 opacity: 0 就会变成 opacity: 1 ,直到动画执行完 fade-enter-active 才会被移除,这期间它用 transitionopacity 进行监控,需要 3s 才能完成。

Vue 中 CSS 动画原理

leave

隐藏的动画流程:

隐藏的第一个瞬间时,Vue 会在 dom 上添加两个 class ,分别是 v-leavev-leave-active

运行到第二帧时,Vue 会将 v-leave 移除,再添加一个 v-leave-to

接着动画会继续执行,执行到结束的一瞬间,Vue 会把之前添加的 v-leave-tov-leave-active 都删除。

.fade-leave-to{
    opacity: 0;
}
.fade-leave-active{
    transition: opacity 3s;
}
<div id="root">
    <transition name="fade">
        <div v-if="show">hello world</div>
    </transition>
    <button @click="handleClick">按钮</button>
</div>
let vm = new Vue({
    el: '#root',
    data: {
        show:true
    },
    methods: {
        handleClick(){
            this.show = !this.show
        }
    }
})

为什么加了这两个 css 动画效果就出来了呢?

从动画执行的第一个瞬间,到动画执行完毕, fade-leave-active 这个 class 都存在。也就是在动画运行过程中,我要时刻监听 divopacity ,一旦 opacity 发生变化,我要让让他在 3s 内执行完毕。

在第一个瞬间 fade-leaveopacity1 ,就是显示状态;第二个瞬间 opacity0 了,此时要给它添加一个 fade-leave-toclass ,而 fade-leave-active 一直在监听 opacity 的变化,一旦 opacity 发生变化,会让它在 3s 内完成

总结

transition 标签中中不光 v-if 能控制显示隐藏, v-show 也能控制显示隐藏,甚至动态组件也行。只要在 transition 中标签中动画发生变化,都会有一个过渡效果


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

網絡社會之崛起

網絡社會之崛起

曼威·柯司特 / 夏鑄九、王志弘 等 / 唐山 / 2000-11 / NT$550

本書解釋了今日重塑世界的兩股強大但相互衝突的潮流:全球化與認同。資訊科技的革命以及資本主義的再結構已經引動了網絡社會,並帶來了策略,除經濟行為的全球化、工作的彈性化與不穩定,以及真實的虛擬文化。但是,伴隨著資本主義的轉化與國家主義的消亡而來的,是集體認同的表達以火力十足的方式竄起。它們挑戰了全球化中的文化單一性以及對於生活、環境的控制。曼威.柯司特在本書中描繪了社會運動的根源、目標以及效果,包括了......一起来看看 《網絡社會之崛起》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试