Vue学習小札——3.0 css遷移/アニメーション

12302 ワード

"fade">
       
"show">hello world

エレメントがtransitionに包まれると、Vueはエレメントのcssスタイルを自動的に解析し、アニメーションの流れを構築します.
表示:
アニメーションが実行される瞬間、fade-enterとfade-enter-activeの2つのclassが内部divに自動的に追加されます.アニメーションの最初のフレームの実行が終了すると、transitionというラベルは、vueがアニメーション効果であることを知っています.vueはアニメーションが2フレーム目まで実行されると、vueは前のfade-enterを削除し、fade-enter-toを追加します.アニメーションは終了するまで実行され、vueはfade-enter-activeとfade-enter-toの2つのclassを削除します.
非表示:
vueは自動的に非表示のアニメーションフローを構築し、非表示の最初の瞬間にvueは自動的にfade-leaveとfade-leave-activeの2つのクラスを生成します.2フレーム目のときにfade-leaveを削除し、fade-leave-toを追加します.最後のフレームでは、fade-leave-activeとfade-leave-toを削除します.
すべての接頭辞がfadeで始まるのはname=「fade」のためで、fadeがなければデフォルトの先頭は「v-」です.
@keyframes bounce-in {
      0% {
        transfrom: scale(0);
      }
      50% {
        transfrom: scale(1.5);
      }
      100% {
        transfrom: scale(1);
      }
    }
    .fade-enter-active {
      transform-origin: left center;
      animation: bounce-in 1s;   
    }
   
    .fade-leave-active {
       transform-origin: left center;
       animation: bounce-in 1s reverse;
    }

VueにはAnimateを用いる.cssライブラリ
1.カスタムclass形式のネーミングを使用してAnimateを使用する必要があります.css
2.classクラスにはanimatedという具体的なクラスが含まれている必要があります.そして、入場効果と出場効果によって、クラス名を2番目の位置に書く必要があります.
"fade"
        enter-active-class="animated swing"
        leave-active-class="animated shake"
        >
       
"show">hello world
 "fade"
        appear
        enter-active-class="animated swing"
        leave-active-class="animated shake"
        appear-active-class="animated swing"
        >
       
"show">hello world

appear-active-classのようにアニメーションのclassをカスタマイズするには、クラス名にappearプロパティをもう1つ書くことを覚えておいてください.上記の例では、動画の最初の表示にもanimated swingの効果があるという意味です.
vueでの遷移とアニメーションの同時使用
実はcssが提供するアニメーションの原理は@keyframesというcss 3のアニメーション効果です.
トランジション
.fade-enter {
       opacity: 0;
    }
    .fade-enter-active {
       transition: opacity 3s;
    }
    .fade-leave-to {
       opacity: 0;
    }
    .fade-leave-active {
       transition: opacity 3s;
    }
"fade"
        appear
        enter-active-class="animated swing fade-enter-active"
        leave-active-class="animated shake fade-leave-active"
        appear-active-class="animated swing"
        >
       
"show">hello world

我々が定義したfade-enter-activeとfade-leave-activeの遷移時間は3 sであるが、Animate.cssソースのanimatedアニメーション(@keyframes)は1 sです.このときtypeを設定する
 "fade"
        type="transition"
        appear
        enter-active-class="animated swing fade-enter-active"
        leave-active-class="animated shake fade-leave-active"
        appear-active-class="animated swing"
        >
       
"show">hello world

ここにはkeyframeのアニメーションとtransitionのアニメーションがあり、アニメーションの長さはtypeに設定されたアニメーションのタイプを基準としています.
アニメーションの再生時間をカスタマイズすることもできます
:duration="10000"
:duration="{enter: 5000,leave:10000}"

VueのJsアニメーションとVelocity.jsの結合
a.アニメーション表示フック
@before-enter = "handleBeforeEnter"
handleBeforeEnter: function(el) {
        //el :transition    div  
        el.style.color = "red";
       },

@enter = "handleEnter"
 handleEnter: function(el,done){
        //done    ,         ,       done    
        setTimeout(()=>{
          el.style.color = "green";
        }, 2000);
        setTimeout(()=>{
           done();
        },4000);
       },

