javascript仿天猫加入购物车动画效果

  注意:首先需要声明的是:代码原思路不是我写的,是在网上找的这种效果,自己使用代码封装了下而已;代码中都有注释,我们最主要的是理解抛物线的思路及在工作中完成这样的任务,最近需要做类似于天猫加入购物车动画效果,所以就在网上搜索了下,就看到类似的效果,就把代码截下来自己封装了下~~

如果想要了解抛物线的细节,我建议大家先 看下 张鑫旭 讲解的抛物线的文章,再来看如下JS代码,可能理解更深点~~

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/

首先我们来理解的是: 既然是抛物运动,那么 运动的元素肯定需要 "绝对定位";配置的参数有如下:(依赖于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抛物线运动效果

下面是所有的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
});
});

JS源码下载

javascript仿天猫加入购物车动画效果的更多相关文章

  1. JavaScript仿淘宝实现放大镜效果的实例

    我们都知道放大镜效果一般都是用于一些商城中的,列如每当我们打开淘宝,天猫等pc端时,看到心仪的物品时,点击图片时,便呈现出放大镜的效果.在没有去理解分析它的原理时,感觉非常的神奇,当真正地去接触,也是 ...

  2. javascript实现汉诺塔动画效果

    javascript实现汉诺塔动画效果 当初以为不用html5也很简单,踩了javascript单线程的大坑后终于做出来了,没事可以研究下,对理解javascript的执行过程还是很有帮助的,代码很烂 ...

  3. 【转】Android 实现蘑菇街购物车动画效果

    原文出处:http://blog.csdn.net/wangjinyu501/article/details/38400479 1.思路   目前想到两种方式实现这种效果,一是使用Tween动画,直截 ...

  4. Android 实现蘑菇街购物车动画效果

    版本号:1.0  日期:2014.8.6 版权:© 2014 kince 转载注明出处   使用过蘑菇街的用户基本上都知道有一个增加购物车的动画效果,此处不详细描写叙述想知道的能够去下载体验一下. 1 ...

  5. 仿网易nec首页动画效果

    仿网页nec首页动画效果nec链接:http://nec.netease.com/ 首先,介绍animationanimation检索或设置对象所应用的动画特效.animation由“keyframe ...

  6. JQuery模拟实现天猫购物车动画效果

    测试程序源代码下载地址:源码 一.功能描述: 1.点击购买按钮,模拟抛物线将物品弹到购物车里: 2.购物车添加物品后,显示+1动画: 效果图如下: 实现如下: 1.导入jquery相关的包: < ...

  7. Android应用系列:仿MIUI的Toast动画效果实现(有图有源码)

    前言 相信有些人用过MIUI,会发现小米的Toast跟Android传统的Toast特么是不一样的,他会从底部向上飞入,然后渐变消失.看起来效果是挺不错的,但是对于Android原生Toast是不支持 ...

  8. Android应用系列:仿MIUI的Toast动画效果实现

    前言 相信有些人用过MIUI,会发现小米的Toast跟Android传统的Toast特么是不一样的,他会从底部向上飞入,然后渐变消失.看起来效果是挺不错的,但是对于Android原生Toast是不支持 ...

  9. 使用JavaScript和Canvas实现下雪动画效果

    该下雪动画效果使用了HTML5中Canvas画布实现,其中涉及了物理学中曲线运动的相关知识与运算. index.html <!DOCTYPE html> <html lang=&qu ...

随机推荐

  1. 坑死我啊,一个WPF Adorner使用注意事项

    1.见鬼了? 项目中遇到这样的要求,一个Button用一个Adorner装饰,这个Adorner上又有一个Button,如下面这样 此时,我们在点击小Button的时候只希望处理小Button的事件, ...

  2. 使用mobile.changePage()时出现的问题(转)

    使用mobile.changePage()页面跳转,当跳转到目标页面时,目标页面中的初始化js如$().ready()及其他引入的js都无法执 行,重新刷新页面后才会执行.想到changePage() ...

  3. php中的错误级别

    在php编程过程中,大家一定会遇到或多或少的错误提醒,也正是这些错误提示,指引我们编写更加干净的代码,今天先写出我们主要列出的错误类型,先挖坑,写关于php错误与异常的相关知识,慢慢填坑.    De ...

  4. JS开发HTML5游戏《神奇的六边形》(三)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  5. 谏牲口TT十思疏

    予闻:求木之长着,必固其根本:欲流之远者,必浚其泉源:思吾之长者,必积其学识.源不深而望流之远,根不固而求木之长,识不积而思指日之安,斯虽下愚,知其不可,而况于TT乎?TT当举家之重,虑只此一生,将孝 ...

  6. SVN技术交流提纲

    SVN技术交流提纲:http://lazio10000.github.io/tech/SVN/#/bored

  7. JavaScript表单处理(下)

    内容提纲: 1.文本框脚本 2.选择框脚本 发文不易,转载请亲注明链接出处,谢谢!   一.文本框脚本 在HTML中,有两种方式来表现文本框: 一种是单行文本框<input type=" ...

  8. 软工实践练习一(个人)----将Androidstudio的项目共享到github

    在Androidstudio上使用git插件 将项目共享至github 将 显示共享成功但是出了点问题 项目文件并没有上传至github库中,而是只创建了一个新的库 问题在于我的gitforwindo ...

  9. android学习——Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  10. oracle-2中commit 详解

    博文转自:http://blog.csdn.net/hzhsan/article/details/9719307 它执行的时候,你不会有什么感觉.commit在数据库编程的时候很常用,当你执行DML操 ...