欢迎来到小懒的博客~email:568705236@qq.com

vue条件渲染v-if无法触发CSS动画

2020/10/12 10:49:52站长

    为了网站的美观性,给网站部分元素加入CSS3动画,然后在用户根据情景切换显示内容时让网站变得活泼。

<template>
    <img v-if="doshow" src="https://file.iviewui.com/dist/7dcf5af41fac2e4728549fa7e73d61c5.svg" class="ani"  alt="pic1" />
  <img v-else src="https://file.iviewui.com/dist/d6fcbeecd3f5ff1b1dd0a0f68bdf6ce7.svg" class="ani"  alt="pic2" />
  <Switch size="large"  v-model="doshow">
        <span slot="open">第一</span>
        <span slot="close">第二</span>
    </Switch>
</template>
<style>
  @keyframes layui-scale{
    0%{
         opacity: .3;
    transform: scale(.5);
    }
    100%{
      opacity: 1;
    transform: scale(1);
    }
  }
  .ani{
    animation-name: layui-scale;
    animation-duration: .3s;
    animation-fill-mode: both;
    width:300px;
    height:300px;
    background-color:#ddd;
  }
</style>
<script>
    export default {
        data () {
            return {
                doshow:true
            }
        }
    }
</script>

    比如上面这个例子,图片设置了入场从小变大的动画,希望在切换时也触发动画。但实际除了页面加载的,切换时动画并没有生效。

20201012.gif

    在vue的官方文档https://cn.vuejs.org/v2/guide/conditional.html中写到了用key管理可复用元素。“Vue 会尽可能高效地渲染元素,通常会复用已有元素而不是从头开始渲染。”原因就是img标签被复用了,并不是想象中的移除图1的img标签再添加图2的img标签,切换时只是更改了src的值。

20201012_1.gif

    img标签没有移除再添加,因此CSS3动画没有执行。所以按vue官方文档说的那样,对元素添加key来表达“这两个元素是完全独立的,不要复用它们”。当然了使用v-show的话是没有这样的问题,因为v-show是一开始就添加了标签,只是隐藏了,那是两个不同的标签。我也测试过,表单元素如果绑定不同的v-model,是会被认为是两个独立的元素。按照文档说的加上在img标签上分别加上key="1"、key="2"的属性,代码的改变不多,我就不再贴代码了。添加后就达到想要的效果。

20201012_2.gif


赞赏