设为首页收藏本站
天天打卡

 找回密码
 立即注册
搜索
查看: 113|回复: 17

html随意拖动内容位置的两种实现方式

[复制链接]

3

主题

51

回帖

169

积分

注册会员

积分
169
发表于 2024-4-20 10:35:12 | 显示全部楼层 |阅读模式
测试:chrome v80.0.3987.122 正常
两种方式为:拖拽普通标签位置或拖拽canvas中的文本框位置
1. 实现鼠标拖动标签元素到任意位置
演示地址
css 代码
  1. #range {
  2.     position: relative;
  3.     width: 600px;
  4.     height: 400px;
  5.     margin: 10px;
  6.     background-color: rgb(133, 246, 250);
  7. }

  8. .icon {
  9.     position: absolute;
  10.     height: 100px;
  11.     width: 100px;
  12.     cursor: move;
  13.     background-color: #ff9204;
  14.     user-select: none;
  15. }
复制代码
html代码
  1. <div id="range">
  2.     <div class="icon">100*100</div>
  3. </div>
复制代码
js代码
  1. const main = document.getElementById('range');
  2. const icon = document.querySelector('.icon');
  3. let move = false;
  4. let deltaLeft = 0, deltaTop = 0;

  5. // 拖动开始事件,要绑定在被移动元素上
  6. icon.addEventListener('mousedown', function (e) {
  7.     /*
  8.     * @des deltaLeft 即移动过程中不变的值
  9.     */
  10.     deltaLeft = e.clientX-e.target.offsetLeft;
  11.     deltaTop = e.clientY-e.target.offsetTop;
  12.     move = true;
  13. })

  14. // 移动触发事件要放在,区域控制元素上
  15. main.addEventListener('mousemove', function (e) {
  16.     if (move) {
  17.         const cx = e.clientX;
  18.         const cy = e.clientY;
  19.         /** 相减即可得到相对于父元素移动的位置 */   
  20.         let dx = cx - deltaLeft
  21.         let dy = cy - deltaTop

  22.         /** 防止超出父元素范围 */
  23.         if (dx < 0) dx = 0
  24.         if (dy < 0) dy = 0
  25.         if (dx > 500) dx = 500
  26.         if (dy > 300) dy = 300
  27.         icon.setAttribute('style', `left:${dx}px;top:${dy}px`)
  28.     }
  29. })

  30. // 拖动结束触发要放在,区域控制元素上
  31. main.addEventListener('mouseup', function (e) {
  32.     move = false;
  33.     console.log('mouseup');
  34. })
复制代码
2. canvas绘制文本框,并实现鼠标将其拖拽移动到任意位置
css 代码
  1. .cus-canvas{
  2.     background: rgb(50, 204, 243);
  3. }

  4. .input-ele{
  5.     display: none;
  6.     position: fixed;
  7.     width: 180px;
  8.     border: 0;
  9.     background-color: #fff;
  10. }
复制代码
html 代码
  1. <div>
  2.     <canvas id="canvas" class="cus-canvas"  width="800" height="600"></canvas>
  3.     <input id="inputEle" class="input-ele"/>
  4. </div>
