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的input输入框下拉提示层(自动邮箱后缀名)
Jun 14 Javascript
尝试在让script的type属性等于text/html
Jan 15 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
May 08 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
js操作模态窗口及父子窗口间相互传值示例
Jun 09 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
Mar 02 Javascript
判断js的Array和Object的实现方法
Aug 29 Javascript
PHP 实现一种多文件上传的方法
Sep 20 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
Mar 01 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
小程序接口的promise化的实现方法
Dec 11 Javascript
react+antd 递归实现树状目录操作
Nov 02 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下获取客户端ip地址的函数
2010/03/15 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
超级酷和最实用的jQuery实例收集(20个)
2010/04/21 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
JavaScript组件焦点与页内锚点间传值的方法
2015/02/02 Javascript
基于Bootstrap+jQuery.validate实现表单验证
2016/05/30 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
vue裁切预览组件功能的实现步骤
2018/05/04 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
python flask实现分页效果
2017/06/27 Python
Pandas 数据框增、删、改、查、去重、抽样基本操作方法
2018/04/12 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
对pandas里的loc并列条件索引的实例讲解
2018/11/15 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
如何在python中实现随机选择
2019/11/02 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
房产公证书范本
2014/04/10 职场文书
国际贸易专业求职信
2014/06/04 职场文书
优秀教研组申报材料
2014/12/26 职场文书
高中化学教学反思
2016/02/22 职场文书
《迟到》教学反思
2016/02/24 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
高一作文之乐趣
2019/11/21 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
Element实现动态表格的示例代码
2021/08/02 Javascript