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 19 Vue.js
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
vue使用exif获取图片经纬度的示例代码
Dec 11 Vue.js
vue 动态创建组件的两种方法
Dec 31 Vue.js
vue+elementui通用弹窗的实现(新增+编辑)
Jan 07 Vue.js
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
深入理解Vue的数据响应式
May 15 Vue.js
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 Vue.js
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
vue实现简易音乐播放器
Aug 14 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
【动漫杂谈】关于《请在T台上微笑》
2020/03/03 日漫
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PDO::prepare讲解
2019/01/29 PHP
jquery提升性能最佳实践小结
2010/12/06 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
javascript中返回顶部按钮的实现
2015/05/05 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
轻松学习Javascript闭包
2017/03/01 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
在Python的struct模块中进行数据格式转换的方法
2015/06/17 Python
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
Python3 使用selenium插件爬取苏宁商家联系电话
2019/12/23 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
python多线程爬取西刺代理的示例代码
2021/01/30 Python
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
男方父母婚礼答谢词
2014/01/25 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
党员教师四风问题对照检查材料
2014/09/26 职场文书
检讨书大全
2015/01/27 职场文书
幼儿园小班工作总结2015
2015/04/25 职场文书
社区党员干部承诺书
2015/05/04 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
Mysql8.0递归查询的简单用法示例
2021/08/04 MySQL