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 相关文章推荐
jquery提升性能最佳实践小结
Dec 06 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
Jan 13 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
Javascript中的关键字和保留字整理
Oct 16 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
Mar 04 Javascript
深入浅析JavaScript中的scrollTop
Jul 11 Javascript
AngularJS实现的输入框字数限制提醒功能示例
Oct 26 Javascript
jQuery实现滚动效果
Nov 17 jQuery
AngularJS实现的2048小游戏功能【附源码下载】
Jan 03 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
Sep 15 Javascript
vue3+typescript实现图片懒加载插件
Oct 26 Javascript
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
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
FirePHP 推荐一款PHP调试工具
2011/04/23 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
2014/11/17 PHP
PHP中的魔术方法总结和使用实例
2015/05/11 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
2013/11/22 Javascript
js导航栏单击事件背景变换示例代码
2014/01/13 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
js实现图片旋转 js滚动鼠标中间对图片放大缩小
2017/07/05 Javascript
ES6中let 和 const 的新特性
2018/09/03 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
Python编写一个闹钟功能
2017/07/11 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
使用python根据端口号关闭进程的方法
2018/11/06 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
python实现在函数中修改变量值的方法
2019/07/16 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
C语言面试题
2013/05/19 面试题
问卷调查计划书
2014/01/10 职场文书
银行奉献演讲稿
2014/09/16 职场文书
2014年国庆节庆祝建国65周年比赛演讲稿
2014/09/21 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2019新员工试用期转正申请书3篇
2019/08/13 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
php双向队列实例讲解
2021/11/17 PHP