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


Posted in Vue.js onDecember 18, 2020

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.js 相关文章推荐
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
vue 递归组件的简单使用示例
Jan 14 Vue.js
vue element el-transfer增加拖拽功能
Jan 15 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
Vue 数据响应式相关总结
Jan 28 Vue.js
vue监听键盘事件的相关总结
Jan 29 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
vue组件vue-esign实现电子签名
Apr 21 Vue.js
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
vue如何清除浏览器历史栈
May 25 Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 #Vue.js
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 #Vue.js
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
Dec 15 #Vue.js
You might like
php下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
javascript qq右下角滑出窗口 sheyMsg
2010/03/21 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
Javascript图像处理—平滑处理实现原理
2012/12/28 Javascript
js给onclick赋值传参数的两种方法
2013/11/25 Javascript
jquery选择器之内容过滤选择器详解
2014/01/27 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
JavaScript中的this使用详解
2016/07/27 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
JavaScript中this关键字用法实例分析
2018/08/24 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
Vue 实现把表单form数据 转化成json格式的数据
2019/10/29 Javascript
javascript设计模式之迭代器模式
2020/01/30 Javascript
解决echarts图表使用v-show控制图表显示不全的问题
2020/07/19 Javascript
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python中字符串与编码示例代码
2019/05/20 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python计算导数并绘图的实例
2020/02/29 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
加拿大奢华时装品牌:Mackage
2018/01/10 全球购物
中学家长会邀请函
2014/01/17 职场文书
竞聘书怎么写,如何写?
2014/03/31 职场文书
大学生工作自荐书
2014/06/16 职场文书
教师求职信
2014/06/17 职场文书
logback 实现给变量指定默认值
2021/08/30 Java/Android