欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解如何在Canvas上實(shí)現(xiàn)坐標(biāo)定位

 更新時(shí)間:2023年08月22日 13:57:22   作者:Jimmy  
這篇文章我們將來(lái)詳細(xì)的給大家講解一下如何在 canvas 上實(shí)現(xiàn)坐標(biāo)的定位,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下

本文,我們將來(lái)講解如何在 canvas 上實(shí)現(xiàn)坐標(biāo)的定位,如下效果圖所示:

我們順便還顯示了一個(gè)拖拽的功能,當(dāng)然這個(gè)并不是使用 canvas 繪制,后面會(huì)講到。

我們?cè)O(shè)定 HTML 的代碼如下:

<!-- 畫(huà)布 -->
<canvas id="canvas"></canvas>
<!-- 拖拽的元素 -->
<div id="move-content">(0, 0)</div>

我們添加點(diǎn)樣式潤(rùn)色下:

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;
}

上面,我們?cè)O(shè)定了畫(huà)布的寬高繼承父元素,均為100%。

下面是重點(diǎn)??

繪制線條

線條的繪制很簡(jiǎn)單,我們直接調(diào)用函數(shù):

ctx.moveTo(beginPointX, beginPointY);
ctx.lineTo(endPointX, endPointY);

重點(diǎn)是,我們應(yīng)該怎么獲取到開(kāi)始點(diǎn)和結(jié)束的點(diǎn)呢?

Yeah! 我們獲取到鼠標(biāo)當(dāng)前相對(duì)的原點(diǎn)位置,那不就行了。

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";

首先,我們獲取畫(huà)布元素并設(shè)定畫(huà)布的寬和高。并且設(shè)置畫(huà)筆 ctx 的粗細(xì),顏色。繪制字體的大小,字體等。

