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 22 Vue.js
用vue设计一个日历表
Dec 03 Vue.js
vue表单验证之禁止input输入框输入空格
Dec 03 Vue.js
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 Vue.js
详解如何在vue+element-ui的项目中封装dialog组件
Dec 11 Vue.js
vue+openlayers绘制省市边界线
Dec 24 Vue.js
vue导入.md文件的步骤(markdown转HTML)
Dec 31 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
详解vue3中组件的非兼容变更
Mar 03 Vue.js
vite+vue3.0+ts+element-plus快速搭建项目的实现
Jun 24 Vue.js
Vue2.0搭建脚手架
Mar 13 Vue.js
vue css 相对路径导入问题级踩坑记录
Jun 05 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 zip扩展Linux下安装过程分享
2014/05/05 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
Layui动态生成select下拉选择框不显示的解决方法
2019/09/24 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
JS实现购物车基本功能
2020/11/08 Javascript
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
零基础学Python(一)Python环境安装
2014/08/20 Python
Python使用SocketServer模块编写基本服务器程序的教程
2016/07/12 Python
基于Python中单例模式的几种实现方式及优化详解
2018/01/09 Python
Python 实现引用其他.py文件中的类和类的方法
2018/04/29 Python
Python读写/追加excel文件Demo分享
2018/05/03 Python
浅谈python函数调用返回两个或多个变量的方法
2019/01/23 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
python判断链表是否有环的实例代码
2020/01/31 Python
python实现猜数游戏
2020/03/27 Python
pyqt5中动画的使用详解
2020/04/01 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
pycharm 多行批量缩进和反向缩进快捷键介绍
2021/01/15 Python
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
Tiqets荷兰:出售欧洲最美丽的景点和博物馆门票
2018/01/09 全球购物
介绍一下Linux文件的记录形式
2012/04/18 面试题
软环境建设心得体会
2014/09/09 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
同意迁入证明模板
2014/10/26 职场文书
保证书格式
2015/01/16 职场文书
婚礼答谢礼品
2015/01/20 职场文书
日元符号 ¥
2022/02/17 杂记
Python利用zhdate模块实现农历日期处理
2022/03/31 Python
Python各协议下socket黏包问题原理
2022/04/12 Python
使用 DataAnt 监控 Apache APISIX的原理解析
2022/07/07 Servers