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 读后台cookie代码
Sep 15 Javascript
JS写的贪吃蛇游戏(个人练习)
Jul 08 Javascript
javascript计时器编写过程与实现方法
Feb 29 Javascript
jQuery对象与DOM对象转换方法详解
May 10 Javascript
javascript设计模式之策略模式学习笔记
Feb 15 Javascript
微信小程序实现全局搜索代码高亮的示例
Mar 30 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
Oct 24 Javascript
jQuery实现轮播图效果
Nov 26 jQuery
简单了解vue 插值表达式Mustache
Jul 22 Javascript
我所理解的JavaScript中的this指向
Sep 04 Javascript
如何利用node转发请求详解
Sep 17 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的autoload自动加载机制使用说明
2010/12/28 PHP
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
2015/07/06 PHP
php的instanceof和判断闭包Closure操作示例
2020/01/26 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
jQuery中size()方法用法实例
2014/12/27 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
在vue项目中集成graphql(vue-ApolloClient)
2018/09/08 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
[47:35]VP vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
python rsa 加密解密
2017/03/20 Python
使用Python更换外网IP的方法
2018/07/09 Python
python实现对列表中的元素进行倒序打印
2019/11/23 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
周年庆典邀请函范文
2014/01/24 职场文书
房地产项目建议书
2014/03/12 职场文书
考试保密承诺书
2014/08/30 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
大学生就业推荐表自我评价
2015/03/02 职场文书
2014年底个人工作总结
2015/03/10 职场文书
卫生主题班会
2015/08/14 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis