评论资讯 [ 总 424 则 ]
·了了 - 2024-12-18 21:32
·悄然 - 2024-12-17 15:19
·悄然 - 2024-12-15 15:12
·悄然 - 2024-12-9 12:32
·飞飞 - 2024-12-9 12:31
·小希 - 2024-12-7 11:50
·飞飞 - 2024-12-5 15:53
·飞飞 - 2024-12-3 16:42
·悄然 - 2024-12-3 16:41
·飞飞 - 2024-12-1 18:27
·悄然 - 2024-12-17 15:19
·悄然 - 2024-12-15 15:12
·悄然 - 2024-12-9 12:32
·飞飞 - 2024-12-9 12:31
·小希 - 2024-12-7 11:50
·飞飞 - 2024-12-5 15:53
·飞飞 - 2024-12-3 16:42
·悄然 - 2024-12-3 16:41
·飞飞 - 2024-12-1 18:27
友情链接
网站统计
拖曳元素(二)
JS 有一个 Drag and Drop API,它提供了丰富的拖曳操作接口,本例仅使用当中的 dragover 和 dragend 事件便可实现在父元素内拖曳子元素的功能。代码如下:
<style> #wrap2 { margin: 30px auto; position: relative; width: 600px; height: 300px; border: 1px solid gray; } #box2 { position: absolute; width: 100px; height: 50px; background: lightblue; display: grid; place-items: center; } #mypic { left: 120px; position: absolute; width: 142px; height: 132px; } </style> <div id="wrap2"> <div id="box2" draggable="true">拖曳我</div> <img id="mypic" src="https://638183.freep.cn/638183/small/hxxb.webp" title="拖曳我" alt="" /> </div> <script> const dragElms = [box2, mypic]; //待拖曳元素 : 两个 //父元素监听拖曳经过事件 : 取消默认行为(出现禁止放下图标) wrap2.ondragover = (e) => e.preventDefault(); //子元素监听 drag* 事件 dragElms.forEach(elm => { //监听dragend拖曳结束事件 : 计算left和top值并安置子元素 elm.ondragend = (e) => { let rect = wrap2.getBoundingClientRect(); //获得父元素属性值对象 let _x = e.clientX - rect.left - elm.offsetWidth / 2, /* 计算子元素X坐标值 */ _y = e.clientY - rect.top - elm.offsetHeight / 2; /* 计算子元素Y坐标值 */ //下面条件判断语句用于放置越界 if(_x < 0) _x = 0; if(_x > rect.width - elm.offsetWidth) _x = rect.width - elm.offsetWidth; if(_y < 0) _y = 0; if(_y > rect.height - elm.offsetHeight) _y = rect.height - elm.offsetHeight; //定位子元素 elm.style.cssText += ` left: ${_x}px; top: ${_y}px; `; }; }); </script>
需要注意的是:img标签、超链标签、纯文本节点等默认支持可拖曳,凡默认不支持的,需要在HTML标签代码中加入 draggable="true" 属性设置。
前一篇: 拖曳元素(一)
下一篇: js+svg绘制动画六边形
发表评论:
评论列表 [2条]
#2 | 悄然 于 2024-9-6 19:07 发布: 这个拖曳互动性趣味性都很强。。。难不成我首页上的那池水也可以四处拖动?不给范围的话,想想挺好玩
#1 | 小希 于 2024-9-6 19:05 发布: [box2, mypic]这个可以设两个拖动的子元素,且有范围限定,不可越界。。拖曳是个新的东东,未尝试过。。默认图片和文本。。。常用的就是视频不默认喽。。。哈哈,能整个小视频拖着到处走么。。