18-过渡动画

6/3/2022

# 1, Vue中的动画

# 1.1, Vue中的动画介绍

Vue中为我们提供一些内置组件和对应的API来完成动画,利用它们我们可以方便的实现过渡动画效果

  • 没有动画的情况下,整个内容的显示和隐藏会非常的生硬
  • 如果我们希望给单元素或者组件实现过渡动画,可以使用 transition 内置组件来完成动画

# 1.2, Vue的transition动画

Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡

  • 条件渲染 (使用 v-if)条件展示 (使用 v-show)
  • 动态组件
  • 组件根节点

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

  • 自动嗅探目标元素是否应用了CSS过渡或者动画,如果有,那么在恰当的时机添加/删除 CSS类名
  • 如果 transition 组件提供了JavaScript钩子函数,这些钩子函数将在恰当的时机被调用
  • 如果没有找到JavaScript钩子并且也没有检测到CSS过渡/动画,DOM插入、删除操作将会立即执行

过渡动画class(Vue就是帮助我们在这些class之间来回切换完成的动画)

  • v-enter-from:定义进入过渡的开始状态
    • 在元素被插入之前生效,在元素被插入之后的下一帧移除。
  • v-enter-active:定义进入过渡生效时的状态,
    • 在整个进入过渡的阶段中应用,在元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线 函数
  • v-enter-to:定义进入过渡的结束状态
    • 在元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡/动画完成之后移除
  • v-leave-from:定义离开过渡的开始状态
    • 在离开过渡被触发时立刻生效,下一帧被移除
  • v-leave-active:定义离开过渡生效时的状态
    • 在整个离开过渡的阶段中应用,在离开过渡被触发时立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟 和曲线函数
  • v-leave-to:离开过渡的结束状态
    • 在离开过渡被触发之后下一帧生效 (与此同时 v-leave-from 被删除),在过渡/动画完成之后移除

class的name命名规则如下

  • 如果我们使用的是一个没有name的transition,那么所有的class是以 v- 作为默认前缀
  • 如果我们添加了一个name属性,比如 ,那么所有的class会以 wc- 开头
// App.vue
<template>
  <div>
    <button @click="show = !show">点击我切换显示与隐藏</button>
    <!-- transiton:组件,全局组件。可以在任意组件内直接使用-->
    <!-- name属性值:如果页面中有多个多度动画需求,区分样式类名。 如果没有书写name,默认类名v-xxx开头,
       如果有name属性值,类名就以name属性值开头使用。这样可以去多个过渡动画效果!!!
     -->
    <transition name="jch">
      <div class="box" v-show="show">
        <h3>我是H3标题</h3>
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  name: "",
  data() {
    return {
      show: false,
    };
  },
};
</script>

<!-- 在style标签身上加上一个lang=less属性,代表style里面书写的less样式 -->
<!-- 进入阶段的过渡动画 -->
<style scoped lang="less">
@color: cyan;
@f: red;
.box {
  width: 400px;
  height: 200px;
  background: @color;
  h3 {
    color: @f;
  }
}
/* 进入阶段的过渡动画*/
/*进入开始阶段*/
.jch-enter {
  opacity: 0;
  transform: rotate(0deg);
}

/* 定义进入阶段过渡动画时间、速率类名地方*/
.jch-enter-active {
  /*定义过渡动画时间、速率等等*/
  transition: all 5s;
}

/*进入结束阶段*/
.jch-enter-to {
  opacity: 1;
  transform: rotate(360deg);
}

/*定义离开阶段的过渡动画*/
/*
  离开阶段的开始状态
*/
.jch-leave {
  opacity: 1;
  transform: scale(1);
}

/* 定义离开阶段过渡动画时间、速率类名地方*/
.jch-leave-active {
  transition: all 3s;
}
/*离开阶段的结束状态*/
.jch-leave-to {
  opacity: 0;
  transform: scale(0);
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78

过渡动画遮罩层

// components/ElDialog.vue
<template>
  <div>
    <transition>
      <div class="mask" v-show="visible"></div>
    </transition>
  </div>
</template>

<script>
export default {
  name: "",
  props: ["visible"],
};
</script>

<style scoped>
.mask {
  position: fixed;
  left: 20%;
  top: 20%;
  right: 20%;
  bottom: 20%;
  background: rgba(0, 0, 0, 0.5);
  z-index: 1000;
}

.v-enter {
  transform: scale(0);
}

.v-enter-active {
  transition: all 2s;
}

.v-enter-to {
  transform: scale(1);
}

.v-leave{
 transform: scale(1);
 border-radius: 0px;
}
.v-leave-active{
  transition: all 2s;
}
.v-leave-to{
 transform: scale(0);
 border-radius:50%;
}
</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// App.vue
<template>
  <div>
       <button @click="visible=!visible">我是按钮需要遮罩层组件</button>
       <ElDialog :visible="visible"></ElDialog>
  </div>
</template>

<script>
import ElDialog from '@/components/ElDialog'
export default {
  name: '',
  data() {
    return {
      visible:false
    }
  },
  components:{
    ElDialog
  }
}
</script>

<style scoped>

</style>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Last Updated: 12/25/2022, 10:02:14 PM