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 ...
随机推荐
- 使用IDEA进行代码托管
在idea菜单栏的file中打开settings/搜索git,配置path to Git executable:C:\Program Files\Git\bin\git.exe(git bash的安装 ...
- 微信小程序开发:Flex布局
微信小程序页面布局方式采用的是Flex布局.Flex布局,是W3c在2009年提出的一种新的方案,可以简便,完整,响应式的实现各种页面布局.Flex布局提供了元素在容器中的对齐,方向以及顺序,甚至他们 ...
- JavaScript 里 new 出来的对象 怎么销毁它?
JavaScript的规范(ECMA-262 ECMAScript)没规定JavaScript引擎要如何实现对JavaScript对象的内存管理.实际实现中几乎所有JavaScript引擎都使用基于跟 ...
- [Bug]当IDENTITY_INSERT设置为OFF时,不能为表“xx”中的标识列插入显示的值
写在前面 在设计数据库表时,将主键设置为了自增的.在使用linq to sql的时候,添加数据,出现此错误. 解决方案 找到linq to sql生成的**.dbml文件,在对应的表上面右键修改其属性 ...
- AngularJS开发指南7:AngularJS本地化,国际化,以及兼容IE低版本浏览器
AngularJS本地化,国际化 国际化,简写为i18n,指的是使产品快速适应不同语言和文化. 本地化,简称l10n,是指使产品在特定文化和语言市场中可用. 对开发者来说,国际化一个应用意味着将所有的 ...
- 每天一个linux命令(11):less 命令
less 工 具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性. 在 more 的时候,我们并没有办法向前 ...
- 每天一个linux命令(8):cat 命令
cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...
- u1-nav-css
header:before, header:after ,.navigation:before, .navigation:after,.nav-row:before, .nav-row:after,. ...
- Fluent Ribbon项目出现“命名空间“clr-namespace:Fluent;assembly=Fluent”中不存在“RibbonWindow”名称”的解决方法
之前在学习@aganqin的Fluent Ribbon项目(http://www.cnblogs.com/aganqin/p/3269384.html).但是一直都有引用了Fluent.dll后仍旧出 ...
- 遍历HashMap的四种方法
public static void main(String[] args) { Map<String,String> map=new HashMap<String,String&g ...