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实现下载文件流完整前后端代码
Nov 17 Vue.js
vue使用require.context实现动态注册路由
Dec 25 Vue.js
Vuex实现简单购物车
Jan 10 Vue.js
vue组件是如何解析及渲染的?
Jan 13 Vue.js
如何在 Vue 表单中处理图片
Jan 26 Vue.js
vscode自定义vue模板的实现
Jan 27 Vue.js
Vue 实例中使用$refs的注意事项
Jan 29 Vue.js
vue+django实现下载文件的示例
Mar 24 Vue.js
vue使用v-model进行跨组件绑定的基本实现方法
Apr 28 Vue.js
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
vue实力踩坑之push当前页无效
Apr 10 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+jquery实时显示网站在线人数的方法
2015/01/04 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
JS对URL字符串进行编码/解码分析
2008/10/25 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
不使用ajax实现无刷新提交表单
2014/12/21 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
json实现前后台的相互传值详解
2015/01/05 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
Vue.js事件处理器与表单控件绑定详解
2017/03/20 Javascript
js随机生成一个验证码
2017/06/01 Javascript
Angular限制input框输入金额(是小数的话只保留两位小数点)
2017/07/13 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
详解Python中的分组函数groupby和itertools)
2018/07/11 Python
python3结合openpyxl库实现excel操作的实例代码
2018/09/11 Python
把pandas转换int型为str型的方法
2019/01/29 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python GUI库图形界面开发之PyQt5 MDI(多文档窗口)QMidArea详细使用方法与实例
2020/03/05 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
AC Lens:购买隐形眼镜
2017/02/26 全球购物
.net开发工程师面试题
2014/02/25 面试题
餐厅楼面主管岗位职责范本
2014/02/16 职场文书
三八妇女节活动总结
2014/05/04 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
销售员岗位职责
2015/02/10 职场文书
党校个人总结
2015/03/04 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
导游词之山西祁县乔家大院
2019/10/14 职场文书