精准猎取科技资讯,天堂视频在线观看,高效阅读科技新闻_黄色av网站在线免费观看_科技猎

JavaScript實現(xiàn)的拋物線運動效果 – WEB前端開發(fā)

我是創(chuàng)始人李巖:很抱歉!給自己產品做個廣告,點擊進來看看。  

最近做購物車功能,看到天貓上的購物車有元素拋物線運動效果,所以也想湊熱鬧實現(xiàn)一個。

網(wǎng)上搜索了一下,看了一下張鑫旭的《 小折騰:JavaScript與元素間的拋物線軌跡運動 》,原理張鑫旭已經講的很清楚了,多說了也沒什么意思,就是數(shù)學公式。不過看代碼個人覺得有點變扭,那不是我的習慣,所以自己重新寫了一個。

先看demo: http://www.css88.com/demo/parabola/index.html

如何使用:

運動位移的元素必須設置為 position: absolute ,通過絕對定位控制 lefttop 來實現(xiàn)的;

首先你可以 new 一個對象:

		var bool = new Parabola({
		el: "#boll",
		offset: [500, 100],
		curvature: 0.005,
		duration: 3000,
		callback: function () {
		alert("完成后回調")
		},
		stepCallback: function (x, y) {
		console.log(x, y);
		$("<div>").appendTo("body").css({
		"position": "absolute",
		"top": this.elOriginalTop + y,
		"left": this.elOriginalLeft + x,
		"background-color": "#CDCDCD",
		"width": "5px",
		"height": "5px",
		"border-radius": "5px"
		});
		}
		});
	

參數(shù)說明:

參數(shù)名 數(shù)據(jù)類型 默認值 描述
el jQuery||String(選擇器) null 必須填寫的參數(shù),要移動的元素,可以是jQuery對象或選擇器
offset Array [0, 0] 表示移動元素在X,Y軸的偏移位置,設置了targetEl參數(shù)后,該參數(shù)將失效
targetEl jQuery||String(選擇器) null 終點元素,這時就會自動獲取該元素的left、top值,來表示移動元素在X,Y軸的偏移位置;設置了這個參數(shù),offset將失效
duration Number 500 運動的時間,默認500毫秒
curvature Number 0.001 拋物線曲率,就是彎曲的程度,越接近于0越像直線,默認0.001
callback Function null 運動后執(zhí)行的回調函數(shù),this指向該對象
stepCallback Function null 運動過程中執(zhí)行的回調函數(shù),this指向該對象,接受x,y參數(shù),分別表示X,Y軸的偏移位置。
autostart Boolean false 是否自動開始運動,默認為false

方法:

.reset()

重置元素的位置

.start()

開始執(zhí)行動畫

.stop()

停止動畫

.setOptions(options)

重置options參數(shù)

先看demo: http://www.css88.com/demo/parabola/index.html

