久草视频2-久草视-久草社区视频-久草色在线-久草色视频-久草软件

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

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

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

網(wǎng)上搜索了一下,看了一下張鑫旭的《 小折騰:JavaScript與元素間的拋物線軌跡運動 》,原理張鑫旭已經(jīng)講的很清楚了,多說了也沒什么意思,就是數(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;
		*/
		/*
		* 因為經(jīng)過(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ā)媒體

隨意打賞

提交建議
微信掃一掃,分享給好友吧。
主站蜘蛛池模板: yellow视频在线观看 | 干操网| 色无月| 亚洲国产精品久久无套麻豆 | 天堂资源在线8 | 亚洲七七久久综合桃花 | 青青草原国产一区二区 | 亚洲精品二三区伊人久久 | 男人的天堂在线观看视频不卡 | 韩国男女做性全过程视频 | 日韩毛片在线视频 | 女仆掀起蕾丝裙被打屁股作文 | 欧美三级不卡在线观线看高清 | 亚洲国产精品成人午夜在线观看 | 阿v天堂2020| 日韩精品欧美高清区 | 91精品国产9l久久久久 | 美女脱了内裤张开腿亲吻男生 | 成人综合网站 | 国产第一页无线好源 | 欧洲美女人牲交一级毛片 | 欧美三级小视频 | 欧美xxxxxbb| 午夜小视频网站 | 狠狠躁夜夜躁人人爽天天miya | 青青草亚洲 | mm在线| 毛片网站观看 | 久久高清一级毛片 | 国产成人一区二区三区小说 | 国产精品美女久久久久 | 免费二级毛片免费完整视频 | 欧美性野久久久久久久久 | 4455永久在线视频观看 | 亚洲国产天堂久久综合网站 | 久久精品黄AA片一区二区三区 | 精品美女国产互换人妻 | 日本人护士免费xxxx视频 | 热久久最新| 亚洲欧美韩国日产综合在线 | 奇米视频7777 |