当前位置:网站首页>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;
}
})
}边栏推荐
- tensorflow.keras无法引入layers
- mySQL数据库初始化失败,有谁可以指导一下吗
- 国际原子能机构总干事称乌克兰扎波罗热核电站安全形势堪忧
- 树状数组模版+例题
- 六年团队Leader实战秘诀|程序员最重要的八种软技能 - 脸皮薄容易耽误事 - 自我营销
- 为什么我推荐使用智能化async?
- Thinking and summary of the efficiency of IT R&D/development process specification
- Redis cache and existing problems--cache penetration, cache avalanche, cache breakdown and solutions
- How to make a puzzle in PS, self-study PS software photoshop2022, PS make a puzzle effect
- 百行代码发射红心,程序员何愁命不中女朋友!
猜你喜欢

全面讲解GET 和 POST请求的本质区别是什么?原来我一直理解错了

并发之CAS

动态库之间回调函数使用

What is a good movie to watch on Qixi Festival?Crawl movie ratings and save to csv file

ECCV 2022 Oral 视频实例分割新SOTA:SeqFormer&IDOL及CVPR 2022 视频实例分割竞赛冠军方案...

Xcode10的打包方式distribute app和启动项目报错以及Xcode 打包本地ipa包安装到手机上

链表中的数字相加----链表专题

IT研发/开发流程规范效能的思考总结

How to make pictures clear in ps, self-study ps software photoshop2022, simple and fast use ps to make photos clearer and more textured

基因数据平台
随机推荐
周报2022-8-4
How to make pictures clear in ps, self-study ps software photoshop2022, simple and fast use ps to make photos clearer and more textured
Rotation of the displayed value on the button
Walk 100 trick society
sphinx matches the specified field
leetcode 剑指 Offer 10- II. 青蛙跳台阶问题
基于 Kubernetes 的微服务项目整体设计与实现
Creo 9.0 基准特征:基准点
tensorflow.keras无法引入layers
按钮上显示值的轮流切换
Luogu P3368: 【模板】树状数组 2
(转)[Json]net.sf.json 和org.json 的差别及用法
16 kinds of fragrant rice recipes
六年团队Leader实战秘诀|程序员最重要的八种软技能 - 脸皮薄容易耽误事 - 自我营销
原型&原型链
leetcode 剑指 Offer 10- I. 斐波那契数列
这样写有问题吗?怎么在sql-client 是可以做到数据的同步的
Controller-----controller
工程制图知识点
ECCV 2022 Oral Video Instance Segmentation New SOTA: SeqFormer & IDOL and CVPR 2022 Video Instance Segmentation Competition Champion Scheme...