在Vue.js中,transition 是一种内置组件,可以用来添加进入/离开的过渡效果给元素或组件。
transition 包裹你要动画化的元素,然后你可以定义进入和离开的动画状态。
当你使用 <transition> 组件时,你需要提供一个动画名字。这个名字将用于定义CSS类名,以便你可以对动画进行样式化。<transition name="fade"> <!-- 需要动画效果的元素 --> </transition>
需要注意的是需要动画效果的元素必须是下列一种:
条件渲染 (使用 v-if)条件展示 (使用 v-show)动态组件组件根节点
在这里fade是我们自定义的动画名称。然后在CSS中,你可以定义对应的样式:
你要的名字-enter 进入前效果 你要的名字-enter-active 进入的过渡时间和函数 你要的名字-enter-to 进入后效果 你要的名字-leave 离开前效果 你要的名字-leave-active 离开的过渡时间和函数 你要的名字-leave-to 离开后效果例如:
.fade-enter-active, .fade-leave-active { transition: opacity 0.5s; } .fade-enter, .fade-leave-to /* 2.1.8版本及以后 */ { opacity: 0; }
在上面的例子中,.fade-enter-active 和 .fade-leave-active 类定义了元素在进入或者离开时的过渡动画。
.fade-enter 和 .fade-leave-to 类定义了进入和离开状态的起点和终点样式。
当你切换具有相同标签名的元素时,你需要使用 key 属性来给每个元素一个独一无二的标记。
这是因为 Vue 会尝试尽可能高效地重新使用元素,如果没有独特的 key 区分开来,Vue 只会替换元素的内容而不是过渡整个元素。
这里是一个错误的使用示例,没有使用 key 属性:<transition name="fade"> <div v-if="show"> <div class="item-box"></div> </div> <div v-else> <span>暂无更多</span> </div> </transition>若要解决这个问题,应该这样做:
<transition name="fade"> <div v-if="show" key="box1"> <div class="item-box"></div> </div> <div v-else key="box2"> <span>暂无更多</span> </div> </transition>
在加入了 key 属性后,Vue 就能够正确地处理这些不同的元素,并给它们添加动画效果。
完整示例代码:
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue@2.6.1-dev.js"></script> <style> .fade-enter-active, .fade-leave-active { transition: opacity .5s; } .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ { opacity: 0; } </style> </head> <body> <div id="app"> <div @click="fin">点击</div> <transition name="fade"> <div v-show="finished" class="question-over"> <p>您的成绩:1分</p> <p>您答对了:1题</p> <p>耗时:0</p> </div> </transition> </div> <script> var intval=null; var app = new Vue({ el: '#app', data: { finished:false, }, methods: { fin() { this.finished=true; }, }, mounted() { } }) </script> </body> </html>
网友回复