@after-enter = "handleAfterEnter"
handleAfterEnter: function(el) {
        el.style.color = "black";
       },
     }

b.動画消去フック
@before-leave
@leave 
@after-leave
c.Velocity.js
       handleBeforeEnter: function(el) {
        el.style.opacity = 0;
       },
       handleEnter: function(el,done){
        Velocity(el, 
                 {opacity: 1}, 
                 {duration:1000,
                  complete:done});
       },
       handleAfterEnter: function(el) {
         alert("    ");
       },

Vue内の複数の要素またはコンポーネントの遷移
a.複数の要素の遷移:
Vueは、アニメーション(2つの要素を切り替えるとき)でdomをできるだけ多重化し、多重化メカニズムを解消するために、要素ごとに異なるkey値を与えます.
Vueはtransitionでmode構成パラメータも提供し、複数の要素の切り替え時の効果を設定します.
 "fade" mode="in-out">
      
"show" key="hello">hello world
"bye">bye world
.fade-enter {
       opacity: 0;
     }
     .fade-enter-active {
       transition: opacity 1s;
     }
     .fade-leave-to {
        opacity: 0;
     }
     .fade-leave-active {
        transition: opacity 1s;
     }

b.複数のコンポーネントの遷移効果:(動的コンポーネント)

  
"app"> "fade" mode="out-in"> "type">
Vue.component(<span class="hljs-string">'child'</span>,{ template: <span class="hljs-string">'<div>child</div>'</span> }); Vue.component(<span class="hljs-string">'child-one'</span>,{ template: <span class="hljs-string">'<div>child-one</div>'</span> }); var vm = new Vue({ el: <span class="hljs-string">"#app"</span>, data: { <span class="hljs-built_in">type</span>: <span class="hljs-string">'child'</span> }, methods: { handleClick: <span class="hljs-function"><span class="hljs-title">function</span></span>() { this.type = (this.type===<span class="hljs-string">'child'</span>) ? <span class="hljs-string">'child-one'</span> : <span class="hljs-string">'child'</span>; } } });

Vueのリスト遷移transition-group


  
"app">
"(item,index) of list" key="item.id"> {{item.title}}----{{item.id}}
var count = 0; var vm = new Vue({ el: <span class="hljs-string">"#app"</span>, data: { list: [] }, methods: { handleClick: <span class="hljs-function"><span class="hljs-title">function</span></span>() { this.list.push({ id: count++ , title: <span class="hljs-string">'hello wrold'</span> }); } } });

Vueのアニメーションパッケージ

  
"app"> "show">
hello world
"show">

bye world

Vue.component(<span class="hljs-string">'fade'</span>,{ props:[<span class="hljs-string">'show'</span>], template: ` <transition @before-enter=<span class="hljs-string">"handleBeforeEnter"</span> @enter=<span class="hljs-string">"handleEnter"</span> @after-enter=<span class="hljs-string">"handleAfterEnter"</span>> <slot v-if=<span class="hljs-string">"show"</span>></slot> </transition> `, methods: { handleBeforeEnter: <span class="hljs-keyword">function</span>(el) { el.style.color = <span class="hljs-string">'red'</span>; }, handleEnter: <span class="hljs-keyword">function</span>(el,<span class="hljs-keyword">done</span>) { <span class="hljs-built_in">set</span>Timeout(()=>{ el.style.color = <span class="hljs-string">'blue'</span>; }, 2000); <span class="hljs-built_in">set</span>Timeout(()=>{ <span class="hljs-keyword">done</span>(); }, 5000); }, handleAfterEnter: <span class="hljs-keyword">function</span>(el) { el.style.color = <span class="hljs-string">'black'</span>; } } }); var vm = new Vue({ el: <span class="hljs-string">"#app"</span>, data: { show:<span class="hljs-literal">true</span> }, methods: { handleClick: <span class="hljs-function"><span class="hljs-title">function</span></span>() { this.show = !this.show; } } });