拖拽和拉伸div元素功能分析与实现

综述:综合考察对于元素的拖动相关API的使用和逻辑思维能力,非常有用的一个实现思路,后期可以将其封装成一个可以复用的组件积累下来

1.实现拖拽和四个方向拉伸元素的实现方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>js实现拖拽和拉伸</title>
</head>
<body>
<div id="test" style="position:absolute;left:0;top:0;width:600px;height:600px; border:1px solid #adadad;">
    我是测试的可拉伸,拖动的元素
</div>
<script>
    var clickBox = document.getElementById('test');
    /**
     *time/author:2019/5/9 "mouyao"
     *desc:当在当前元素上按下鼠标时,就触发拖动和拉伸操作
     */
    clickBox.onmousedown = function(e){
        e=e||event;  //兼容ie和其他浏览器的写法
        var mouseDownX = e.clientX;
        var mouseDownY = e.clientY;
        var clickBoxLeft = clickBox.offsetLeft;
        var clickBoxTop = clickBox.offsetTop;
        var clickBoxWeight = clickBox.offsetWidth;
        var clickBoxHeight = clickBox.offsetHeight;

        var direction = 0;
        if (mouseDownX<clickBoxLeft+30) {
            direction='left';
        } else if (mouseDownX >clickBoxLeft+clickBoxWeight - 30){
            direction='right';
        }

        if (mouseDownY<clickBoxTop+30){
            direction = 'top';
        } else if (direction < clickBoxTop + clickBoxHeight - 30) {
            direction = 'bottom';
        }
        if ((clickBoxLeft + clickBoxWeight-30)< mouseDownX&&mouseDownX< (clickBoxLeft + clickBoxWeight) && (clickBoxTop+clickBoxHeight-30)<mouseDownY&& mouseDownY<(clickBoxTop+clickBoxHeight)) {
            direction = 'rightBottomCorner';
        }else if((clickBoxLeft +30)< mouseDownX&&mouseDownX< (clickBoxLeft + clickBoxWeight-30) && (clickBoxTop+30)<mouseDownY&& mouseDownY<(clickBoxTop+clickBoxHeight-30)){     //如果是在中间位置,则实现拖动功能
            direction="drag";
        }

        /**
         *time/author:2019/5/9 "mouyao"
         *desc:当鼠标开始华东的时候,根据鼠标的移动方向去调整他的X,Y坐标和长宽
         */
        document.onmousemove = function(e) {
            e = e || event; //是要是使用原生js给我们提供的e回调参数,这存储了很多有用的信息
            var xx = e.clientX;
            var yy = e.clientY;
            if (direction==='left') {
                clickBox.style.width = clickBoxWeight + mouseDownX - xx + 'px'
                clickBox.style.left = xx + 'px';
            } else if (direction==='right') {
                clickBox.style.width = clickBoxWeight + xx - mouseDownX + 'px'
            }

            if (direction==='top'){
                clickBox.style.height = clickBoxHeight + mouseDownY - yy + 'px';
                clickBox.style.top = yy + 'px';
            } else if (direction==='bottom'){
                clickBox.style.height = clickBoxHeight + yy - mouseDownY + 'px';
            }
            if (direction==='rightBottomCorner'){
                clickBox.style.width = clickBoxWeight +xx-mouseDownX+'px'
                clickBox.style.left =clickBoxLeft+'px';
                clickBox.style.height = clickBoxHeight +yy-mouseDownY+'px';
                clickBox.style.top =clickBoxTop+'px';
            }else if(direction==="drag"){
                clickBox.style.left =xx-mouseDownX+clickBoxLeft+ 'px';
                clickBox.style.top =yy-mouseDownY+clickBoxTop+ 'px';
            }
            //return false; //这里为了避免抖动
        };
        document.onmouseup = function() {
            document.onmousemove = null;
            document.onmouseup = null;
        };
        if (e.preventDefault){
            e.preventDefault();
        }
    };
    /**
     *time/author:2019/5/9 "mouyao"
     *desc:在拉伸的过程中,实现居中状态长存,有时间将其做成一个插件公布出来,供大家使用
     */


</script>
</body>
</html>

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现同时兼容 PC 端和移动端的元素拖拽功能,可以使用 HTML5 新增的 drag 事件和 touch 事件。 首先,需要将元素设置为可拖拽,可以使用 draggable 属性。例如: ```html <div draggable="true">可拖拽元素</div> ``` 然后,需要监听元素的 dragstart、drag、dragend 事件或 touchstart、touchmove、touchend 事件来实现拖拽效果。 在 PC 端,可以使用 drag 事件来实现拖拽效果,例如: ```javascript var dragElement = document.getElementById('drag-element'); dragElement.addEventListener('dragstart', function(event) { // 拖拽开始时,保存拖拽元素的 ID event.dataTransfer.setData('text/plain', event.target.id); }); document.body.addEventListener('dragover', function(event) { // 阻止默认拖拽行为 event.preventDefault(); }); document.body.addEventListener('drop', function(event) { // 阻止默认拖拽行为 event.preventDefault(); // 获取拖拽元素的 ID var id = event.dataTransfer.getData('text/plain'); var dragElement = document.getElementById(id); // 将拖拽元素添加到放置区域 event.target.appendChild(dragElement); }); ``` 在移动端,可以使用 touch 事件来实现拖拽效果,例如: ```javascript var dragElement = document.getElementById('drag-element'); var startX, startY; dragElement.addEventListener('touchstart', function(event) { startX = event.touches[0].clientX; startY = event.touches[0].clientY; }); dragElement.addEventListener('touchmove', function(event) { var offsetX = event.touches[0].clientX - startX; var offsetY = event.touches[0].clientY - startY; // 移动元素 this.style.transform = 'translate(' + offsetX + 'px, ' + offsetY + 'px)'; }); dragElement.addEventListener('touchend', function(event) { // 拖拽结束时,清除 transform 样式 this.style.transform = ''; }); ``` 需要注意的是,移动端的 touch 事件可能会和浏览器默认行为冲突,需要使用 preventDefault() 方法来阻止默认行为。另外,由于移动端的屏幕尺寸多样化,需要根据具体情况来调整拖拽的逻辑和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值