Vue_(組件)過渡效果


 

 

 

  Vue.js進入/離開 & 列表過渡  傳送門

 

 

  進入/離開過渡效果:Vue在插入、更新或移除DOM時,可以設置一些動畫效果;

  過渡效果中也提供了對應的鈎子函數,這些鈎子函數需要在<transition>組件上綁定,然后再實現 

  Vue中的過渡效果也可以與其他第三方CSS動畫庫一起使用,例如Animate.css

  如果是對多個元素過渡,例如列表,這時就要用到<transition-group>這個組件了

 

  Learn

    一、進入/離開過渡效果

    二、過渡效果的鈎子函數

    三、Vue過渡效果+Animate.css[Animate.css  傳送門]

    四、列表過渡

 

  目錄結構

  

  【每個demo下方都存有html源碼】

 

 

 

一、進入/離開過渡效果  傳送門

  進入/離開過渡效果:Vue在插入、更新或移除DOM時,可以設置一些動畫效果

  如何使用過渡效果:利用<transition></transition>組件將需要應用的過渡效果的DOM對象包裹住,然后書寫對應的樣式

  過渡的類名:過渡效果的樣式是類樣式,在進入/離開的過渡中有6個類樣式的切換,分別是

 

  v-enter:定義進入過渡的開始狀態;

  v-enter-active:定義進入過渡生效狀態,在這里可以定義進入過渡的時間、延遲、曲線函數等;

  v-enter-to:定義進入過渡結束狀態;

  v-leave:定義離開過渡的開始狀態;

  v-leave-active:定義離開過渡生效狀態,在這里可以定義離開過渡的時間、延遲、曲線函數等;

  v-leave-to:定義離開過渡結束狀態;

 

  通過Button給來控制動畫的進入和離開,初始值設置flag為false

        <div id="GaryId">
            <button @click="flag = !flag">顯示/隱藏</button><br />
            <!--需要添加css的div使用transition標簽-->
            <transition name='fade'>
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>

 

<style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>
style

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Gary</title>
    <script type="text/javascript"  src="../js/vue.js"></script>
    
</head>
<body>
        <div id="GaryId">
            <button @click="flag = !flag">顯示/隱藏</button><br />
            <!--需要添加css的div使用transition標簽-->
            <transition name='fade'>
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>
</body>
    
    <style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>

<script>

    let vm = new Vue({
        data:{
            flag:false
        }
    }).$mount('#GaryId');

</script>


 </html>
Gary_Transition.html

 

 

二、過渡效果的鈎子函數  傳送門

  過渡效果中也提供了對應的鈎子函數,這些鈎子函數需要在<transition>組件上綁定,然后再實現

  過渡效果的鈎子函數有:

    @before-enter=“beforeEnter“ :進入過渡運行前

    @enter=“enter“:進入過渡運行時

    @after-enter=“afterEnter“:進入過渡運行后

    @enter-cancelled=“enterCancelled“:進入過渡被打斷時

 

    @before-leave=“beforeLeave“:離開過渡運行前

    @leave=“leave“:離開過渡運行時

    @after-leave=“afterLeave“:離開過渡運行后

    @leave-cancelled=“leaveCancelled“:離開過渡被打斷時

 

  <body>中添加過渡效果的鈎子函數,transition中鈎子函數的名稱不可以修改,方法可以修改【盡量和文檔中名字一樣】

        <div id="GaryId">
        <button @click="flag = !flag">顯示/隱藏</button><br />
            <transition name='fade'
                @before-enter="beforeEnter"
                @enter="enter"
                @after-enter="afterEnter"
                @enter-cancelled="enterCancelled"
                
                @before-leave="beforeLeave"
                @leave="leave"
                @after-leave="afterLeave"
                @leave-cancelled="leaveCancelled"    
            >
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>

 

  第一次演示進入過渡狀態開始前、進入過渡狀態開始、進入過渡狀態結束、離開過渡狀態開始前、離開過渡狀態開始、離開過渡狀態結束周期

  第二次演示進入過渡狀態開始前、進入過渡狀態開始、進入過渡狀態被打斷、離開過渡狀態開始前、離開過渡狀態開始、離開過渡狀態結束周期

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Gary</title>
    <script type="text/javascript"  src="../js/vue.js"></script>
    
</head>
<body>
        <div id="GaryId">
        <button @click="flag = !flag">顯示/隱藏</button><br />
            <transition name='fade'
                @before-enter="beforeEnter"
                @enter="enter"
                @after-enter="afterEnter"
                @enter-cancelled="enterCancelled"
                
                @before-leave="beforeLeave"
                @leave="leave"
                @after-leave="afterLeave"
                @leave-cancelled="leaveCancelled"    
            >
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>

</body>
    
    <style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>

<script>

    let vm = new Vue({
        data:{
            flag:false
        },
        methods:{
            beforeEnter(){
                alert("beforeEnter  進入過渡狀態 開始 前");
            },
            enter(){
                alert("enter  進入過渡狀態 開始");
            },
            afterEnter(){
                alert("afterEnter  進入過渡狀態 結束");
            },
            enterCancelled(){
                alert("enterCancelled  進入過渡狀態 被打斷");
            },
            beforeLeave(){
                alert("beforeLeave  離開過渡狀態 開始 前");
            },
            leave(){
                alert("leave  離開過渡狀態 開始");
            },
            afterLeave(){
                alert("afterLeave  離開過渡狀態 結束");
            },
            leaveCancelled(){
                alert("leaveCancelled  離開過渡狀態 被打斷");
            }
        }
    }).$mount('#GaryId');

</script>


 </html>
