HTML 实现随意拖动内容位置

发布时间:2024-05-08 点击:95
两种方式为:拖拽普通标签位置或拖拽canvas中的文本框位置
1. 实现鼠标拖动标签元素到任意位置
css 代码
#range { position: relative; width: 600px; height: 400px; margin: 10px; background-color: rgb(133, 246, 250);}.icon { position: absolute; height: 100px; width: 100px; cursor: move; background-color: #ff9204; user-select: none;}html代码
<p id="range"> <p class="icon">100*100</p></p>js代码
const main = document.getelementbyid('range');const icon = document.queryselector('.icon');let move = false;let deltaleft = 0, deltatop = 0;// 拖动开始事件,要绑定在被移动元素上icon.addeventlistener('mousedown', function (e) { /* * @des deltaleft 即移动过程中不变的值 */ deltaleft = e.clientx-e.target.offsetleft; deltatop = e.clienty-e.target.offsettop; move = true;})// 移动触发事件要放在,区域控制元素上main.addeventlistener('mousemove', function (e) { if (move) { const cx = e.clientx; const cy = e.clienty; / 相减即可得到相对于父元素移动的位置 */ let dx = cx - deltaleft let dy = cy - deltatop / 防止超出父元素范围 */ if (dx < 0) dx = 0 if (dy < 0) dy = 0 if (dx > 500) dx = 500 if (dy > 300) dy = 300 icon.setattribute('style', `left:${dx}px;top:${dy}px`) }})// 拖动结束触发要放在,区域控制元素上main.addeventlistener('mouseup', function (e) { move = false; console.log('mouseup');})2. canvas绘制文本框,并实现鼠标将其拖拽移动到任意位置
css 代码
.cus-canvas{ background: rgb(50, 204, 243);}.input-ele{ display: none; position: fixed; width: 180px; border: 0; background-color: #fff;}html 代码
<p> <canvas id="canvas" class="cus-canvas" width="800" height="600"></canvas> <input id="inputele" class="input-ele"/></p>js代码
实现原理为记录鼠标移动的位置,不断的重绘矩形框和文本内容
let mousedown = false;let deltax = 0;let deltay = 0;let text = 'hello'const canvas = document.getelementbyid('canvas');const ctx = canvas.getcontext('2d');const cw = canvas.width, ch = canvas.height;const rect = { x: 20, y: 20, width: 150, height: 50}/ 设置文字和边框样式 */ctx.font="16px arial";ctx.fillstyle = "#fff"; / 设置为 center 时,文字段的中心会在 filltext的 x 点 */ctx.textalign = 'center';ctx.linewidth = '2';ctx.strokestyle = '#fff';strokerect()const inputele = document.getelementbyid('inputele');inputele.onkeyup = function(e) { if(e.keycode === 13) { text = inputele.value strokerect() inputele.setattribute('style', `display:none`) }}canvas.ondblclick = function(e){ inputele.setattribute('style', `left:${e.clientx}px;top:${e.clienty}px;display:block`); inputele.focus();}canvas.onmousedown = function(e){ / 获取视口左边界与canvas左边界的距离 加上 鼠标点击位置与canvas左边界的长度,这个值是相对移动过程中不变的值 */ deltax=e.clientx - rect.x; deltay=e.clienty - rect.y; mousedown = true}; const judgew = cw-rect.width, judgeh = ch-rect.height;canvas.onmousemove = function(e){ if(mousedown) { / 相减即可获得矩形左边界与canvas左边界之间的长度 */ let dx = e.clientx-deltax; let dy = e.clienty-deltay; if(dx < 0) { dx = 0; } else if (dx > judgew) { dx = judgew; } if(dy < 0) { dy = 0; } else if(dy > judgeh) { dy = judgeh; } rect.x = dx; rect.y = dy; strokerect() }}; canvas.onmouseup = function(e){ mousedown = false}; / 清除指定区域 */function clearrect() { ctx.clearrect(0, 0, cw, ch)}/ 画矩形 */function strokerect() { clearrect() / 这里如果不调用 beginpath 历史的矩形会重新被绘制 */ ctx.beginpath() ctx.rect(rect.x, rect.y, rect.width, rect.height) ctx.stroke(); // 设置字体内容,以及在画布上的位置 ctx.filltext(text, rect.x 70, rect.y 30);}推荐教程:《html教程》

云服务器快速备案流程图
买云服务器价格实惠
一个云服务器租赁费用
视频无法打开-虚拟主机/数据库问题
英文单词域名Bettingodds.com超335万元成交,领衔DN榜
注册购买后送空间吗 怎么购买域名空间
云服务器价格国外
网页打开非常慢-云服务器问题