<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          vue2.0 transition -- demo實踐填坑

          共 7796字,需瀏覽 16分鐘

           ·

          2021-01-15 08:52

          來源 | https://www.cnblogs.com/jr1993/p/vue.html


          前言

          vue1.0版本和2.0版本的過渡系統(tǒng)改變還是蠻徹底的,具體請自行詳看文檔介紹:https://vuefe.cn/v2/guide/migration.html#過渡。
          在使用2.0版本做過渡效果的時候,雖然比1.0版本強大很多,但是實踐過程中還是踩了一些不應(yīng)該踩但是還是踩了的坑。
          雖然官網(wǎng)文檔已經(jīng)很詳細(xì)地介紹了各種應(yīng)用場景,但是這里還是通過幾個小demo案例來感受下vue2.0 transition 帶來的便利吧!

          實踐

          這里將通過四個實踐小案例來體驗和學(xué)習(xí)css過渡,css動畫,javascript鉤子,列表過渡的應(yīng)用。至于案例用到的知識點就請自行學(xué)習(xí)官網(wǎng)文檔。
          css過渡--實踐
          先來看看demo效果:
          這個案例其實很簡單,通過一個transition來觸發(fā)多個子元素的過渡效果,我們只需要定義元素對應(yīng)的過渡效果就可以,其他事情vue會幫我們搞定,由此可以擴展出其他酷炫的過渡場景效果。
          先來看看這個簡單案例的代碼實現(xiàn):


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

          css 動畫--實踐
          先來看看demo效果:

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



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

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

          首先,由于本身這個demo是一組元素的過渡,所以有些童鞋就會覺得用2.0提供的transition-group不就行了嘛。

          不過transition-group是列表過渡,我的理解是那一組元素是相關(guān)聯(lián)的、互相影響的,但是這個demo的元素每個都是獨立的,只不過是一組獨立的元素過渡,所以還是用transition比較合理,那使用v-for就可以實現(xiàn)一組相同過渡的元素啦。接下來看JavaScript鉤子怎么實現(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';      }    }  };

          過渡元素就不需要為其添加vue的過渡css類名了,只需在元素本身添加transition即可,那vue在之前css過渡的時候會自動幫我們?nèi)ヌ砑訉?yīng)的類名來完成過渡效果,但是用javascript鉤子就需要我們自己完成這個始末狀態(tài)的設(shè)置了。

          當(dāng)我們點擊觸發(fā)一個過渡的時候,我們在beforeEnter里先拿到當(dāng)前元素的偏移位置,然后給過渡元素設(shè)置其起始位置,在enter里需要重新觸發(fā)下瀏覽器的重繪,然后在下一幀重新設(shè)置元素的結(jié)束位置,這時就會產(chǎn)生過渡效果,在過渡完成后我們將當(dāng)前元素隱藏即可。

          那剛才講到的列表過渡,接下來就是關(guān)于使用transition-group的一個小demo了。

          transition-group -- 實踐
          先看下demo效果:

          其實就是個簡單的todo lists的小demo,可以看到,當(dāng)其中一個元素過渡的時候,會影響其他元素的過渡。

          當(dāng)然,刪除按鈕其實本身也是一個transition過渡,也就是說可以在transition-group里使用transition,看下相關(guān)代碼:

          有個小坑的地方就是,之前看官網(wǎng)列表過渡的栗子,它是一個數(shù)組,元素都是數(shù)字,并且每一項都必須設(shè)置唯一的key值。

          所以我完成demo的時候就自作聰明地將索引值傳給key,結(jié)果過渡老是不對,后來換成對應(yīng)的item就正常了(生無可戀臉)。

          這個demo用到了vue-touch,雖然github上說不支持2.0版本了,但是有一個next分支是支持的,只需在項目下安裝它即可:

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

          最后

          其實vue2.0過渡系統(tǒng)還提供了其他場景的過渡應(yīng)用,這里就不展開贅述了。引用官網(wǎng)文檔的一句話:唯一的限制是你的想象力。哈哈...

          本文完?


          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  蜜桃精品无码视频网站 | 美女自慰在线 | 太湾黄色一级网 | 国产乱婬AAAA片视频软件 | 亚洲最大的成人网址 |