Vue 中 CSS 动画原理

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

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

下面这段代码,是点击按钮实现 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 中标签中动画发生变化,都会有一个过渡效果


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

查看所有标签

猜你喜欢:

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

Web Analytics

Web Analytics

Avinash Kaushik / Sybex / 2007-6-5 / USD 29.99

在线阅读本书 Written by an in-the-trenches practitioner, this step-by-step guide shows you how to implement a successful Web analytics strategy. Web analytics expert Avinash Kaushik, in his thought-p......一起来看看 《Web Analytics》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具