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 elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
vue中watch的用法汇总
Dec 28 Vue.js
vue实现简易的双向数据绑定
Dec 29 Vue.js
vue3+typeScript穿梭框的实现示例
Dec 29 Vue.js
Vue实现一种简单的无限循环滚动动画的示例
Jan 10 Vue.js
vue-resource 拦截器interceptors使用详解
Jan 18 Vue.js
详解实现vue的数据响应式原理
Jan 20 Vue.js
深入了解Vue动态组件和异步组件
Jan 26 Vue.js
vue-cli中实现响应式布局的方法
Mar 02 Vue.js
Vue的生命周期一起来看看
Feb 24 Vue.js
vue 把二维或多维数组转一维数组
Apr 24 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 三维饼图的实现代码
2008/09/28 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
CodeIgniter开发实现支付宝接口调用的方法示例
2016/11/14 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
PDO实现学生管理系统
2020/03/21 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
javascript 日历提醒系统( 兼容所有浏览器 )
2009/04/07 Javascript
jquery 之 $().hover(func1, funct2)使用方法
2012/06/14 Javascript
js实现鼠标悬浮给图片加边框的方法
2015/01/30 Javascript
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
微信小程序全局变量的设置、使用、修改过程解析
2019/09/24 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
python excel转换csv代码实例
2019/08/26 Python
python实现画图工具
2020/08/27 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
医学生求职自荐信
2013/10/25 职场文书
贷款担保申请书
2014/05/20 职场文书
财务务虚会发言材料
2014/10/20 职场文书
勇敢的心观后感
2015/06/09 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
古见同学有交流障碍症 第二季宣传CM公开播出
2022/04/11 日漫