最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

我們設(shè)定 HTML 的代碼如下:

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

我們添加點(diǎ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;
}

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

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

繪制線條

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

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

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

Yeah! 我們獲取到鼠標(biāo)當(dāng)前相對的原點(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";

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

接下來,我們監(jiān)聽鼠標(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})`
})
// 清空畫布
canvasDom.addEventListener("mouseout", () => {
  clearRect();
})

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

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

y: 元素上邊界相對于視口上邊界的距離

width: 元素的寬度

height: 元素的高度

top: 元素上邊界相對于視口上邊界的距離

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

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

left: 元素左邊界相對于視口左邊界的距離

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

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

實(shí)現(xiàn)元素的拖拽,我們只需要監(jiān)聽 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)相對于元素的偏移量
  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)事件,避免拖拽過程中選中文本等問題
  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 等相對定位。是因?yàn)?transform 的性能更友好,這一步是在合成線程中進(jìn)行,避免了重排的情況。

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

相關(guān)文章

最新評論

娱乐| 临武县| 东兰县| 通城县| 安福县| 调兵山市| 田阳县| 桑日县| 定州市| 嘉祥县| 内江市| 阜康市| 东城区| 濮阳县| 应城市| 亳州市| 长沙市| 册亨县| 甘谷县| 莎车县| 德安县| 永定县| 嫩江县| 金华市| 青浦区| 保亭| 伽师县| 屯昌县| 闸北区| 西乡县| 清镇市| 双城市| 睢宁县| 广南县| 兴业县| 吴桥县| 昌黎县| 诸城市| 依兰县| 化隆| 衡水市|