js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)

draggable 属性是 HTML5 新增的。属性规定元素是否可拖动。

提示: draggable 属性经常用于拖放操作。

语法:<element draggable="true|false|auto">

项目示例图如下:PC 实现拖动、放下功能

PC:拖拽元素加上draggable属性,然后再在接收的元素上绑定事件,在放下时处理逻辑,主要代码:

var oDrag5 = document.getElementById("dragbox" + screenid);
oDrag5.ondragenter = handle_enter;
oDrag5.ondragover = handle_over;
oDrag5.ondragleave = handle_leave;
oDrag5.ondrop = handle_drop;

function handle_enter(e) {
    console.log('handle_enter-当元素进入目的地时触发');
    // 阻止浏览器默认行为
    e.preventDefault ? e.preventDefault() : e.returnValue = false;
}

function handle_over(e) {
    //console.log('handle_over-当元素在目的地时触发')
    //console.log("现在的ID为:"+e.target.id);
    e.preventDefault();
}

function handle_leave(e) {
    console.log('handle_leave-当元素离开目的地时触发');
    // 阻止浏览器默认行为
    // e.preventDefault()当元素在目的地放下时触发
}

function handle_drop(e) {
    console.log('handle_drop-当元素在目的地放下时触发');
    var id = parseInt(e.currentTarget.id.replace(/[^0-9]/ig, ""));
    // console.log("拖拽的元素id== " + id);
    e.preventDefault();
}

移动端:draggable 无效,想实现类似效果,拖出跟随的元素可自定义修改,如图: 

一、使用原生移动端触屏事件:

当按下手指时,触发ontouchstart
当移动手指时,触发ontouchmove
当移走手指时,触发ontouchend

let g = 7;//伪代码示例
for (var j = 0; j < list.length; j++) {
    if (list[j].slot == g) {
        var svp = list[j];
        var html2 = `<ul class="clearfix ul-borderbottom-color" slot='${svp.slot}' port='${svp.port}' type='${svp.type}' draggable='true' onmousedown='outCardListClick(this)'>
                    <li><img src='${svp.imgsrc}'></li>
                    <li id='outportText${svp.slot}-${svp.port}'>${svp.name}</li>
                    <li><input type="tel" name="phone" class="layui-input" value='${svp.remark}' onchange='setOutputPortRemark(this, ${svp.slot}, ${svp.port})'></li>
                    <li class="tr"><button class="layui-btn layui-btn-sm" srxyuyan="SubSetting" onclick="OutputPortSet(${svp.type})" ></button></li>
                    </ul>`;
        $("#cont" + g).append(html2);

        let oDrag = document.getElementById("outportText" + svp.slot + "-" + svp.port);
        drag2(oDrag);//绑定拖动
    }
}


function drag2(oDrag) {
    let ismove;
    let d = "<div id='dragD' style='padding: 4px 10px;border:2px solid #0071ff;border-radius: 5px;position:absolute;top:0;left:0;z-index: 99999;background: #3c95d7;color:#fff;text-align: center;line-height:20px;'></div>";

    oDrag.ontouchstart = function (ev) {
        console.log("ontouchstart")
        ismove = false;
        $("input").blur();
        outCardListClick($(ev.target).parent());
        $("body").append(d);
        $("#dragD").text($(ev.target).text());
    }

    oDrag.ontouchmove = function (ev) {
        console.log("onmousemove")
        ismove = true;
        let moveX = ev.changedTouches[0].pageX ; 
        let moveY = ev.changedTouches[0].pageY ;
        let xxs = moveX -20;//跟随手指位置
        let yys = moveY -10; 
        $("#dragD").css({"left": (xxs) + "px", "top" : (yys) + "px"});
        return false;
    };

    oDrag.ontouchend = function (ev) {
        console.log("!!!ontouchend ");
        if($("#dragD")) {
            $("#dragD").remove();
        }
        let element = document.elementFromPoint(ev.changedTouches[0].pageX - $(document).scrollLeft(), ev.changedTouches[0].pageY - $(document).scrollTop());
        console.log("放下的元素== " + element);
        if (element.className.indexOf('drag') > -1){
            console.log("是想放下的元素 id=== " + element.id);
        }
    };
}

二、使用 hammer.js

区别在获取属性不同:  changedPointers     changedTouches

function inSlotPortBindPress(uid) {
    var slotPort = document.getElementById(uid);
    let d = "<div id='dragD' style='padding: 4px 10px;border:2px solid #0071ff;border-radius: 5px;position:absolute;top:0;left:0;z-index: 99999;background: #3c95d7;color:#fff;text-align: center;line-height:20px;'></div>";
    var hammer_windowsDiv = new Hammer(slotPort);
    hammer_windowsDiv.get('pan').set({ enable: true });
    hammer_windowsDiv.on("doubletap panstart panmove panend", function (ev) {
        switch (ev.type) {
            case "panstart":
                console.log("panstart")
                $("input").blur();
                $("body").append(d);
                $("#dragD").text($(ev.target).text());
            // break;
            case "panmove":
                let moveX = ev.changedPointers[0].pageX;
                let moveY = ev.changedPointers[0].pageY;
                let xxs = moveX - 20;//跟随手指位置
                let yys = moveY - 10;
                $("#dragD").css({ "left": (xxs) + "px", "top": (yys) + "px" });
                break;
            case "panend":
                if ($("#dragD")) {
                    $("#dragD").remove();
                }
                let element = document.elementFromPoint(ev.changedPointers[0].pageX - $(document).scrollLeft(), ev.changedPointers[0].pageY - $(document).scrollTop());
                console.log("放下的元素== " + element);
                if (element.className.indexOf('drag') > -1) {
                    console.log("是想放下的元素 id=== " + element.id);
                }
                break;
        }
    })
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值