Gary_Transition-02.html

 

  當需要給鈎子函數傳參貼一個例子

            enter(el){
                alert("enter  進入過渡狀態 開始");
//                添加延時
                setTimeout(()=>{
                            el.style.backgroundColor = 'green';
                },400);
            }

 

 

三、Vue過渡效果+Animate.css  傳送門

  Vue中的過渡效果也可以與其他第三方CSS動畫庫一起使用,例如Animate.css;

  使用第三方動畫庫我們需要用到自定義過渡類名:

    enter-class;

    enter-active-class;

    enter-to-class;

    leave-class;

    leave-active-class;

    leave-to-class;

 

<body>
        <div id="GaryId">
            <button @click="flag = !flag">顯示/隱藏</button><br />
            <transition name='fade'
                enter-to-class='animated zoomInDown'    
                leave-to-class='animated zoomOutUp'    
            >
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>
</body>

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Gary</title>
    <script type="text/javascript"  src="../js/vue.js"></script>
    <link rel="stylesheet" type="text/css" href="../css/animate.css"/>
</head>
<body>
        <div id="GaryId">
            <button @click="flag = !flag">顯示/隱藏</button><br />
            <transition name='fade'
                enter-to-class='animated zoomInDown'    
                leave-to-class='animated zoomOutUp'    
            >
                <div v-show='flag' class="mybtn"></div>
            </transition>
        </div>
</body>
    
    <style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>

<script>

    let vm = new Vue({
        data:{
            flag:false
        },
        methods:{
            beforeEnter(){
                alert("beforeEnter  進入過渡狀態 開始 前");
            },
            enter(el){
                alert("enter  進入過渡狀態 開始");
//                添加延時
                setTimeout(()=>{
                            el.style.backgroundColor = 'green';
                },400);
            },
            afterEnter(){
                alert("afterEnter  進入過渡狀態 結束");
            },
            enterCancelled(){
                alert("enterCancelled  進入過渡狀態 被打斷");
            },
            beforeLeave(){
                alert("beforeLeave  離開過渡狀態 開始 前");
            },
            leave(el){
                alert("leave  離開過渡狀態 開始");
                    el.style.backgroundColor = 'red';
            },
            afterLeave(){
                alert("afterLeave  離開過渡狀態 結束");
            },
            leaveCancelled(){
                alert("leaveCancelled  離開過渡狀態 被打斷");
            }
        }
    }).$mount('#GaryId');

</script>


 </html>
Gary_Transition-03.html

 

 

四、列表過渡  傳送門

  之前我們一直在操作單個元素的過渡,如果是對多個元素過渡,例如列表,這時就要用到<transition-group>這個組件了;

  如何使用:將要操作的列表元素放在<transition-group></transition-group>內,其他與<transition>基本一致;

  注意:在<transition-group>的元素要指定個唯一的 :key 屬性

  當綁定的key屬性相同時編譯器會報錯!!

  

 

 

        <div id="GaryId">
            <button @click="flag=!flag">顯示/隱藏</button><br />
            <transition-group name='fade' tag='ul'>
                <div v-show='flag' class="mybtn" :key='a'></div>
                <div v-show='flag' class="mybtn" :key='b'></div>
            </transition-group>
        </div>

 

        let vm = new Vue({
            data : {
                flag : false,
                a : '1',
                b : '2'
            },
            methods : {
            
            }
    }).$mount('#GaryId');

 

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Gary</title>
    <script type="text/javascript"  src="../js/vue.js"></script>
    
</head>
<body>
        <div id="GaryId">
            <button @click="flag=!flag">顯示/隱藏</button><br />
            <transition-group name='fade' tag='ul'>
                <div v-show='flag' class="mybtn" :key='a'></div>
                <div v-show='flag' class="mybtn" :key='b'></div>
            </transition-group>
        </div>
</body>
    
    <style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>

<script>

        let vm = new Vue({
            data : {
                flag : false,
                a : '1',
                b : '1'
            },
            methods : {
            
            }
    }).$mount('#GaryId');

</script>


 </html>
Gary_Transition-04.html

 

 

  附貼上一個小案例【不需要添加animate.css】

 

 

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Gary</title>
    <script type="text/javascript"  src="../js/vue.js"></script>
    
</head>
<body>
        <div id="GaryId">
            <button @click="addNum">添加數字</button><br />
            <transition-group name='fade' tag='ul'>
                <li v-for='(item,index) in numArray' :key='item'>
                    {{item}}
                    <button @click='removeNum(index)'> - </button>
                </li>
            </transition-group>
        </div>
</body>
    
    <style type="text/css">
        .mybtn{
            margin: 0 auto;
            width: 100px;
            height: 100px;
            background-color: red;
            /*div從左到右移動位移*/
            transform: translateX(20px);
        }
        .fade-enter-active, .fade-leave-active{
            /*進入和離開時時間為2s*/
            transition: all 2s;
        }
        .fade-enter{
            /*設置透明度為0*/
            opacity: 0;
            transform: translateX(0px);
        }
        .fade-enter-to{
            opacity: 1;
            transform: translateX(20px);
        }
        .fade-leave{
            opacity: 1;
        }
        .fade-leave-to{
            opacity: 0;
            transform: translateX(0px);
        }
        
    </style>

<script>

        let vm = new Vue({
            data : {
                flag : false,
                a : '1',
                b : '1',
                numArray : [1, 2, 3, 4, 5]
            },
            methods : {
                addNum(){
                    let num = Math.ceil(Math.random() * 100);
                    this.numArray.push(num);
                },
                removeNum(index){
                    this.numArray.splice(index, 1);
                }
            }
    }).$mount('#GaryId');

</script>


 </html>
Gary_Transition-04.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM