詳解如何在Canvas上實現(xiàn)坐標定位
本文,我們將來講解如何在 canvas 上實現(xiàn)坐標的定位,如下效果圖所示:
我們順便還顯示了一個拖拽的功能,當然這個并不是使用 canvas
繪制,后面會講到。
我們設(shè)定 HTML
的代碼如下:
<!-- 畫布 --> <canvas id="canvas"></canvas> <!-- 拖拽的元素 --> <div id="move-content">(0, 0)</div>
我們添加點樣式潤色下:
html, body { width: 100%; height: 100%; position: relative; } * { padding: 0; margin: 0; } #canvas { width: 100%; height: 100%; margin: 0 auto; } #move-content { position: absolute; border: 1px solid red; padding: 12px; z-index: 999; top: 0; left: 0; }
上面,我們設(shè)定了畫布的寬高繼承父元素,均為100%
。
下面是重點??
繪制線條
線條的繪制很簡單,我們直接調(diào)用函數(shù):
ctx.moveTo(beginPointX, beginPointY); ctx.lineTo(endPointX, endPointY);
重點是,我們應(yīng)該怎么獲取到開始點和結(jié)束的點呢?
Yeah! 我們獲取到鼠標當前相對的原點位置,那不就行了。
let canvasDom = document.getElementById("canvas"); canvasDom.width = canvasDom.parentNode.clientWidth; canvasDom.height = canvasDom.parentNode.clientHeight; let ctx = canvasDom.getContext("2d"); ctx.strokeStyle = "red"; ctx.lineWidth = 1; ctx.font = "14px Arial"; ctx.textAlign = "center"; ctx.textBaseline = "middle";
首先,我們獲取畫布元素并設(shè)定畫布的寬和高。并且設(shè)置畫筆 ctx
的粗細,顏色。繪制字體的大小,字體等。
接下來,我們監(jiān)聽鼠標的移動事件并繪制坐標:
let draggableElement = document.getElementById("move-content"); canvasDom.addEventListener("mousemove", (event) => { clearRect(); let react = canvasDom.getBoundingClientRect(); let x = event.clientX - react.left; let y = event.clientY - react.top; // 繪制十字架 ctx.beginPath(); ctx.moveTo(0, y); ctx.lineTo(canvasDom.width, y); ctx.stroke(); ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, canvasDom.height); ctx.stroke(); // 繪制文本 ctx.fillText(`(${x}, ${y})`, x, y); draggableElement.innerText = `(${x}, ${y})` }) // 清空畫布 canvasDom.addEventListener("mouseout", () => { clearRect(); })
getBoundingClientRect() 是 DOM 元素對象的方法,用于獲取該元素相對于視口的位置和尺寸信息。
該方法返回一個 DOMRect 對象,其中包含以下屬性: x: 元素左邊界相對于視口左邊界的距離
y: 元素上邊界相對于視口上邊界的距離
width: 元素的寬度
height: 元素的高度
top: 元素上邊界相對于視口上邊界的距離
right: 元素右邊界相對于視口左邊界的距離
bottom: 元素下邊界相對于視口上邊界的距離
left: 元素左邊界相對于視口左邊界的距離
我們來講個題外話,怎么實現(xiàn) DIV
的拖拽。
實現(xiàn)拖拽動效
實現(xiàn)元素的拖拽,我們只需要監(jiān)聽 mousedown
,mousemove
和 mouseup
事件即可:
let draggableElement = document.getElementById("move-content"); let isDragging = false; let offset = { x: 0, y: 0 }; draggableElement.addEventListener("mousedown", function(event) { isDragging = true; // 計算鼠標相對于元素的偏移量 let rect = draggableElement.getBoundingClientRect(); offset.x = event.clientX - rect.left; offset.y = event.clientY - rect.top; }); document.addEventListener('mousemove', function(event) { if (!isDragging) return; // 阻止默認事件,避免拖拽過程中選中文本等問題 event.preventDefault(); // 計算元素應(yīng)該移動到的位置 var x = event.clientX - offset.x; var y = event.clientY - offset.y; // 應(yīng)用新的位置到元素 draggableElement.style.transform = `translate(${x}px, ${y}px)`; }); document.addEventListener('mouseup', function() { isDragging = false; });
上面的代碼一目了然,需要注意的是,我們應(yīng)用新的位置到元素的時候,使用的樣式是 draggableElement.style.transform
,調(diào)用的是屬性 transform
,而不是 top, left
等相對定位。是因為 transform
的性能更友好,這一步是在合成線程中進行,避免了重排的情況。
到此這篇關(guān)于詳解如何在Canvas上實現(xiàn)坐標定位的文章就介紹到這了,更多相關(guān)Canvas實現(xiàn)坐標定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
ECMAScript?數(shù)據(jù)類型之Number類型
這篇文章主要介紹了?ECMAScript?數(shù)據(jù)類型之Number類型,Number類型使用IEEE?754格式表示整數(shù)和浮點值,更多相關(guān)內(nèi)容請需要的小伙伴參考下面文章內(nèi)容2022-06-06JavaScript實現(xiàn)簡易輪播圖最全代碼解析(ES5)
這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)簡易輪播圖最全代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09async/await讓異步操作同步執(zhí)行的方法詳解
這篇文章主要給大家介紹了關(guān)于async/await讓異步操作同步執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者使用async/await具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-11-11微信開發(fā) JS-SDK 6.0.2 經(jīng)常遇到問題總結(jié)
本篇文章主要介紹了"微信微信JS-SDK 6.0.2 遇到問題 ",主要涉及到微信微信JS-SDK 6.0.2 填坑筆記 方面的內(nèi)容,對于微信微信JS-SDK 6.0.2 填坑筆記 感興趣的同學可以參考一下。2016-12-12JavaScript代碼調(diào)試方法實例小結(jié)
這篇文章主要介紹了JavaScript代碼調(diào)試方法,結(jié)合實例形式總結(jié)分析了JavaScript錯誤信息的處理與代碼調(diào)試相關(guān)操作技巧,需要的朋友可以參考下2019-01-01