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


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

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

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

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

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

    1. var oDrag5 = document.getElementById("dragbox" + screenid);
    2. oDrag5.ondragenter = handle_enter;
    3. oDrag5.ondragover = handle_over;
    4. oDrag5.ondragleave = handle_leave;
    5. oDrag5.ondrop = handle_drop;
    6. function handle_enter(e) {
    7. console.log('handle_enter-当元素进入目的地时触发');
    8. // 阻止浏览器默认行为
    9. e.preventDefault ? e.preventDefault() : e.returnValue = false;
    10. }
    11. function handle_over(e) {
    12. //console.log('handle_over-当元素在目的地时触发')
    13. //console.log("现在的ID为:"+e.target.id);
    14. e.preventDefault();
    15. }
    16. function handle_leave(e) {
    17. console.log('handle_leave-当元素离开目的地时触发');
    18. // 阻止浏览器默认行为
    19. // e.preventDefault()当元素在目的地放下时触发
    20. }
    21. function handle_drop(e) {
    22. console.log('handle_drop-当元素在目的地放下时触发');
    23. var id = parseInt(e.currentTarget.id.replace(/[^0-9]/ig, ""));
    24. // console.log("拖拽的元素id== " + id);
    25. e.preventDefault();
    26. }

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

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

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

    1. let g = 7;//伪代码示例
    2. for (var j = 0; j < list.length; j++) {
    3. if (list[j].slot == g) {
    4. var svp = list[j];
    5. var html2 = `
    6. ${svp.name}
  • `;
  • $("#cont" + g).append(html2);
  • let oDrag = document.getElementById("outportText" + svp.slot + "-" + svp.port);
  • drag2(oDrag);//绑定拖动
  • }
  • }
  • function drag2(oDrag) {
  • let ismove;
  • let d = "
    "
    ;
  • 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

    1. function inSlotPortBindPress(uid) {
    2. var slotPort = document.getElementById(uid);
    3. let d = "
      "
      ;
    4. var hammer_windowsDiv = new Hammer(slotPort);
    5. hammer_windowsDiv.get('pan').set({ enable: true });
    6. hammer_windowsDiv.on("doubletap panstart panmove panend", function (ev) {
    7. switch (ev.type) {
    8. case "panstart":
    9. console.log("panstart")
    10. $("input").blur();
    11. $("body").append(d);
    12. $("#dragD").text($(ev.target).text());
    13. // break;
    14. case "panmove":
    15. let moveX = ev.changedPointers[0].pageX;
    16. let moveY = ev.changedPointers[0].pageY;
    17. let xxs = moveX - 20;//跟随手指位置
    18. let yys = moveY - 10;
    19. $("#dragD").css({ "left": (xxs) + "px", "top": (yys) + "px" });
    20. break;
    21. case "panend":
    22. if ($("#dragD")) {
    23. $("#dragD").remove();
    24. }
    25. let element = document.elementFromPoint(ev.changedPointers[0].pageX - $(document).scrollLeft(), ev.changedPointers[0].pageY - $(document).scrollTop());
    26. console.log("放下的元素== " + element);
    27. if (element.className.indexOf('drag') > -1) {
    28. console.log("是想放下的元素 id=== " + element.id);
    29. }
    30. break;
    31. }
    32. })
    33. }
  • 相关阅读:
    护眼灯真的有用吗?2022双十二选哪个牌子的护眼台灯好
    【luogu P6779】rla1rmdq(分块)(树链剖分)
    做得好 vs 做得快?
    MySql安装包配置
    Three.js使用shader根据高度渐变染色
    【计算机专业浅谈】为什么我不建议你选择计算机专业?
    多级缓存、
    flink 入门(一)
    java计算机毕业设计企业间信息交互系统源码+系统+数据库+lw文档+mybatis+运行部署
    TX-LCN:分布式事务框架
  • 原文地址:https://blog.csdn.net/qq_40015157/article/details/126126032