Vue实现指令式动态追加小球动画组件的步骤

 更新时间:2020年12月18日 09:15:27   作者:面向谷歌百度开发工程师  
这篇文章主要介绍了Vue实现指令式动态追加小球动画组件的步骤,帮助大家更好的理解和实用vue,感兴趣的朋友可以了解下

1. 小球组件

我们希望可以封装一个通用的小球动画组件,这个组件可以在任何地方调动,而且小球组件可以通过this.$ball({...props})这样的方式调用,让他在用法上接近element-ui

template模板

<template>
 <div class="ball-wrapper">
  <transition @before-enter="beforeEnter"
        @enter="enter"
        @after-enter="afterEnter"
        name="ball">
   <div class="ball" ref="ball" v-show="ballShow">
    <div class="inner">
     <div class="cube"></div>
    </div>
   </div>
  </transition>
 </div>

</template>

小球的组成主要是分为外层,内层以及内容层
内层控制小球的x方向,外层y方向移动

props

props: {
   el: {
    type: MouseEvent
   },
  },

把点击事件的对象传入小球中

主要核心js

beforeEnter(el) {
    const x = this.rect.left - window.innerWidth / 2
    const y = -(window.innerHeight - this.rect.top - 140)
    el.style.display = 'block'
    el.style.transform = `translate3d(0,${y}px,0)`
    const inner = el.querySelector('.inner')
    inner.style.transform = `translate3d(${x}px,0,0)`
   },
  enter(el, done) {
    // 触发重绘
    document.body.offsetHeight
    el.style.transform = 'translate3d(0,0,0)'
    const inner = el.querySelector('.inner')
    inner.style.transform = `translate3d(0,0,0)`
    el.addEventListener('transitionend', done)

   },
   afterEnter(el) {
    this.ballShow = false
    el.style.display = 'none'
    this.remove()
   },
   show() {
    const dom = this.el.target
    this.rect = dom.getBoundingClientRect()
    this.ballShow = true
   },

beforeEnter, enter, afterEnter是transition组件的三个钩子函数对应动画开始前,动画开始,动画结束三个阶段.

beforeEnter

这个钩子的主要作用就是计算动画的开始位置

enter

这里有个一个坑,在这里我们需要手动触发浏览器的重绘,这里因为通过js修改的style不会及时更新,组件的display属性还是none所以不会有任何过渡.重绘后这里的display就是block了,transition可以正常过渡.

afterEnter

过渡动画结束,并且销毁整个小球的实例

其实如果要让组件更加通用需要初始化过渡目标的坐标,在这里代码就不贴了,思路和初始化小球一样

2. 挂载小球动画

要触发小球组件就必须调用小球组件的show方法,调用show方法的唯一途径就是获取小球组件的实例. 这样问题就变成如何在vm上绑定小球实例.Vue中有两种方式可以获取组件实例一种是extend另外一种为render函数,

create函数

function create(comp, props) {
 const vm = new Vue({
 	// h就是createElement,组件生成vdom
  render: h => h(comp, {props})
 }).$mount()
 // 追加真实dom
 document.body.appendChild(vm.$el)
 // 由于使用的是新的Vue实例,所以children的第0个就是comp实例化后的组件
 const component = vm.$children[0]
 // 组件挂载销毁方法
 component.remove = function() {
  document.body.removeChild(vm.$el)
  vm.$destroy()
 }
 // 返回组件实例
 return component
}

protoType

export default (Vue) => {
 Vue.prototype.$ball = props => {
  create(BallAnimation, props).show()
 }
}

这里相当于提供了一个install方法,然后再main方法中use,全局挂载会更美观,这里小球挂载基本上已经全部完成了

使用

ballAnitmation(el) {
    this.$ball({
     el
    })
   }

最终效果

以上就是Vue实现指令式动态追加小球动画组件的步骤的详细内容,更多关于Vue实现指令式动态追加小球动画组件的资料请关注脚本之家其它相关文章!

相关文章

  • vue实现表格合并功能

    vue实现表格合并功能

    这篇文章主要为大家详细介绍了vue实现表格合并功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 一篇文章学会Vue中间件管道

    一篇文章学会Vue中间件管道

    这篇文章主要给大家介绍了如何通过一篇文章学会Vue中间件管道的相关资料,什么是中间件管道?中间件管道是一堆不同的中间件并行运行,本文通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-06-06
  • vue3中的this.$set写法举例

    vue3中的this.$set写法举例

    在Vue2中,由于数据响应式是利用object.definedProperty()实现的,无法深层监听数据变化,因此提供了$set方法来解决数据变化视图未实时更新的问题,然而,在Vue3中,数据响应式使用ES6的proxy进行数据代理,因此废弃了$set的概念
    2024-10-10
  • Vue2.0利用vue-resource上传文件到七牛的实例代码

    Vue2.0利用vue-resource上传文件到七牛的实例代码

    本篇文章主要介绍了Vue2.0利用vue-resource上传文件到七牛的实例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • 详解VUE项目中安装和使用vant组件

    详解VUE项目中安装和使用vant组件

    这篇文章主要介绍了VUE安装和使用vant组件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • vue实现钉钉的考勤日历

    vue实现钉钉的考勤日历

    这篇文章主要为大家详细介绍了vue实现钉钉的考勤日历,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • VUE watch监听器的基本使用方法详解

    VUE watch监听器的基本使用方法详解

    这篇文章主要介绍了vue使用watch监听器的基本使用方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • vue将毫秒数转化为正常日期格式的实例

    vue将毫秒数转化为正常日期格式的实例

    今天小编就为大家分享一篇vue将毫秒数转化为正常日期格式的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 详解element-ui日期时间选择器的日期格式化问题

    详解element-ui日期时间选择器的日期格式化问题

    这篇文章主要介绍了详解element-ui日期时间选择器的日期格式化问题,本文用到了DateTimePicker来选择日期时间,但是在将数据传回后台的过程中遇到了一些令人头疼的问题,有兴趣的一起来了解一下
    2019-04-04
  • vsCode安装配置创建Vue3项目全过程

    vsCode安装配置创建Vue3项目全过程

    本文介绍了如何在Windows系统上安装和配置Vue.js开发环境,包括安装VS Code、Node.js、Vue CLI以及创建和启动一个Vue项目
    2025-01-01

最新评论