复制代码
js代码
实现原理为记录鼠标移动的位置,不断的重绘矩形框和文本内容
  1. let mouseDown = false;
  2. let deltaX = 0;
  3. let deltaY = 0;
  4. let text = 'hello'
  5. const canvas = document.getElementById('canvas');
  6. const ctx = canvas.getContext('2d');
  7. const cw = canvas.width, ch = canvas.height;
  8. const rect = {
  9.     x: 20,
  10.     y: 20,
  11.     width: 150,
  12.     height: 50
  13. }

  14. /** 设置文字和边框样式 */
  15. ctx.font="16px Arial";
  16. ctx.fillStyle = "#fff";
  17. /** 设置为 center 时,文字段的中心会在 fillText的 x 点 */
  18. ctx.textAlign = 'center';
  19. ctx.lineWidth = '2';
  20. ctx.strokeStyle = '#fff';

  21. strokeRect()

  22. const inputEle = document.getElementById('inputEle');
  23. inputEle.onkeyup =  function(e) {
  24.     if(e.keyCode === 13) {
  25.         text = inputEle.value
  26.         strokeRect()
  27.         inputEle.setAttribute('style', `display:none`)
  28.     }
  29. }

  30. canvas.ondblclick = function(e){
  31.     inputEle.setAttribute('style', `left:${e.clientX}px;top:${e.clientY}px;display:block`);
  32.     inputEle.focus();
  33. }

  34. canvas.onmousedown = function(e){
  35.     /** 获取视口左边界与canvas左边界的距离 加上 鼠标点击位置与canvas左边界的长度,这个值是相对移动过程中不变的值 */
  36.     deltaX=e.clientX - rect.x;
  37.     deltaY=e.clientY - rect.y;
  38.     mouseDown = true
  39. };  

  40. const judgeW = cw-rect.width, judgeH = ch-rect.height;

  41. canvas.onmousemove = function(e){
  42.     if(mouseDown) {
  43.         /** 相减即可获得矩形左边界与canvas左边界之间的长度 */
  44.         let dx = e.clientX-deltaX;
  45.         let dy = e.clientY-deltaY;
  46.         if(dx < 0) {
  47.             dx = 0;
  48.         } else if (dx > judgeW) {
  49.             dx = judgeW;
  50.         }
  51.         if(dy < 0) {
  52.             dy = 0;
  53.         } else if(dy > judgeH) {
  54.             dy = judgeH;
  55.         }
  56.         rect.x = dx;
  57.         rect.y = dy;
  58.         strokeRect()
  59.     }
  60. };  
  61. canvas.onmouseup = function(e){
  62.     mouseDown = false
  63. };  

  64. /** 清除指定区域 */
  65. function clearRect() {
  66.     ctx.clearRect(0, 0, cw, ch)
  67. }

  68. /** 画矩形 */
  69. function strokeRect() {
  70.     clearRect()

  71.     /** 这里如果不调用 beginPath 历史的矩形会重新被绘制 */
  72.     ctx.beginPath()
  73.     ctx.rect(rect.x, rect.y, rect.width, rect.height)
  74.     ctx.stroke();
  75.     // 设置字体内容,以及在画布上的位置
  76.     ctx.fillText(text, rect.x + 70, rect.y + 30);
  77. }
复制代码
欢迎交流 Github
到此这篇关于html随意拖动内容位置的两种实现方式的文章就介绍到这了,更多相关html随意拖动内容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

0

主题

58

回帖

115

积分

注册会员

积分
115
发表于 2024-4-23 11:30:04 | 显示全部楼层
太棒了!感谢分享这个信息!

1

主题

47

回帖

116

积分

注册会员

积分
116
发表于 2024-4-26 03:53:26 | 显示全部楼层
能给个链接吗?我想深入了解一下。

1

主题

55

回帖

129

积分

注册会员

积分
129
发表于 2024-5-8 18:42:17 | 显示全部楼层
谢谢你的提醒,我会注意的。

0

主题

56

回帖

112

积分

注册会员

积分
112
发表于 2024-5-22 23:15:05 | 显示全部楼层
每日一回

0

主题

53

回帖

107

积分

注册会员

积分
107
发表于 2024-5-28 09:41:21 | 显示全部楼层
我完全同意你的观点

0

主题

57

回帖

115

积分

注册会员

积分
115
发表于 2024-6-12 09:49:28 | 显示全部楼层
666666666666

0

主题

48

回帖

96

积分

注册会员

积分
96
发表于 2024-6-26 01:59:46 | 显示全部楼层
说得太好了,完全同意!

3

主题

42

回帖

150

积分

注册会员

积分
150
发表于 2024-7-4 11:19:39 | 显示全部楼层
感谢分享,受益匪浅!

0

主题

51

回帖

103

积分

注册会员

积分
103
发表于 2024-7-16 12:56:20 | 显示全部楼层
我不确定这个信息的准确性,请再确认一下
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|爱云论坛 - d.taiji888.cn - 技术学习 免费资源分享 ( 蜀ICP备2022010826号 )|天天打卡

GMT+8, 2024-11-15 11:58 , Processed in 0.085672 second(s), 26 queries .

Powered by i云网络 Licensed

© 2023-2028 正版授权

快速回复 返回顶部 返回列表