当前位置:网站首页>js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
js 图形操作一(兼容pc、移动端实现 draggable属性 拖放效果)
2022-08-05 09:04:00 【程序媛zcc】
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;
}
})
}边栏推荐
猜你喜欢

交换机端口的三种类型详解与hybrid端口实验

Example of Noise Calculation for Amplifier OPA855

Spark cluster deployment (third bullet)

吴恩达深度学习deeplearning.ai——第一门课:神经网络与深度学习——第二节:神经网络基础(下)

spark集群部署(第三弹)

【ASM】字节码操作 方法的初始化 Frame

Why do I recommend using smart async?

基于 Kubernetes 的微服务项目整体设计与实现

How to make a puzzle in PS, self-study PS software photoshop2022, PS make a puzzle effect

Overall design and implementation of Kubernetes-based microservice project
随机推荐
【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享
leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
Random code generation
Neuron Newsletter 2022-07|新增非 A11 驱动、即将支持 OPC DA
【LeetCode】623. 在二叉树中增加一行
Linux导出数据库数据到硬盘
selectPage 动态改变参数方法
交换机端口的三种类型详解与hybrid端口实验
XCODE12 在使用模拟器(SIMULATOR)时编译错误的解决方法
sphinx匹配指定字段
明天去订票,准备回家咯~~
Example of Noise Calculation for Amplifier OPA855
my journal link
Dynamic memory development (C language)
ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...
ps怎么拼图,自学ps软件photoshop2022,PS制作拼图效果
基于多块信息提取和马氏距离的k近邻故障监测
The color of life divine
Creo 9.0 基准特征:基准坐标系
Creo 9.0 基准特征:基准点