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 相关文章推荐
jsTree树控件(基于jQuery, 超强悍)[推荐]
Sep 01 Javascript
Prototype源码浅析 Enumerable部分(二)
Jan 18 Javascript
node.js中的console.error方法使用说明
Dec 10 Javascript
JavaScript中实现依赖注入的思路分享
Jan 15 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
浅析如何利用JavaScript进行语音识别
Oct 27 Javascript
vue多页面开发和打包正确处理方法
Apr 20 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 Javascript
ES6的异步操作之promise用法和async函数的具体使用
Dec 06 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
Apr 10 Javascript
javascript+Canvas实现画板功能
Jun 23 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测试硬盘写入速度示例
2014/01/27 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
关于query Javascript CSS Selector engine
2013/04/12 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
简体中文转换繁体中文(实现代码)
2013/12/25 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
jquery中change()用法实例分析
2015/02/06 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
2017/09/10 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
深入理解Python中变量赋值的问题
2017/01/12 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
2019/12/13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python制作一个仿QQ办公版的图形登录界面
2020/09/22 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
行政工作个人的自我评价
2014/02/13 职场文书
文明寄语大全
2014/04/11 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
庆六一活动总结
2014/08/29 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
加薪通知
2015/04/25 职场文书
民事起诉状范文
2015/05/19 职场文书
元旦联欢晚会主持词
2015/07/01 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
MySQL学习必备条件查询数据
2022/03/25 MySQL