vue 2.x实现动画效果

vue 2.x开始,动画效果的实现都已经抽象成一个内建的组件了,transition

<!-- 简单元素 -->
<transition>
  <div v-if="ok">toggled content</div>
</transition>
<!-- 动态组件 -->
<transition name="fade" mode="out-in" appear>
  <component :is="view"></component>
</transition>
<!-- 事件钩子 -->
<div id="transition-demo">
  <transition @after-enter="transitionComplete">
    <div v-show="ok">toggled content</div>
  </transition>
</div>

1. transition标签属性设置需要的动画类型

<transition name="move">
      <div class="cart-decrease" v-show="food.count>0" @click="decreaseCart($event)">
        <span class="inner icon-remove_circle_outline"></span>
      </div>
</transition>

2. 给需要设置成动画的元素设计样式

    .cart-decrease
      display: inline-block
      padding: 6px
      transition: all 0.4s linear
      .inner
        display: inline-block
        font-size: 24px
        line-height: 24px
        color: rgb(0, 160, 220)
        transition: all 0.4s linear
        transform: rotate(0)
      &.move-enter-active
        opacity: 1
        transform: translate3d(0, 0, 0)
      &.move-enter, &.move-leave
        opacity: 0
        transform: translate3d(24px, 0, 0)
        .inner
          transform: rotate(180deg)

3.实现添加购物车时,小球抛物线进购物车的示例

<div class="cart-add icon-add_circle" @click="addCart($event)"></div>

添加购物车的小球,单击事件的时候,在处理函数中加入this.$emit('cartadd', event.target),该方法能将当前元素节点作为参数传给父组件,其中方法的第一个参数为事件名,父组件的监听器会监听该事件。

<cartcontrol :food="food" @cartadd="_drop"></cartcontrol>

父组件监听到cartadd事件后,会调用方法对象里面的_drop函数

methods: {
...
,
_drop (target) {
        this.$nextTick(() => {
          this.$refs.shopCart.drop(target)
        })
      },
...
}

_drop函数会执行注册的引用信息名ref为shopCart的子组件的drop方法
shopCart子组件中的methods对象中,实现了drop方法

    drop (el) {
        for (let i = 0; i < this.balls.length; i++) {
          let ball = this.balls[i]
          if (!ball.show) {
            ball.show = true
            ball.el = el
            this.dropBalls.push(ball)
            return true
          }
        }
      }

该方法会把小球的show属性由false改为true,元素属性绑定为由$emit实例方法传出来得event.target元素。在该实例中就是添加按钮,即将成为小球的元素。
shopCart子组件中实现的动画样式

    <div class="ball-container">
      <div v-for="ball in balls">
        <transition name="drop" @before-enter="beforeEnter" @enter="enter" @after-enter="afterEnter">
          <div v-show="ball.show" class="ball">
            <div class="inner inner-hook"></div>
          </div>
        </transition>
      </div>
    </div>

transition组件监听器监听的事件有before-enter、enter、after-enter事件。事件方法需要自己实现
(shopCart子组件的methods对象中实现以下方法)

    beforeEnter (el) {
        let count = this.balls.length
        while (count--) {
          let ball = this.balls[count]
          if (ball.show) {
            let rect = ball.el.getBoundingClientRect()
            let x = rect.left - 32
            let y = -(window.innerHeight - rect.top - 22)
    //            console.log(x, y)
            el.style.display = ''
            el.style.webkitTransform = `translate3d(0, ${y}px, 0)`
            el.style.transform = `translate3d(0, ${y}px, 0)`
            let inner = el.getElementsByClassName('inner-hook')[0]
            inner.style.webkitTransform = `translate3d(${x}px, 0, 0)`
            inner.style.transform = `translate3d(${x}px, 0, 0)`
          }
        }
      },
      enter (el) {
        /* eslint-disable no-unused-vars */
        let rf = el.offsetHeight
        this.$nextTick(() => {
          el.style.webkitTransform = 'translate3d(0, 0, 0)'
          el.style.transform = 'translate3d(0, 0, 0)'
          let inner = el.getElementsByClassName('inner-hook')[0]
          inner.style.webkitTransform = 'translate3d(0, 0, 0)'
          inner.style.transform = 'translate3d(0, 0, 0)'
        })
      },
      afterEnter (el) {
        let ball = this.dropBalls.shift()
        if (ball) {
          ball.show = false
          el.style.display = 'none'
        }
      }

注意别忘了在shopCart子组件中实现data属性方法

    data () {
      return {
        balls: [
          {
            show: false
          }, {
            show: false
          }, {
            show: false
          }, {
            show: false
          }, {
            show: false
          }],
        dropBalls: []
      }
    },

该方法提供了我们要操作的小球数组,还有抛出的小球数组。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,667评论 4 61
  • 1.安装 可以简单地在页面引入Vue.js作为独立版本,Vue即被注册为全局变量,可以在页面使用了。 如果希望搭建...
    Awey阅读 13,802评论 4 129
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,474评论 0 29
  • 你的脸上云淡风轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔伤的淤青。你笑得没心没肺,没...
    帅气素宝阅读 1,711评论 0 0
  • 趁天还没十分冷,回趟家乡度个假。。拍了很多照片,很可惜,我不擅长画风景,那些照片,发个朋友圈,也就罢了,并不能把它...
    陈狂阅读 5,869评论 51 78

友情链接更多精彩内容