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 相关文章推荐
eclipse如何忽略js文件报错(附图)
Oct 30 Javascript
浮动的div自适应居中显示的js代码
Dec 23 Javascript
JavaScript实现非常简单实用的下拉菜单效果
Aug 27 Javascript
在Html中使用Requirejs进行模块化开发实例详解
Apr 15 Javascript
JS 全屏和退出全屏详解及实例代码
Nov 07 Javascript
AngularJS指令中的绑定策略实例分析
Dec 14 Javascript
详解Vue监听数据变化原理
Mar 08 Javascript
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
vue请求数据的三种方式
Mar 04 Javascript
vue 解决data中定义图片相对路径页面不显示的问题
Aug 13 Javascript
用js实现放大镜效果
Oct 28 Javascript
小程序实现点击tab切换左右滑动
Nov 16 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读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
PHP中大于2038年时间戳的问题处理方案
2015/03/03 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
JS判断客户端是手机还是PC的2个代码
2014/04/12 Javascript
js Dialog 去掉右上角的X关闭功能
2014/04/23 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
Vue实现一种简单的无限循环滚动动画的示例
2021/01/10 Vue.js
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
[01:36]DOTA2完美大师赛趣味视频之与队友相处的十万个技巧
2017/11/19 DOTA
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
使用matlab或python将txt文件转为excel表格
2019/11/01 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
军训生自我鉴定范文
2013/12/27 职场文书
工作自我评价怎么写
2014/01/29 职场文书
服装发布会策划方案
2014/05/22 职场文书
交通事故和解协议书
2014/09/25 职场文书
文艺节目主持词
2015/07/06 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
深入解读Java三大集合之map list set的用法
2021/11/11 Java/Android
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android