美文网首页
vue v-show过渡动画即display:none/bloc

vue v-show过渡动画即display:none/bloc

作者: 折叠幸福 | 来源:发表于2019-03-22 18:56 被阅读0次

    需求:
    一个div,v-show绑定的值为true时一个动画,为false时又一个动画
    以放大缩小动画为例

    遇到的问题:
    v-show的本质是改变display的值,display的值改变会引起HTML画布的重绘,会导致动画只能完成一半,要么放大不能缩小,要么缩小不能放大.

    解决思路
    不采用display的方式改为绝对定位+visibility
    即v-show改为切换div的class名
    这个div有三个class可选,但某一状态只展示一个class,一个不带动画的初始class,观察变量为true时的class,为false时的class

    第一步
    class绑定到data的对象上

    <div :class="s_obj"></div>
    
    data:{
      x:false, //动画状态变量
      s_obj:{
            init_class:true,
            show_in:false,
            show_out:false
          }
    }
    

    第二步
    这步参考display时候的写法就好
    比如当X为true的时候,需要放大

    .show_in{
        animation: go_in 1s;
        opacity: 1;
        visibility: visible;
        z-index: 20;
        position: absolute;
        width:100px;
        height:100px;
    }
     @keyframes go_in
      {
         0% {opacity: 0; transform: scale(0);}
         100%{opacity: 1; transform: scale(1);}
    
      }
    

    同理,当X为false时候需要缩小

    .show_out{
        animation: go_out 1s;
        opacity: 0;
        visibility: hidden;
        z-index: 0;
        position: absolute;
        width:100px;
        height:100px;
    }
    @keyframes go_out
      {
         0% {opacity: 1; transform: scale(1);visibility: visible;}
         100%{opacity: 0; transform: scale(0);}
    
      }
    

    第三步
    如果这时候写根据X的值修改class的类名会有一个问题,比如刚进入页面,X为false,则div为

    <div class="show_out"></div>
    

    进入页面会有一个缩小的动画,这时候需要给div一个不带动画的初始class,除了没有动画其他值和shou_out一样

    .inint_class{
        opacity: 0;
        visibility: hidden;
        z-index: 0;
        position: absolute;
        width:100px;
        height:100px;
    }
    

    第四步
    经过第三步div的初始class为init_class,这个时候我们需要watch变量X,当X为真时class为show_in,为假时calss为show_out即可

    watch:{
    X(){if(this.show_demo){
               this.s_obj = {
                  init_class:false,
                  show_in:true,
                  show_out:false
               }
               else{
                  this.s_obj = {
                      init_class:false,
                      show_in:false,
                      show_out:true
                  }
               }
    }
    }
    

    至此,过渡动画特效完成!也可以用定时器的方式,本质差不多

    相关文章

      网友评论

          本文标题:vue v-show过渡动画即display:none/bloc

          本文链接:https://www.haomeiwen.com/subject/ehorvqtx.html