<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得

        來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:10:00
        文檔

        vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得

        vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得:實(shí)踐 這里將通過四個實(shí)踐小案例來體驗(yàn)和學(xué)習(xí)css過渡,css動畫,javascript鉤子,列表過渡的應(yīng)用。至于案例用到的知識點(diǎn)就請自行學(xué)習(xí)官網(wǎng)文檔。 1.css過渡–實(shí)踐 先來看看demo效果: 這個案例其實(shí)很簡單,通過一個transition來觸發(fā)多個子元素的過渡效果,
        推薦度:
        導(dǎo)讀vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得:實(shí)踐 這里將通過四個實(shí)踐小案例來體驗(yàn)和學(xué)習(xí)css過渡,css動畫,javascript鉤子,列表過渡的應(yīng)用。至于案例用到的知識點(diǎn)就請自行學(xué)習(xí)官網(wǎng)文檔。 1.css過渡–實(shí)踐 先來看看demo效果: 這個案例其實(shí)很簡單,通過一個transition來觸發(fā)多個子元素的過渡效果,

        實(shí)踐

        這里將通過四個實(shí)踐小案例來體驗(yàn)和學(xué)習(xí)css過渡,css動畫,javascript鉤子,列表過渡的應(yīng)用。至于案例用到的知識點(diǎn)就請自行學(xué)習(xí)官網(wǎng)文檔。

        1.css過渡–實(shí)踐

        先來看看demo效果:

        這里寫圖片描述

        這個案例其實(shí)很簡單,通過一個transition來觸發(fā)多個子元素的過渡效果,我們只需要定義元素對應(yīng)的過渡效果就可以,其他事情vue會幫我們搞定,由此可以擴(kuò)展出其他酷炫的過渡場景效果。先來看看這個簡單案例的代碼實(shí)現(xiàn):

        <template>
         <div class="app">
         <button @click="showMenu" class="btn">{{text}}</button>
         <transition name="move">
         <div class="menu" v-show="show">
         <div class="inner inner-1">1</div>
         <div class="inner inner-2">2</div>
         <div class="inner inner-3">3</div>
         </div>
         </transition>
         </div>
        </template>
        
        <script type="text/ecmascript-6">
         export default {
         data () {
         return {
         show: false
         };
         },
         methods: {
         showMenu () {
         this.show = !this.show;
         }
         },
         computed: {
         text () {
         return this.show ? '收' : '開';
         }
         }
         };
        </script>
        
        <style lang="stylus" rel="stylesheet/stylus">
         .app
         .btn
         position: fixed
         bottom: 50px
         right: 10px
         z-index: 10
         width: 50px
         height: 50px
         line-height: 50px
         border-radius: 50%
         border: none
         outline: none
         color: #fff
         font-size: 18px
         background: blue
         .menu
         position: fixed
         bottom: 50px
         right: 10px
         width: 50px
         height: 50px
         border-radius: 50%
         transition: all .7s ease-in
         &.move-enter-active
         .inner
         transform: translate3d(0, 0, 0)
         transition-timing-function: cubic-bezier(0, .57, .44, 1.97)
         .inner-1
         transition-delay: .1s
         .inner-2
         transition-delay: .2s
         .inner-3
         transition-delay: .3s
         &.move-enter, &.move-leave-active
         .inner
         transition-timing-function: ease-in-out
         .inner-1
         transform: translate3d(0, 60px, 0)
         transition-delay: .3s
         .inner-2
         transform: translate3d(40px, 40px, 0)
         transition-delay: .2s
         .inner-3
         transform: translate3d(60px, 0, 0)
         transition-delay: .1s
         .inner
         display: inline-block
         position: absolute
         width: 30px
         height: 30px
         line-height: 30px
         border-radius: 50%
         background: red
         text-align: center
         color: #fff
         transition: all .4s
         .inner-1
         top: -50px
         left: 10px
         .inner-2
         left: -30px
         top: -30px
         .inner-3
         left: -50px
         top: 10px
        </style>

        可以看到我們的代碼基本主要是完成css過渡效果的樣式,而觸發(fā)過渡效果只是簡單地通過一個click事件就搞定了,vue會自動嗅探目標(biāo)元素是否有 CSS 過渡或動畫,并在合適時添加/刪除 CSS 類名。那下一個demo就來簡單實(shí)現(xiàn)一下使用css animation 做過渡的效果。

        2.css 動畫–實(shí)踐

        先來看看demo效果:

        這里寫圖片描述

        這個案例其實(shí)跟上面的demo差不多,不同之處在于過渡效果是使用css動畫來實(shí)現(xiàn),看下實(shí)現(xiàn)的代碼:

        <template>
         <div class="app">
         <button @click="showball" class="btn">show</button>
         <transition name="move" type="animation">
         <div class="ball" v-show="show">
         <div class="inner"></div>
         </div>
         </transition>
         </div>
        </template>
        
        <script type="text/ecmascript-6">
         export default {
         data () {
         return {
         show: false
         };
         },
         methods: {
         showball () {
         this.show = !this.show;
         }
         }
         };
        </script>
        
        <style lang="stylus" rel="stylesheet/stylus">
         @keyframes shape-change {
         0%, 100% {
         border-radius: 50%
         background: red
         }
         50% {
         border-radius: 0
         background: blue
         }
         }
        
         @keyframes moveball-in {
         0% {
         transform: translate3d(300px,-200px,0)
         }
         50% {
         transform: translate3d(100px,-400px,0)
         }
         100% {
         transform: translate3d(0,0,0)
         }
         }
         @keyframes moveball-out {
         0% {
         transform: translate3d(0,0,0)
         }
         50% {
         transform: translate3d(100px,-400px,0)
         }
         100% {
         transform: translate3d(300px,-200px,0)
         }
         }
         .app
         .btn
         width: 40px
         height: 30px
         margin-top: 40px
         border: none
         outline: none
         background: red
         color: #fff
         .ball
         position: absolute
         bottom: 20px
         left: 20px
         width: 50px
         height: 50px
         transition: all 1s cubic-bezier(.22,-0.86,.97,.58)
         &.move-enter-active
         opacity: 1
         animation: moveball-in 1s
         .inner
         animation: shape-change 1s
         &.move-leave-active
         opacity: 0.8
         animation: moveball-out 1s
         .inner
         animation: shape-change 1s
         .inner
         display: inline-block
         width: 30px
         height: 30px
         border-radius: 50%
         background: red
         transition: all 1s linear
        </style>

        從css代碼可以看出,我們只是在vue過渡類名下加了不同的animation而已。官網(wǎng)文檔明確說明當(dāng)只使用transition或animation其中一種時,vue是能自動監(jiān)聽對應(yīng)的類型的,但是如果同一個元素同時使用兩種效果,就需要明確指定監(jiān)聽哪一種類型,不過官網(wǎng)并沒有給出具體的栗子。那其實(shí)這個demo已經(jīng)簡單地實(shí)現(xiàn)同時使用兩種類型的情況,可以看到有一個透明度的變化。但是假如animation里使用了transform,并且外面也使用了transform的話,那么元素在過渡的時候動畫效果就會有沖突,效果就有點(diǎn)出入了。

        3.JavaScript鉤子 – 實(shí)踐

        前兩個栗子都是有進(jìn)入和離開的過渡,但是如果一些場景只需要進(jìn)入過渡然后就結(jié)束了,那么這時就可以使用JavaScript鉤子結(jié)合CSS transitions/animations來實(shí)現(xiàn),當(dāng)然也可以單獨(dú)使用。看下demo:

        這里寫圖片描述

        這個一個非常low的模擬炮彈發(fā)射的場景,可以看到小球有拋物線軌跡運(yùn)動的過渡,而且發(fā)射出去就不會再回來了,那么這個demo就是使用了JavaScript鉤子結(jié)合css來實(shí)現(xiàn)的,接下來看下關(guān)鍵代碼:

        <template>
         <div class="app">
         <div class="gun" @click="launch($event)"></div>
         <div class="shells-wrapper">
         <transition v-for="shell in shells" name="launch-shell" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
         <div class="shell" v-show="shell.show">
         <div class="inner"></div>
         </div>
         </transition>
         </div>
         <div class="goal"></div>
        
        
         <!--小球第二種-->
         <div class="ball-container">
         <ul>
         <li v-for="(ball,index) in balls" :key="index">
         <transition :css="false" name="drop" @before-enter="beforeDrop" @enter="dropping" @after-enter="afterDrop">
         <div class="ball" v-show="ball.show">
         <div class="inner inner-hook"></div>
         </div>
         </transition>
         </li>
         </ul>
         </div>
         <!--小球 End-->
         </div>
        </template>

        首先,由于本身這個demo是一組元素的過渡,所以有些童鞋就會覺得用2.0提供的transition-group不就行了嘛。不過transition-group是列表過渡,我的理解是那一組元素是相關(guān)聯(lián)的、互相影響的,但是這個demo的元素每個都是獨(dú)立的,只不過是一組獨(dú)立的元素過渡,所以還是用transition比較合理,那使用v-for就可以實(shí)現(xiàn)一組相同過渡的元素啦。接下來看JavaScript鉤子怎么實(shí)現(xiàn)這個過渡:

        export default {
         data () {
         return {
         shells: [
         {
         show: false
         },
         {
         show: false
         },
         {
         show: false
         }
         ]
         };
         },
         methods: {
         launch (event) {
         for (let i = 0; i < this.shells.length; i++) {
         let shell = this.shells[i];
         if (!shell.show) {
         shell.show = true;
         shell.target = event.target;
         return;
         }
         }
         },
         beforeEnter (el) {
         let count = this.shells.length;
         while (count--) {
         let shell = this.shells[count];
         if (shell.show) {
         let rect = shell.target.getBoundingClientRect();
         let left = rect.left - 32;
         let top = -(window.innerHeight - rect.top - 15);
         el.style.display = '';
         el.style.webkitTransform = `translate3d(0,${top}px,0)`;
         el.style.transform = `translate3d(0,${top}px,0)`;
         let inner = el.getElementsByClassName('inner')[0];
         inner.style.webkitTransform = `translate3d(${left}px,0,0)`;
         inner.style.transform = `translate3d(${left}px,0,0)`;
         }
         }
         },
         enter (el, done) {
         /* eslint-disable no-unused-vars */
         let refresh = el.offsetHeight;
         this.$nextTick(() => {
         el.style.webkitTransform = 'translate3d(0,0,0)';
         el.style.transform = 'translate3d(0,0,0)';
         let inner = el.getElementsByClassName('inner')[0];
         inner.style.webkitTransform = 'translate3d(0,0,0)';
         inner.style.transform = 'translate3d(0,0,0)';
         });
         done();
         },
         afterEnter (el) {
         let ball = this.shells[0];
         ball.show = false;
         el.style.display = 'none';
         }
         }
         };

        css樣式代碼:

        .ball-container
         .ball
         position: absolute
         left: 32px
         bottom: 22px
         z-index: 50
         transition: all 0.4s cubic-bezier(0.49, -0.29, 0.75, 0.41)
         .inner
         width: 16px
         height: 16px
         border-radius: 50%
         background: rgb(0, 160, 220)
         transition: all 0.4s linear

        過渡元素就不需要為其添加vue的過渡css類名了,只需在元素本身添加transition即可,那vue在之前css過渡的時候會自動幫我們?nèi)ヌ砑訉?yīng)的類名來完成過渡效果,但是用javascript鉤子就需要我們自己完成這個始末狀態(tài)的設(shè)置了。當(dāng)我們點(diǎn)擊觸發(fā)一個過渡的時候,我們在beforeEnter里先拿到當(dāng)前元素的偏移位置,然后給過渡元素設(shè)置其起始位置,在enter里需要重新觸發(fā)下瀏覽器的重繪,然后在下一幀重新設(shè)置元素的結(jié)束位置,這時就會產(chǎn)生過渡效果,在過渡完成后我們將當(dāng)前元素隱藏即可。那剛才講到的列表過渡,接下來就是關(guān)于使用transition-group的一個小demo了。

        4.transition-group – 實(shí)踐

        先看下demo效果:

        這里寫圖片描述

        其實(shí)就是個簡單的todo lists的小demo,可以看到,當(dāng)其中一個元素過渡的時候,會影響其他元素的過渡。當(dāng)然,刪除按鈕其實(shí)本身也是一個transition過渡,也就是說可以在transition-group里使用transition,看下相關(guān)代碼:

        <template>
         <div class="app">
         <button @click="add" class="add-btn">+</button>
         <transition-group name="slide" tag="ul" class="list-wrapper">
         <li class="list" v-for="(item, index) in lists" v-touch:swipeleft="showBtn.bind(this, index)" v-touch:swiperight="hideBtn.bind(this, index)" :key="item">
         <span class="text">{{item.text}}</span>
         <transition name="move">
         <button class="del-btn" @click="delList(index)" v-show="item.show">刪除</button>
         </transition>
         </li>
         </transition-group>
         </div>
        </template>

        有個小坑的地方就是,之前看官網(wǎng)列表過渡的栗子,它是一個數(shù)組,元素都是數(shù)字,并且每一項(xiàng)都必須設(shè)置唯一的key值。所以我完成demo的時候就自作聰明地將索引值傳給key,結(jié)果過渡老是不對,后來換成對應(yīng)的item就正常了(生無可戀臉)。這個demo用到了vue-touch,雖然github上說不支持2.0版本了,但是有一個next分支是支持的,只需在項(xiàng)目下安裝它即可:

        sudo npm install --save git: //github.com/vuejs/vue-touch.git#next

        這里看下主要的樣式:

        .list
         display: flex
         width: 100%
         height: 40px
         line-height: 40px
         margin-bottom: 10px
         color: #666
         font-size: 14px
         background: #eee
         transition: all .4s
         &.slide-move
         transition: transform 1s
         &.slide-enter
         transform: translate3d(-100%, 0, 0)
         &.slide-leave-active
         position: absolute
         transform: translate3d(-100%, 0, 0)
         &:last-child
         margin-bottom: 0
         .del-btn
         flex: 0 0 60px
         border: none
         outline: none
         color: #fff
         background: red
         transition: all .4s
         &.move-enter, &.move-leave-active
         transform: translate3d(70px, 0, 0)
         .text
         flex: 1
         padding-left: 20px

        如果改變定位過渡的duration與進(jìn)入離開一樣的話,其實(shí)可以不用-move,這里設(shè)置-move的過渡的duration不同于元素進(jìn)入離開的duration產(chǎn)生一種速度差,看起來舒服點(diǎn)。而且-leave-active需要設(shè)置position: absolute才會有效果。現(xiàn)在看來其實(shí)列表過渡也是很容易實(shí)現(xiàn)的。

        ps:下面看下vue.js 2.* 使用transition實(shí)現(xiàn)動畫效果

        <transition name="fade">
         <div class="detail" v-show="detailShow"></div>
        </transition>
        <script type="text/ecmascript-6">
         export default {
         };
        </script>
        <style lang="stylus" ref="sheetstyle/stylus">
         .fade-enter-active, .fade-leave-active 
         opacity:1
         transition: all 1.0s 
         background:rgba(7,17,27,0.8) 
         .fade-enter, .fade-leave-active 
         opacity: 0
         background:rgba(7,17,27,0)
        </style>

        總結(jié)

        以上所述是小編給大家介紹的vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得

        vue2.0 中使用transition實(shí)現(xiàn)動畫效果使用心得:實(shí)踐 這里將通過四個實(shí)踐小案例來體驗(yàn)和學(xué)習(xí)css過渡,css動畫,javascript鉤子,列表過渡的應(yīng)用。至于案例用到的知識點(diǎn)就請自行學(xué)習(xí)官網(wǎng)文檔。 1.css過渡–實(shí)踐 先來看看demo效果: 這個案例其實(shí)很簡單,通過一個transition來觸發(fā)多個子元素的過渡效果,
        推薦度:
        標(biāo)簽: VUE 動畫 2.0
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日韩免费电影在线观看| 1000部拍拍拍18勿入免费凤凰福利| 免费网站看v片在线香蕉| 亚洲Av高清一区二区三区| 100部毛片免费全部播放完整| 中文字幕亚洲综合精品一区| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | **一级毛片免费完整视| 亚洲一区二区成人| 97碰公开在线观看免费视频| 亚洲国产精品人久久电影| a毛片基地免费全部视频| 亚洲人成色4444在线观看| 免费在线一级毛片| 狠狠躁狠狠爱免费视频无码| 亚洲AV无码码潮喷在线观看| 69视频在线是免费观看| 亚洲乱码一二三四区国产| 永久免费毛片手机版在线看| 一级毛片免费播放视频| 亚洲AV无码专区电影在线观看 | 亚洲人成网站免费播放| 久久精品亚洲日本波多野结衣| 青青青国产色视频在线观看国产亚洲欧洲国产综合| 国产av无码专区亚洲av毛片搜| 中文字幕久久亚洲一区| 99久久免费精品视频| 亚洲精品天堂无码中文字幕| 国产成人99久久亚洲综合精品| 日韩精品免费在线视频| 亚洲人成欧美中文字幕| 亚洲性猛交XXXX| 免费无码AV片在线观看软件| 午夜在线免费视频| 久久亚洲精品中文字幕| 国产乱子伦精品免费女| 999任你躁在线精品免费不卡| 亚洲av片在线观看| 亚洲国产女人aaa毛片在线| 国产无遮挡裸体免费视频| 无码AV片在线观看免费|