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 相关文章推荐
5款JavaScript代码压缩工具推荐
Jul 07 Javascript
JS创建对象几种不同方法详解
Mar 01 Javascript
JQuery对ASP.NET MVC数据进行更新删除
Jul 13 Javascript
jquery  实现轮播图详解及实例代码
Oct 12 Javascript
JS基于面向对象实现的拖拽功能示例
Dec 20 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
Vue.js中组件中的slot实例详解
Jul 17 Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 Javascript
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
Koa 中的错误处理解析
Apr 09 Javascript
微信小程序实现滑动翻页效果(完整代码)
Dec 06 Javascript
结合axios对项目中的api请求进行封装操作
Sep 21 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
Protoss兵种介绍
2020/03/14 星际争霸
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
js中apply方法的使用详细解析
2013/11/04 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
jQuery基础的工厂函数以及定时器的经典实例分析
2016/05/20 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
解决IE7中使用jQuery动态操作name问题
2017/08/28 jQuery
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
python实现图片批量剪切示例
2014/03/25 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
python区块及区块链的开发详解
2019/07/03 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
平面设计自荐信
2013/10/07 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
加工操作管理制度
2014/01/19 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
警察群众路线整改措施
2014/09/26 职场文书
优秀员工推荐材料
2014/12/20 职场文书
对领导班子的意见和建议
2015/06/08 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题