碰撞運動+重力+拖拽+摩擦力

来源:http://www.cnblogs.com/xiaojiangk/archive/2017/10/17/7680823.html
-Advertisement-
Play Games

...


<!DOCTYPE html>
<html>
	<head>
		<title></title>
		<meta charset='utf-8' /> 
		<style>
		  #div1{width: 100px; height: 100px; background: red; position: absolute; left: 0; top: 40px;}
		</style>
<script>

//添加拖拽功能

window.onload=function(){
	var oDiv=document.getElementById('div1');

	//當在oDiv中點擊滑鼠(這裡會用到事件對象),則將獲取X,Y滑鼠當前位置-oDiv
	//當前的left和top值,獲取到滑鼠離oDiv最左邊/上邊的距離
	oDiv.onmousedown=function(ev){
		var oEvent=ev || event;

		var disX=oEvent.clientX-oDiv.offsetLeft;
		var disY=oEvent.clientY-oDiv.offsetTop;

		//當在文檔中移動滑鼠時,則將當前滑鼠坐標-已處理好的disX和disY,獲取到oDiv.left/top值
		document.onmousemove=function(ev){
			var oEvent=ev || event;

			var l=oEvent.clientX-disX;
			var t=oEvent.clientY-disY;

			//oDiv的left/top值=獲取到的oDiv.left/top值,則用戶如何移動left/top隨之改變
			oDiv.style.left=l+"px";
			oDiv.style.top=t+"px";
		};

		//當滑鼠在文檔鬆開時,則把滑鼠移動/鬆開的方法置空.
		document.onmouseup=function(){
			document.onmousemove=null;
			document.onmouseup=null;

			//在滑鼠鬆開時調用startMove函數,實現自由彈跳
			startMove();
		};

		//當滑鼠移動時,則關閉定時器,為了避免跟startMove函數搶定時器.
		 clearInterval(timer);
	};
};


//定義X和Y軸速度;
var speedX=25;
var speedY=100;
var timer=null;

function startMove(){
	clearInterval(timer);
	timer=setInterval(function(){
		var oDiv=document.getElementById("div1");
		//每次Y軸+2,越彈越高
		speedY+=5;
		//把X,Y軸速度存起來,便意使用
		var l=oDiv.offsetLeft+speedX;
		var t=oDiv.offsetTop+speedY;

		//當T大於了可視化區域-oDIV的高度,就使oDiv越來越慢,隨之等於可視化區域-oDiv當前高度.避免了撐大可視化區域
		if(t>document.documentElement.clientHeight-oDiv.offsetHeight)
		{
			//Y*-0.8 使越彈越矮;當然也要讓X軸越來越小,隨之T等於可視化區域-oDiv當前高度
			speedY*=-0.8;
			speedX*=0.8;
			t=document.documentElement.clientHeight-oDiv.offsetHeight;
		}

		//當T小餘等於0時,使Y軸*=-0.8,使越彈越矮;當然也使X軸變慢,隨之T=0,避免了撐大可視化區域
		else if(t<=0){
			speedY*=-1;
			speedX*=0.8
			t=0;
		}

		//當L大於了可視化區域-oDIV的寬度,就使oDiv越來越慢,隨之等於可視化區域-oDiv當前寬度.避免了撐大可視化區域
		if(l>document.documentElement.clientWidth-oDiv.offsetWidth)
		{
			//X*-0.8 使越彈越矮,隨之L等於可視化區域-oDiv當前高度
			speedX*=-0.8;
			l=document.documentElement.clientWidth-oDiv.offsetWidth
		}

		//當L小餘等於0時,使X軸*=-0.8,使越彈越矮;隨之L=0,避免了撐大可視化區域
		else if(l<=0){
			speedX*=-0.8;
			l=0;
		}

		//當X和Y軸的絕對值小餘1時,則X和Y軸=0; 避免負小數點出現誤差
		if(Math.abs(speedX)<1){
			speedX=0;
		}
		if(Math.abs(speedY)<1){
			speedY=0;
		}

		//停止條件:當X,Y軸速度都為0時,並且t=可視化高度-oDiv.offsetHeight,則關閉定時器
		if(speedX==0 && speedY==0 && t==document.documentElement.clientHeight-oDiv.offsetHeight){
			clearInterval(timer);
		}else{

		//添加oDIV速度
		oDiv.style.left=l+"px";
		oDiv.style.top=t+"px";
			}

		document.title=speedX;
	},30)
}
</script>
	</head>
	<body>
		<input type="button" value="開始運動" onclick="startMove()"/>
		<div id="div1"></div>
	</body>
</html>

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Given an array of n integers and q queries. Write a program to print floor value of mean in range l to r for each query in a new line. Input: The firs ...
  • #include #include using namespace std; //保留2位小數 int main(){ double x=123.456; double y=3.14159; double z=-3214.67; cout<<setiosflags(ios::fixed)<<seti... ...
  • Description:Java SE 9 is the latest update to the Java Platform(General Availability on 21 September 2017). This release includes much awaited new fea ...
  • 除了nodejs之外,後端技術(php/java等)及環境搭建一直都是大多數web前端開發人員的弱項,而且每當公司里進來一個新的前端開發人員,第一件事情要做的就是搭建開發環境,需要在新的電腦上安裝IDE、nodejs、npm以及團隊裡面需要用到的技術所需要的依賴,一般需要花費一兩天時間;另外,如果團 ...
  • 背景 公司業務由數以百計的分散式服務溝通,每一個請求路由過來後,會經過多個業務系統並留下足跡,並產生對各種緩存或者DB的訪問,但是這些分散的數據對於問題排查,或者流程優化比較有限。對於一個跨進程的場景,彙總收集並分析海量日誌就顯得尤為重要。在這種架構下,跨進程的業務流會經過很多個微服務的處理和傳遞, ...
  • 背景 隨著公司業務的高速發展以及數據爆炸式的增長,當前公司各產線都有關於搜索方面的需求,但是以前的搜索服務系統由於架構與業務上的設計,不能很好的滿足各個業務線的期望,主要體現下麵三個問題: 1. 不能支持對語句級別的搜索,大量業務相關的屬性根本無法實現 2. 沒有任何搜索相關的指標評價體系 3. 擴 ...
  • 銜接上文[解讀REST] 4.基於網路應用的架構風格,上文總結了一些適用於基於網路應用的架構風格,以及其評估結果。在前文的基礎上,本文介紹一下Web架構的需求,以及在對Web的關鍵協議進行設計和改進的過程中遇到的問題;以及在對基於網路應用的架構風格進行評估的過程中的領悟;結合Web的需求進而推導出R ...
  • 本文純屬自己研究所寫筆記,如果有錯誤還請多多指教提出 版心(container) 版心:class名為.container的容器,其版心的寬度在各個屏幕設備下是不一樣的值,版心兩邊就是留白。 各尺寸下版心寬度如下表: 屏幕設備版心寬度 max-width:768px xs 繼承父元素寬度(即widt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...