javascript仿天猫加入购物车动画效果
javascript仿天猫加入购物车动画效果
注意:首先需要声明的是:代码原思路不是我写的,是在网上找的这种效果,自己使用代码封装了下而已;代码中都有注释,我们最主要的是理解抛物线的思路及在工作中完成这样的任务,最近需要做类似于天猫加入购物车动画效果,所以就在网上搜索了下,就看到类似的效果,就把代码截下来自己封装了下~~
如果想要了解抛物线的细节,我建议大家先 看下 张鑫旭 讲解的抛物线的文章,再来看如下JS代码,可能理解更深点~~
首先我们来理解的是: 既然是抛物运动,那么 运动的元素肯定需要 "绝对定位";配置的参数有如下:(依赖于Jquery或者zepto.js)
| 配置项 | 含义 |
| el | 需要运动的元素 {object | string} 默认为null |
| offset | 运动的元素在 X轴,Y轴的偏移位置 |
| targetEl | 终点目标元素 这时就会自动获取该元素的left、top值,来表示移动元素在X,Y轴的偏移位置;设置了这个参数,offset将失效 |
| duration | 运动时间,默认为500毫秒 |
| curvature | 抛物线曲率,就是弯曲的程度,越接近于0越像直线,默认0.001 |
| callback | 运动完成后执行的回调函数 |
| autostart | 是否自动开始运动,默认为false |
| stepCallback | 运动过程中执行的回调函数,this指向该对象,接受x,y参数,分别表示X,Y轴的偏移位置。 |
JSFiddler效果如下:
下面是所有的JS代码:
/*
* 实现抛物线函数 Parabola
* 切记既然是抛物线运动,那么运动的元素需要绝对定位
* 具体了解抛物线 可以看张鑫旭的文章
* http://www.zhangxinxu.com/wordpress/2013/12/javascript-js-%E5%85%83%E7%B4%A0-%E6%8A%9B%E7%89%A9%E7%BA%BF-%E8%BF%90%E5%8A%A8-%E5%8A%A8%E7%94%BB/
*/
var Parabola = function(opts){
this.init(opts);
};
Parabola.prototype = {
constructor: Parabola,
/*
* @fileoverview 页面初始化
* @param opts {Object} 配置参数
*/
init: function(opts){
this.opts = $.extend(defaultConfig, opts || {});
// 如果没有运动的元素 直接return
if(!this.opts.el) {
return;
}
// 取元素 及 left top
this.$el = $(this.opts.el);
this.$elLeft = this._toInteger(this.$el.css("left"));
this.$elTop = this._toInteger(this.$el.css("top"));
// 计算x轴,y轴的偏移量
if(this.opts.targetEl) {
this.diffX = this._toInteger($(this.opts.targetEl).css("left")) - this.$elLeft;
this.diffY = this._toInteger($(this.opts.targetEl).css("top")) - this.$elTop;
}else {
this.diffX = this.opts.offset[0];
this.diffY = this.opts.offset[1];
}
// 运动时间
this.duration = this.opts.duration;
// 抛物线曲率
this.curvature = this.opts.curvature; // 计时器
this.timerId = null;
/*
* 根据两点坐标以及曲率确定运动曲线函数(也就是确定a, b的值)
* 公式: y = a*x*x + b*x + c;
* 因为经过(0, 0), 因此c = 0
* 于是:
* y = a * x*x + b*x;
* y1 = a * x1*x1 + b*x1;
* y2 = a * x2*x2 + b*x2;
* 利用第二个坐标:
* b = (y2 - a*x2*x2) / x2
*/
this.b = (this.diffY - this.curvature * this.diffX * this.diffX) / this.diffX; // 是否自动运动
if(this.opts.autostart) {
this.start();
}
},
/*
* @fileoverview 开始
*/
start: function(){
// 开始运动
var self = this;
// 设置起始时间 和 结束时间
this.begin = (new Date()).getTime();
this.end = this.begin + this.duration; // 如果目标的距离为0的话 就什么不做
if(this.diffX === 0 && this.diffY === 0) {
return;
}
if(!!this.timerId) {
clearInterval(this.timerId);
this.stop();
}
// 每帧(对于大部分显示屏)大约16~17毫秒。默认大小是166.67。也就是默认10px/ms
this.timerId = setInterval(function(){
var t = (new Date()).getTime();
self.step(t);
},16);
return this;
},
/*
* @fileoverview 执行每一步
* @param {string} t 时间
*/
step: function(t){
var opts = this.opts;
var x,
y;
// 如果当前运行的时间大于结束的时间
if(t > this.end) {
// 运行结束
x = this.diffX;
y = this.diffY;
this.move(x,y);
this.stop();
// 结束后 回调
if(typeof opts.callback === 'function') {
opts.callback.call(this);
}
}else {
// 每一步x轴的位置
x = this.diffX * ((t - this.begin) / this.duration);
// 每一步y轴的位置 y = a * x *x + b*x + c; c = 0
y = this.curvature * x * x + this.b * x;
// 移动
this.move(x,y);
if(typeof opts.stepCallback === 'function') {
opts.stepCallback.call(this,x,y);
}
}
return this;
},
/*
* @fileoverview 给元素定位
* @param {x,y} x,y坐标
* @return this
*/
move: function(x,y) {
this.$el.css({
"position":'absolute',
"left": this.$elLeft + x + 'px',
"top": this.$elTop + y + 'px'
});
return this;
},
/*
* 获取配置项
* @param {object} options配置参数
* @return {object} 返回配置参数项
*/
getOptions: function(options){
if(typeof options !== "object") {
options = {};
}
options = $.extend(defaultConfig, options || {});
return options;
},
/*
* 设置options
* @param options
*/
setOptions: function(options) {
this.reset();
if(typeof options !== 'object') {
options = {};
}
options = $.extend(this.opts,options);
this.init(options);
return this;
},
/*
* 重置
*/
reset: function(x,y) {
this.stop();
x = x ? x : 0;
y = y ? y : 0;
this.move(x,y);
return this;
},
/*
* 停止
*/
stop: function(){
if(!!this.timerId){
clearInterval(this.timerId);
}
return this;
},
/*
* 变成整数
* isFinite() 函数用于检查其参数是否是无穷大。
*/
_toInteger: function(text){
text = parseInt(text);
return isFinite(text) ? text : 0;
}
};
var defaultConfig = {
//需要运动的元素 {object | string}
el: null, // 运动的元素在 X轴,Y轴的偏移位置
offset: [0,0], // 终点元素
targetEl: null, // 运动时间,默认为500毫秒
duration: 500, // 抛物线曲率,就是弯曲的程度,越接近于0越像直线,默认0.001
curvature: 0.01, // 运动后执行的回调函数
callback: null, // 是否自动开始运动,默认为false
autostart: false, // 运动过程中执行的回调函数,this指向该对象,接受x,y参数,分别表示X,Y轴的偏移位置。
stepCallback: null
};
HTML代码如下:
<div class="btns" style="margin-top:20px">
<a href="#" id="reset">重置</a>
<a href="#" id="run">开始运动</a>
<a href="#" id="stop">停止运动</a>
<a href="#" id="setOptions">设置配置参数</a>
</div>
<div id="boll" class="boll"></div>
<div id="target" class="target"></div>
JS初始化如下方式:
var bool = new Parabola({
el: "#boll",
offset: [500, 100],
duration: 500,
curvature: 0.005,
callback:function(){
alert("完成后回调")
},
stepCallback:function(x,y){
$("<div>").appendTo("body").css({
"position": "absolute",
"top": this.$elTop + y + 'px',
"left":this.$elLeft + x + 'px',
"background-color":"#CDCDCD",
"width":"5px",
"height":"5px",
"border-radius": "5px"
});
}
});
$("#reset").click(function (event) {
event.preventDefault();
bool.reset();
});
$("#run").click(function (event) {
event.preventDefault();
bool.start();
});
$("#stop").click(function (event) {
event.preventDefault();
bool.stop();
});
$("#setOptions").click(function (event) {
event.preventDefault();
bool.setOptions({
targetEl: $("#target"),
curvature: 0.001,
duration: 1000
});
});
javascript仿天猫加入购物车动画效果的更多相关文章
- JavaScript仿淘宝实现放大镜效果的实例
我们都知道放大镜效果一般都是用于一些商城中的,列如每当我们打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大镜的效果.在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是 ...
- javascript实现汉诺塔动画效果
javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...
- 【转】Android 实现蘑菇街购物车动画效果
原文出处:http://blog.csdn.net/wangjinyu501/article/details/38400479 1.思路 目前想到两种方式实现这种效果,一是使用Tween动画,直截 ...
- Android 实现蘑菇街购物车动画效果
版本号:1.0 日期:2014.8.6 版权:© 2014 kince 转载注明出处 使用过蘑菇街的用户基本上都知道有一个增加购物车的动画效果,此处不详细描写叙述想知道的能够去下载体验一下. 1 ...
- 仿网易nec首页动画效果
仿网页nec首页动画效果nec链接:http://nec.netease.com/ 首先,介绍animationanimation检索或设置对象所应用的动画特效.animation由“keyframe ...
- JQuery模拟实现天猫购物车动画效果
测试程序源代码下载地址:源码 一.功能描述: 1.点击购买按钮,模拟抛物线将物品弹到购物车里: 2.购物车添加物品后,显示+1动画: 效果图如下: 实现如下: 1.导入jquery相关的包: < ...
- Android应用系列:仿MIUI的Toast动画效果实现(有图有源码)
前言 相信有些人用过MIUI,会发现小米的Toast跟Android传统的Toast特么是不一样的,他会从底部向上飞入,然后渐变消失.看起来效果是挺不错的,但是对于Android原生Toast是不支持 ...
- Android应用系列:仿MIUI的Toast动画效果实现
前言 相信有些人用过MIUI,会发现小米的Toast跟Android传统的Toast特么是不一样的,他会从底部向上飞入,然后渐变消失.看起来效果是挺不错的,但是对于Android原生Toast是不支持 ...
- 使用JavaScript和Canvas实现下雪动画效果
该下雪动画效果使用了HTML5中Canvas画布实现,其中涉及了物理学中曲线运动的相关知识与运算. index.html <!DOCTYPE html> <html lang=&qu ...
随机推荐
- LeetCode 笔记25 Candy (艰难的调试)
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- 实验二 Linux下C语言编程基础
1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...
- ios——MPMoviePlayerController截取视频缩略图 播放视频又可以截取视频缩略图
#import <AVKit/AVKit.h>#import <MediaPlayer/MediaPlayer.h>#import "ViewController.h ...
- WINDOWS下用脚本运行redis和mongodb
开发环境每次开麻烦,又不想建service,用bat最简单 @echo off echo 打开NOSLQ服务 start E:\nosql\mongodb\mongod.exe -dbpath e:\ ...
- 小白学习mysql之函数
## 导语 曾经我以为,学会了select.update.insert和delete之后,我就学会了数据库~,要不是到公司看到SQL里充满了密密麻麻的的各种函数,我差点就信了~,当初的自己是多么的天真 ...
- Windows Phone8 中如何引用 SQLite 数据库
SQLite数据库介绍 1.SQLite是一款轻型的嵌入式数据库,使用C++开发,使用非常广泛 2.SQLite是一款跨平台的数据库,支持Windows.Linux.Android.IOS.Windo ...
- 这些天自身努力的体会,关于java方面的
以前也是接触过java,这学期的软件工程课和周围同学各种比赛取得不错的成绩,确实令人倍感压力.为此这几天使劲脑补了一下java的知识,甚至不惜为此翘课,了解了java中的网络编程,对于sokectse ...
- java设计模式--原始模型模式
简介 原始模型模式属于对象的创建模式.通过一个原型对象来指明要创建对象的类型,然后用复制原型对象的方法来创建出更多同类型的对象. Java所有的类都是从java.lang.Object类继承来的,Ob ...
- iOS开发小技巧--字典和数组的中文输出
一.在解析json数据的时候,得到的集合对象或者数组对象在用%@打印的时候回出现类似乱码的情况.如图: 在iOS中打印字典或者数组对象,系统会默认调用字典对象和数组对象的descriptionWith ...
- hdu3308 线段树 区间合并
给n个数字 U表示第A个数改为B.A是从0开始. Q输出最大的递增序列个数. 考虑左边,右边,和最大的. #include<stdio.h> #define lson l,m,rt< ...