本文主要跟大家分享js繪製拋物線程式碼,我們先和大大家展示效果圖,具體方法大家來一起看程式碼吧,希望能幫助大家。
效果圖:
<!DOCTYPE HTML><html><head> <meta charset="utf-8"> <title>抛物线运动效果</title> <style type="text/css"> body { overflow: hidden; } .boll { width: 50px; height: 50px; position: absolute; top: 55%; left: 55%; background: url("redpack_show.jpg"); background-size: contain; } .red-bag { position: absolute; left: 50%; top:50%; width: 200px; height: 200px; border-radius: 50%; background: url("red_bag.png") no-repeat; background-size: contain; z-index:10; } </style> <script type="text/javascript" src="jquery-2.1.4.js"></script> <script type="text/javascript" src="parabola.js"></script></head><body><p class="btns" style="margin-top:20px"> <a href="http://www.css88.com/archives/5355" target="_blank">回到JavaScript实现的抛物线运动效果</a></p><p class="btns" style="margin-top:20px"> <a href="#" class="btnA btn-danger" id="run" rel="popover" title="A Title" >run</a></p><p class="red-bag"></p><p id="target" class="target"></p><!--<p class="boll boll1"></p>--><script type="text/javascript"> for(let i=1;i<80;i++){ $("body").append(`<p class='boll boll${i}'></p>`); let bool = "bool"+i; createSingle(bool,i); // console.log(i) } function createSingle(bool,i) { let left = i%2 == 0 ? (-getRandom(500,600)):(getRandom(500,600)); let top = i%2 == 0? (getRandom(200,250)):(getRandom(200,250)); // console.log(getRandom(0.005,0.01)); bool = new Parabola({ el: ".boll"+i, offset: [left, top], curvature: 0.005, duration: 3000, callback:function(){ // alert("完成后回调") }, stepCallback:function(x,y){ // console.log(x,y); // $("<p>").appendTo("body").css({ // "position": "absolute", // "top": this.elOriginalTop + y, // "left":this.elOriginalLeft + x, // "background-color":"rgba(244,21,50,.5)", // "width":"2px", // "height":"2px", // "border-radius": "2px" // }); } }); $("#run").click(function (event) { event.preventDefault(); bool.start(); }); } function getRandom(min,max) { return Math.random()*(max-min)+min; } // $("#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 // }); // });</script></body></html>
(function () { var _$ = function (_this) { return _this.constructor == jQuery ? _this : $(_this); };// 获取当前时间 function now() { return +new Date(); }// 转化为整数 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; // 根据两点坐标以及曲率确定运动曲线函数(也就是确定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(); } }, /** * 初始化 配置参数 返回参数MAP * @param {Object} options 插件配置 . * @return {Object} 配置参数 */ 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; }, /** * 每一步执行 * @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,x,y); } } return this; }, /** * 设置options * @param {Object} options 当前时间 . */ setOptions: function (options) { this.reset(); if (typeof options !== "object") { options = {}; } this.options = $.extend(this.options,options); this.initialize(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,设置了这个参数,offset将失效 targetEl: null, //运动的时间,默认500毫秒 duration: 500, //抛物线曲率,就是弯曲的程度,越接近于0越像直线,默认0.001 curvature: 0.001, //运动后执行的回调函数 callback: null, // 是否自动开始,默认为false autostart: false, //运动过程中执行的回调函数 stepCallback: null }; window.Parabola = Parabola; })();
相關推薦:
#以上是js繪製拋物線程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器