JavaScript實作拖曳元素對齊到網格(每次移動固定距離)
這幾天在做一個拖曳元素的附加功能,就是對齊到網格,實際上就是確定好元素的初始位置,然後拖曳元素時,每次移動固定的距離。讓元素都可以在網格內對齊。先上效果圖,然後在詳細說明細節問題
做了一個gif圖,可以看到,每次元素的移動都是按照最小單位距離移動的。且每次元素都是對齊到網格的。
先根據demo說明想法和細節,後面會給出demo程式碼。
1. 決定元素的每次移動的最小單位(demo中為10px和10px),也就是每次水平或垂直的位移量都是10px。鋪上一層網格背景是為了幫助我們更好的看到效果(demo中的每個網格也是10px * 10px)。
2. 為了可以更明顯的看到效果,初始化了元素的寬高(均為10px的倍數)和預設位置(同樣為10px的倍數)。舉例說明:元素寬高 50px * 50px,元素的初始位置為0xp * 0px。這樣做的好處是一開始載入時就可以保證元素覆蓋整數個的小網格(也就是 5 * 5 個小網格),不會出現覆蓋不完整的網格。這一條其實為了讓使用者或是有強迫症的人不用這麼糾結,其實只是一個美化規置位置的操作。懂的朋友可以不用這麼刻意,懂就好。
3. 最重要是如何確定何時移動固定的距離。這個demo效果要明白一件事:滑鼠移動和元素移動是對應的,但不是即時對等的(當然,如果不考慮最小單位,只是純拖曳元素,然後將元素的位置設定為滑鼠的位置,這時可以理解為滑鼠移動和元素移動是即時對等的)。回到demo說明,滑鼠在網頁上移動時,是一個像素一個像素移動的(可以透過console.log(e.pageX) 觀察滑鼠移動的位置 )。而元素是每10px移動一次。這一點就是我們要理解的關鍵,也是整個demo的關鍵。
了解了上面的思路,結合代碼和註釋,再說明一下:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> body{ margin:0px; padding:0px; } p{ margin:0px; padding:0px; } </style> <script src="js/jquery-1.11.2.js"></script> </head> <body> <p style="height: 600px;background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPiAgIC A8ZGVmcz4gICAgICAgIDxwYXR0ZXJuIGlkPSJncmlkIiB3aWR0aD0iMTAiIGhlaWdodD0iMTAiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPiAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMTAgMCBMIDAgMCAw IDEwIiBmaWxsPSJub25lIiBzdHJva2U9IiNkZGRkZGQiIHN0cm9rZS13aWR0aD0iMSIgb3BhY2l0eT0iMSIgLz4gICAgICAgIDwvcGF0dGVybj4gICAgPC9kZWZzPiAgICA8cmVjdCB3aWR0aD0iMTAwJSIgaGVpZ 2h0PSIxMDAlIiBmaWxsPSJ1cmwoI2dyaWQpIiAvPjwvc3ZnPg==)"> <p id="bk" style="width:50px;height:50px;background: red;position: absolute"></p> </p> </body> <script> $(function(){ var orgX,orgY,eleX,eleY,hasMove=false; $("#bk").on("mousedown",function(e){ orgX= e.pageX; //记录鼠标的水平位置 orgY= e.pageY; //记录鼠标的垂直位置 eleX=$(this).offset().left; //记录元素的水平位置 eleY=$(this).offset().top; //记录元素的垂直位置 hasMove=true; //鼠标按下时标明当前元素可以拖拽标识 }); $(document).on("mousemove",function(e){ if(hasMove){ //当元素可以拖拽时执行操作 //新位置计算方法为元素的上次位置加上新的位移量 var left=eleX+Math.round( ( e.pageX - orgX ) / 10 ) * 10; var top= eleY+Math.round( ( e.pageY - orgY) / 10 ) * 10; //更新位置信息 $("#bk").css({ top:top, left:left }); } }).on("mouseup",function(e){ hasMove=false; //鼠标松开时设置元素不可拖拽 }); }) </script> </html>
面的代碼給出的較詳細的註釋,其中,最關鍵的程式碼就是
Math.round( ( e.pageX - orgX ) / 10 ) * 10;
該程式碼是計算元素新的位移量,用滑鼠的最新位置減去在元素按下時的滑鼠位置,除以最小單位10,進行四捨五入後得到整數值,然後在乘以最小單位10。就可以獲得元素應該需要移動的單位距離了。這條如果不懂可以運行程式碼自己思考體會一下。 (當然使用Mach的ceil和floor方法也可以)。
以上就是JavaScript實作拖曳元素對齊到網格(每次移動固定距離)的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

一、前言目前領先的目標偵測器是基於深度CNN的主幹分類器網路重新調整用途的兩級或單級網路。 YOLOv3就是這樣一種眾所周知的最先進的單級檢測器,它接收輸入圖像並將其劃分為大小相等的網格矩陣。具有目標中心的網格單元負責偵測特定目標。今天分享的,就是提出了一種新的數學方法,該方法為每個目標分配多個網格,以實現精確的tight-fit邊界框預測。研究者也提出了一種有效的離線複製貼上資料增強來進行目標偵測。新提出的方法顯著優於一些目前最先進的目標偵測器,並有望獲得更好的效能。二、背景目標偵測網路旨在使用

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。