接下來(lái),我們監(jiān)聽(tīng)鼠標(biāo)的移動(dòng)事件并繪制坐標(biāo):

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})`
})
// 清空畫(huà)布
canvasDom.addEventListener("mouseout", () => {
  clearRect();
})

getBoundingClientRect()DOM 元素對(duì)象的方法,用于獲取該元素相對(duì)于視口的位置和尺寸信息。

該方法返回一個(gè) DOMRect 對(duì)象,其中包含以下屬性: x: 元素左邊界相對(duì)于視口左邊界的距離

y: 元素上邊界相對(duì)于視口上邊界的距離

width: 元素的寬度

height: 元素的高度

top: 元素上邊界相對(duì)于視口上邊界的距離

right: 元素右邊界相對(duì)于視口左邊界的距離

bottom: 元素下邊界相對(duì)于視口上邊界的距離

left: 元素左邊界相對(duì)于視口左邊界的距離

我們來(lái)講個(gè)題外話,怎么實(shí)現(xiàn) DIV 的拖拽。

實(shí)現(xiàn)拖拽動(dòng)效

實(shí)現(xiàn)元素的拖拽,我們只需要監(jiān)聽(tīng) mousedown,mousemovemouseup 事件即可:

let draggableElement = document.getElementById("move-content");
let isDragging = false;
let offset = { x: 0, y: 0 };
draggableElement.addEventListener("mousedown", function(event) {
  isDragging = true;
  // 計(jì)算鼠標(biāo)相對(duì)于元素的偏移量
  let rect = draggableElement.getBoundingClientRect();
  offset.x = event.clientX - rect.left;
  offset.y = event.clientY - rect.top;
});
document.addEventListener('mousemove', function(event) {
  if (!isDragging) return;
  // 阻止默認(rèn)事件,避免拖拽過(guò)程中選中文本等問(wèn)題
  event.preventDefault();
  // 計(jì)算元素應(yīng)該移動(dò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)用新的位置到元素的時(shí)候,使用的樣式是 draggableElement.style.transform,調(diào)用的是屬性 transform,而不是 top, left 等相對(duì)定位。是因?yàn)?transform 的性能更友好,這一步是在合成線程中進(jìn)行,避免了重排的情況。

到此這篇關(guān)于詳解如何在Canvas上實(shí)現(xiàn)坐標(biāo)定位的文章就介紹到這了,更多相關(guān)Canvas實(shí)現(xiàn)坐標(biāo)定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ECMAScript?數(shù)據(jù)類型之Number類型

    ECMAScript?數(shù)據(jù)類型之Number類型

    這篇文章主要介紹了?ECMAScript?數(shù)據(jù)類型之Number類型,Number類型使用IEEE?754格式表示整數(shù)和浮點(diǎn)值,更多相關(guān)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容
    2022-06-06
  • webpack4.0 入門(mén)實(shí)踐教程

    webpack4.0 入門(mén)實(shí)踐教程

    webpack4.0發(fā)布了一段時(shí)間了,這篇文章主要介紹了webpack4.0 入門(mén)實(shí)踐教程,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 用js設(shè)置下拉框?yàn)橹蛔x的小技巧

    用js設(shè)置下拉框?yàn)橹蛔x的小技巧

    select沒(méi)有只讀屬性,所以需要在select外面包含一個(gè)span,通過(guò)js來(lái)改變,需要的朋友可以參考下
    2014-04-04
  • JavaScript實(shí)現(xiàn)簡(jiǎn)易輪播圖最全代碼解析(ES5)

    JavaScript實(shí)現(xiàn)簡(jiǎn)易輪播圖最全代碼解析(ES5)

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易輪播圖最全代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JS實(shí)現(xiàn)微信彈出搜索框 多條件查詢功能

    JS實(shí)現(xiàn)微信彈出搜索框 多條件查詢功能

    這篇文章主要介紹了JS實(shí)現(xiàn)微信彈出搜索框 多條件查詢功能的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • async/await讓異步操作同步執(zhí)行的方法詳解

    async/await讓異步操作同步執(zhí)行的方法詳解

    這篇文章主要給大家介紹了關(guān)于async/await讓異步操作同步執(zhí)行的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用async/await具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 微信開(kāi)發(fā) JS-SDK 6.0.2 經(jīng)常遇到問(wèn)題總結(jié)

    微信開(kāi)發(fā) JS-SDK 6.0.2 經(jīng)常遇到問(wèn)題總結(jié)

    本篇文章主要介紹了"微信微信JS-SDK 6.0.2 遇到問(wèn)題 ",主要涉及到微信微信JS-SDK 6.0.2 填坑筆記 方面的內(nèi)容,對(duì)于微信微信JS-SDK 6.0.2 填坑筆記 感興趣的同學(xué)可以參考一下。
    2016-12-12
  • JavaScript實(shí)現(xiàn)的簡(jiǎn)單加密解密操作示例

    JavaScript實(shí)現(xiàn)的簡(jiǎn)單加密解密操作示例

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)的簡(jiǎn)單加密解密操作,涉及javascript基于charCodeAt與fromCharCode的字符串編碼與解碼操作相關(guān)使用技巧,需要的朋友可以參考下
    2018-06-06
  • 如何讓DIV可編輯、可拖動(dòng)示例代碼

    如何讓DIV可編輯、可拖動(dòng)示例代碼

    DIV是一個(gè)盒子模型通俗說(shuō)就是一個(gè)容器,在布局過(guò)程中經(jīng)常會(huì)使用到這個(gè)標(biāo)簽,在本文大家將學(xué)會(huì)如何讓DIV可編輯、可拖動(dòng),感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-09-09
  • JavaScript代碼調(diào)試方法實(shí)例小結(jié)

    JavaScript代碼調(diào)試方法實(shí)例小結(jié)

    這篇文章主要介紹了JavaScript代碼調(diào)試方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript錯(cuò)誤信息的處理與代碼調(diào)試相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01

最新評(píng)論