Vue 让元素抖动/摆动起来的实现代码


Posted in Javascript onMay 31, 2018

首先展示一下效果,狠狠点击 https://zhangkunusergit.github.io/vue-component/dist/jitter.html

代码github : https://github.com/zhangKunUserGit/vue-component

先说一下用法:

<jitter :start.sync="抖动控制器" :range="{ 包含x,y, z }" :shift-percent="0.1">
 这里是你要抖动的元素
</jitter>

思路:

1.抖动就是摆动,现实中的钟摆可以很形象。

2.当摆动到临界点后,就会向相反的方向摆动。

3.在没有动力时,摆动会慢慢停止。

初始化抖动:

/**
 * 初始化抖动
 */
initJitter() {
 // 把start变成false, 方便下次点击
 this.$emit('update:start', false);
 // 清除上次动画
 this.clearAnimate();
 // 设置currentRange, 填充this.range 中没有的项
 this.currentRange = Object.assign({}, { x: 0, y: 0, z: 0 }, this.range);
 // 获取需要操作的的项 和 每次需要摆动的量
 const { position, shiftNumber } = this.getPositionAndShiftNumber();
 this.position = position;
 this.shiftNumber = shiftNumber;
 // 初始 move 起始点是0
 this.move = { x: 0, y: 0, z: 0 };
 // 初始时 是顺时针
 this.isClockwise = true;
 // 执行动画
 this.timer = window.requestAnimationFrame(this.continueJitter);
},

这里准备动画开始前的工作。

执行动画:

// 持续抖动
continueJitter() {
 this.refreshMove(this.isClockwise ? -1 : 1);
 // 绝对值
 const absMove = this.getAbsMove();
 const currentRange = this.currentRange;
 let changeDirection = false;
 for (let i = 0, l = this.position.length, p; i < l; i += 1) {
 p = this.position[i];
 // 判断是否到达临界值,到达后 应该反方向执行动画
 if (currentRange[p] <= absMove[p]) {
  // 等比例缩减
  this.currentRange[p] -= this.shiftNumber[p];
  // 判断如果已经无力再摆动,就让摆动停止, 只要有一个值达到了0,所有都会达到
  if (this.currentRange[p] <= 0) {
  // 停止在起始点上
  this.jitterView({ x: 0, y: 0, z: 0 });
  // 清除动画
  this.clearAnimate();
  return;
  }
  // 更新move为临界点
  this.move[p] = this.isClockwise ? -this.currentRange[p] : this.currentRange[p];
  // 改变摆动方向
  changeDirection = true;
 }
 }
 if (changeDirection) {
 // 摆动方向取反
 this.isClockwise = !this.isClockwise;
 }
 // 更新元素位置
 this.jitterView(this.move);
 // 继续执行动画
 this.timer = window.requestAnimationFrame(this.continueJitter);
},

执行动画,当判断已经无力摆动后,让元素回归到原来的位置,并清除动画。

修改元素位置:

/**
 * 修改元素位置
 * @param x
 * @param y
 * @param z
 */
jitterView({ x = 0, y = 0, z = 0 }) {
 this.$el.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
},

这里需要判断需要 Z 轴摆动吗? 当需要时,必须给当前元素的父级添加 perspective, 从而修改子级透视效果

mounted() {
 // 如果要执行 z 轴动画需要设置父级,从而修改子级透视效果,否则 Z 轴没有效果
 if (this.range.z > 0) {
 const parentEl = this.$el.parentNode;
 Object.keys(this.perspectiveStyle).forEach((key) => {
  parentEl.style[key] = this.perspectiveStyle[key];
 });
 }
},

最后看看可以传的属性:

props: {
 // 抖动范围,单位是px, 例如:{x: 4, y: 2, z: 10}
 range: {
 type: Object,
 default: () => { return { z: 8 }; },
 },
 start: {
 type: Boolean,
 required: true,
 },
 shiftPercent: {
 type: Number,
 default: 0.1, // 移动range中初始值的百分比
 },
 perspectiveStyle: {
 type: Object,
 default: () => {
  return {
  perspective: '300px',
  perspectiveOrigin: 'center center'
  };
 }
 }
},

上面是可以传的属性,大家可以按照情况修改

最后:

这里我只写了简单的动画,也可以根据不同情况进行修改,从而达到想要的效果。这里已经满足输入框错误抖动的效果了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
Feb 19 Javascript
javascript实现禁止复制网页内容
Dec 16 Javascript
node.js中的fs.read方法使用说明
Dec 17 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
原生JS改变透明度实现轮播效果
Mar 24 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
vue 左滑删除功能的示例代码
Jan 28 Javascript
深入理解JS异步编程-Promise
Jun 03 Javascript
微信小程序实现吸顶特效
Jan 08 Javascript
JavaScript使用canvas绘制随机验证码
Feb 17 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
Oct 13 Javascript
angular2路由之routerLinkActive指令【推荐】
May 30 #Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
May 30 #jQuery
Vue2.0 实现移动端图片上传功能
May 30 #Javascript
jQuery 导航自动跟随滚动的实现代码
May 30 #jQuery
Javascript获取某个月的天数
May 30 #Javascript
JS实现键值对遍历json数组功能示例
May 30 #Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 #Javascript
You might like
PHP自动更新新闻DIY
2006/10/09 PHP
DedeCms模板安装/制作概述
2007/03/11 PHP
php把session写入数据库示例
2014/02/26 PHP
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
javascript中bind函数的作用实例介绍
2014/09/28 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
2015/09/11 Javascript
javascript基本语法
2016/05/31 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
详解关于JSON.parse()和JSON.stringify()的性能小测试
2019/03/14 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
2020/07/17 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
js实现简易ATM功能
2020/10/27 Javascript
解析Python编程中的包结构
2015/10/25 Python
Python 功能和特点(新手必学)
2015/12/30 Python
使用Python读取大文件的方法
2018/02/11 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python绘制多个曲线的折线图
2020/03/23 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Python Pillow Image Invert
2019/01/22 Python
python之信息加密题目详解
2019/06/26 Python
Python使用matplotlib绘制圆形代码实例
2020/05/27 Python
python 如何区分return和yield
2020/09/22 Python
python如何调用php文件中的函数详解
2020/12/29 Python
linux面试题参考答案(9)
2016/01/29 面试题
工作迟到检讨书
2014/02/21 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书