JS代碼:

		;
		(function () {
		var _$ = function (_this) {
		return _this.constructor == jQuery ? _this : $(_this);
		};
		// 獲取當前時間
		function now() {
		return +new Date();
		}
		// 轉化為整數(shù)
		function toInteger(text) {
		text = parseInt(text);
		return isFinite(text) ? text : 0;
		}
		var Parabola = function (options) {
		this.initialize(options);
		};
		Parabola.prototype = {
		constructor: Parabola,
		/**
		* 初始化
		* @classDescription 初始化
		* @param {Object} options 插件配置 .
		*/
		initialize: function (options) {
		this.options = this.options || this.getOptions(options);
		var ops = this.options;
		if (!this.options.el) {
		return;
		}
		this.$el = _$(ops.el);
		this.timerId = null;
		this.elOriginalLeft = toInteger(this.$el.css("left"));
		this.elOriginalTop = toInteger(this.$el.css("top"));
		// this.driftX X軸的偏移總量
		//this.driftY Y軸的偏移總量
		if (ops.targetEl) {
		this.driftX = toInteger(_$(ops.targetEl).css("left")) - this.elOriginalLeft;
		this.driftY = toInteger(_$(ops.targetEl).css("top")) - this.elOriginalTop;
		} else {
		this.driftX = ops.offset[0];
		this.driftY = ops.offset[1];
		}
		this.duration = ops.duration;
		// 處理公式常量
		this.curvature = ops.curvature;
		// 根據(jù)兩點坐標以及曲率確定運動曲線函數(shù)(也就是確定a, b的值)
		//a=this.curvature
		/* 公式: 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.driftY - this.curvature * this.driftX * this.driftX ) / this.driftX;
		//自動開始
		if (ops.autostart) {
		this.start();
		}
		},
		/**
		* 初始化 配置參數(shù) 返回參數(shù)MAP
		* @param {Object} options 插件配置 .
		* @return {Object} 配置參數(shù)
		*/
		getOptions: function (options) {
		if (typeof options !== "object") {
		options = {};
		}
		options = $.extend({}, defaultSetting, _$(options.el).data(), (this.options || {}), options);
		return options;
		},
		/**
		* 定位
		* @param {Number} x x坐標 .
		* @param {Object} y y坐標 .
		* @return {Object} this
		*/
		domove: function (x, y) {
		this.$el.css({
		position: "absolute",
		left: this.elOriginalLeft + x,
		top: this.elOriginalTop + y
		});
		return this;
		},
		/**
		* 每一步執(zhí)行
		* @param {Data} now 當前時間 .
		* @return {Object} this
		*/
		step: function (now) {
		var ops = this.options;
		var x, y;
		if (now > this.end) {
		// 運行結束
		x = this.driftX;
		y = this.driftY;
		this.domove(x, y);
		this.stop();
		if (typeof ops.callback === 'function') {
		ops.callback.call(this);
		}
		} else {
		//x 每一步的X軸的位置
		x = this.driftX * ((now - this.begin) / this.duration);
		//每一步的Y軸的位置y = a*x*x + b*x + c;   c==0;
		y = this.curvature * x * x + this.b * x;
		this.domove(x, y);
		if (typeof ops.stepCallback === 'function') {
		ops.stepCallback.call(this);
		}
		}
		return this;
		},
		/**
		* 設置options
		*  @param {Object} options 當前時間 .
		*/
		setOptions: function (options) {
		this.reset();
		if (typeof options !== "object") {
		options = {};
		}
		this.options = this.getOptions(options);
		this.initialize('parabola', this.options);
		return this;
		},
		/**
		* 開始
		*/
		start: function () {
		var self = this;
		// 設置起止時間
		this.begin = now();
		this.end = this.begin + this.duration;
		if (this.driftX === 0 && this.driftY === 0) {
		// 原地踏步就別浪費性能了
		return;
		}
		/*timers.push(this);
		Timer.start();*/
		if (!!this.timerId) {
		clearInterval(this.timerId);
		this.stop();
		}
		this.timerId = setInterval(function () {
		var t = now();
		self.step(t);
		}, 13);
		return this;
		},
		/**
		* 重置
		*/
		reset: function (x, y) {
		this.stop();
		x = x ? x : 0;
		y = y ? y : 0;
		this.domove(x, y);
		return this;
		},
		/**
		* 停止
		*/
		stop: function () {
		if (!!this.timerId) {
		clearInterval(this.timerId);
		}
		return this;
		}
		};
		var defaultSetting = {
		el: null,
		//偏移位置
		offset: [0, 0],
		//終點元素,這時就會自動獲取該元素的left、top,設置了這個參數(shù),offset將失效
		targetEl: null,
		//運動的時間,默認500毫秒
		duration: 500,
		//拋物線曲率,就是彎曲的程度,越接近于0越像直線,默認0.001
		curvature: 0.001,
		//運動后執(zhí)行的回調函數(shù)
		callback: null,
		// 是否自動開始,默認為false
		autostart: false,
		//運動過程中執(zhí)行的回調函數(shù)
		stepCallback: null
		};
		window.Parabola = Parabola;
		})();
	

本文被轉載1次

首發(fā)媒體 Web前端開發(fā) | 轉發(fā)媒體

隨意打賞

提交建議
微信掃一掃,分享給好友吧。
主站蜘蛛池模板: 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] | 吨袋包装机|吨包秤|吨包机|集装袋包装机-烟台华恩科技 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 九爱图纸|机械CAD图纸下载交流中心 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 冷却塔降噪隔音_冷却塔噪声治理_冷却塔噪音处理厂家-广东康明冷却塔降噪厂家 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 不锈钢螺丝,不锈钢螺栓,不锈钢标准件-江苏百德特种合金有限公司 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 济南菜鸟驿站广告|青岛快递车车体|社区媒体-抖音|墙体广告-山东揽胜广告传媒有限公司 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 粘度计,数显粘度计,指针旋转粘度计| 潜水搅拌机-双曲面搅拌机-潜水推进器|奥伯尔环保 | 包塑软管|金属软管|包塑金属软管-闵彬管业 | 保定市泰宏机械制造厂-河北铸件厂-铸造厂-铸件加工-河北大件加工 | 打造全球沸石生态圈 - 国投盛世 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 专业的压球机生产线及解决方案厂家-河南腾达机械厂 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | 道达尔润滑油-食品级润滑油-道达尔导热油-合成导热油,深圳道达尔代理商合-深圳浩方正大官网 | 首页 - 军军小站|张军博客 | 翅片管散热器价格_钢制暖气片报价_钢制板式散热器厂家「河北冀春暖气片有限公司」 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 钢结构-钢结构厂房-钢结构工程[江苏海逵钢构厂] | 安徽成考网-安徽成人高考网 | 熔体泵|换网器|熔体齿轮泵|熔体计量泵厂家-郑州巴特熔体泵有限公司 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 地图标注|微信高德百度地图标注|地图标记-做地图[ZuoMap.com] | 奥运星-汽车性能网评-提供个性化汽车资讯 | 四川成人高考_四川成考报名网 | 南京欧陆电气股份有限公司-风力发电机官网 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 北京网络营销推广_百度SEO搜索引擎优化公司_网站排名优化_谷歌SEO - 北京卓立海创信息技术有限公司 |