vue Transition

css动画效果有以下方式

1.automatically apply classes for CSS transitions and animations
2.integrate 3rd-party CSS animation libraries, such as Animate.css
3.use JavaScript to directly manipulate the DOM during transition hooks
4.integrate 3rd-party JavaScript animation libraries, such as Velocity.js

1.transition组件提供进入和移除动画

hello

//js new Vue({ el: '#demo', data: { show: true } }) //css .fade-enter-active, .fade-leave-active { transition: opacity .5s } .fade-enter, .fade-leave-active { opacity: 0 }
vue Transition_第1张图片
Paste_Image.png

有如下四个属性,v是在没有transition name的时候调用
v-enter
v-enter-active
v-leave
v-leave-active


vue Transition_第2张图片
Paste_Image.png

2.transition 进入和移除动画

hello

new Vue({ el: '#example-1', data: { show: true } }) /* Enter and leave animations can use different */ /* durations and timing functions. */ .slide-fade-enter-active { transition: all .3s ease; } .slide-fade-leave-active { transition: all .8s cubic-bezier(1.0, 0.5, 0.8, 1.0); } .slide-fade-enter, .slide-fade-leave-active { padding-left: 10px; opacity: 0; }

3.CSS animations 方式相同

Look at me!

new Vue({ el: '#example-2', data: { show: true } }) .bounce-enter-active { animation: bounce-in .5s; } .bounce-leave-active { animation: bounce-out .5s; } @keyframes bounce-in { 0% { transform: scale(0); } 50% { transform: scale(1.5); } 100% { transform: scale(1); } } @keyframes bounce-out { 0% { transform: scale(1); } 50% { transform: scale(1.5); } 100% { transform: scale(0); } }
vue Transition_第3张图片
Paste_Image.png

3.transition 组件增加属性

enter-class
enter-active-class
leave-class
leave-active-class


hello

new Vue({ el: '#example-3', data: { show: true } })

4.**JavaScript hooks


  

// ...
methods: {
  // --------
  // ENTERING
  // --------
  beforeEnter: function (el) {
    // ...
  },
  // the done callback is optional when
  // used in combination with CSS
  enter: function (el, done) {
    // ...
    done()
  },
  afterEnter: function (el) {
    // ...
  },
  enterCancelled: function (el) {
    // ...
  },
  // --------
  // LEAVING
  // --------
  beforeLeave: function (el) {
    // ...
  },
  // the done callback is optional when
  // used in combination with CSS
  leave: function (el, done) {
    // ...
    done()
  },
  afterLeave: function (el) {
    // ...
  },
  // leaveCancelled only available with v-show
  leaveCancelled: function (el) {
    // ...
  }
}

一个Velocity.js动画

Velocity works very much like jQuery.animate and is
a great option for JavaScript animations
-->

Demo

new Vue({
  el: '#example-4',
  data: {
    show: false
  },
  methods: {
    beforeEnter: function (el) {
      el.style.opacity = 0
    },
    enter: function (el, done) {
      Velocity(el, { opacity: 1, fontSize: '1.4em' }, { duration: 300 })
      Velocity(el, { fontSize: '1em' }, { complete: done })
    },
    leave: function (el, done) {
      Velocity(el, { translateX: '15px', rotateZ: '50deg' }, { duration: 600 })
      Velocity(el, { rotateZ: '100deg' }, { loop: 2 })
      Velocity(el, {
        rotateZ: '45deg',
        translateY: '30px',
        translateX: '30px',
        opacity: 0
      }, { complete: done })
    }
  }
})
vue Transition_第4张图片
Paste_Image.png

5.节点的初始渲染应用转换

添加class




JavaScript钩子函数




6.在不同元素之间切换动画


Sorry, no items found.

注意:如果是相同元素,比如都是table,需要绑定key


  
  
  

等价于




// ...
computed: {
  buttonMessage: function () {
    switch (docState) {
      case 'saved': return 'Edit'
      case 'edited': return 'Save'
      case 'editing': return 'Cancel'
    }
  }
}

7.Transition Modes

in-out: New element transitions in first, then when complete, the current element transitions out.

out-in: Current element transitions out first, then when complete, the new element transitions in.

8.Transitioning Between Components

比较简单,直接用dynamic component 就可以了


  

new Vue({
  el: '#transition-components-demo',
  data: {
    view: 'v-a'
  },
  components: {
    'v-a': {
      template: '
Component A
' }, 'v-b': { template: '
Component B
' } } }) .component-fade-enter-active, .component-fade-leave-active { transition: opacity .3s ease; } .component-fade-enter, .component-fade-leave-active { opacity: 0; }
vue Transition_第5张图片
Paste_Image.png

9. transitioning entering and leaving

{{ item }}
new Vue({ el: '#list-demo', data: { items: [1,2,3,4,5,6,7,8,9], nextNum: 10 }, methods: { randomIndex: function () { return Math.floor(Math.random() * this.items.length) }, add: function () { this.items.splice(this.randomIndex(), 0, this.nextNum++) }, remove: function () { this.items.splice(this.randomIndex(), 1) }, } }) .list-item { display: inline-block; margin-right: 10px; } .list-enter-active, .list-leave-active { transition: all 1s; } .list-enter, .list-leave-active { opacity: 0; transform: translateY(30px); }
vue Transition_第6张图片
Paste_Image.png

10.List Move Transitions


  • {{ item }}
  • new Vue({ el: '#flip-list-demo', data: { items: [1,2,3,4,5,6,7,8,9] }, methods: { shuffle: function () { this.items = _.shuffle(this.items) } } }) .flip-list-move { transition: transform 1s; }
    vue Transition_第7张图片
    Paste_Image.png

    11.交错转换

    
    
  • {{ item.msg }}
  • new Vue({
      el: '#staggered-list-demo',
      data: {
        query: '',
        list: [
          { msg: 'Bruce Lee' },
          { msg: 'Jackie Chan' },
          { msg: 'Chuck Norris' },
          { msg: 'Jet Li' },
          { msg: 'Kung Fury' }
        ]
      },
      computed: {
        computedList: function () {
          var vm = this
          return this.list.filter(function (item) {
            return item.msg.toLowerCase().indexOf(vm.query.toLowerCase()) !== -1
          })
        }
      },
      methods: {
        beforeEnter: function (el) {
          el.style.opacity = 0
          el.style.height = 0
        },
        enter: function (el, done) {
          var delay = el.dataset.index * 150
          setTimeout(function () {
            Velocity(
              el,
              { opacity: 1, height: '1.6em' },
              { complete: done }
            )
          }, delay)
        },
        leave: function (el, done) {
          var delay = el.dataset.index * 150
          setTimeout(function () {
            Velocity(
              el,
              { opacity: 0, height: 0 },
              { complete: done }
            )
          }, delay)
        }
      }
    })
    
    vue Transition_第8张图片
    Paste_Image.png

    12.可以重用的动画组件

    Vue.component('my-special-transition', {
      template: '\
        \
          \
        \
      ',
      methods: {
        beforeEnter: function (el) {
          // ...
        },
        afterEnter: function (el) {
          // ...
        }
      }
    })
    

    functional components

    Vue.component('my-special-transition', {
      functional: true,
      render: function (createElement, context) {
        var data = {
          props: {
            name: 'very-special-transition'
            mode: 'out-in'
          },
          on: {
            beforeEnter: function (el) {
              // ...
            },
            afterEnter: function (el) {
              // ...
            }
          }
        }
        return createElement('transition', data, context.children)
      }
    })
    

    13.dynamic transitions

    你可能感兴趣的:(vue Transition)