【问题标题】:How to drag elements on Mobile Browser?如何在移动浏览器上拖动元素?
【发布时间】:2014-02-13 18:11:33
【问题描述】:

我正在尝试创建一个可以在移动设备上运行的图像裁剪器;一个大图像包含在一个容器元素中,可以对其进行裁剪,用户可以将图像拖动到该容器中并捏合以进行缩放。

拖动功能在桌面浏览器上工作,但是当我在移动浏览器(android chrome、android 互联网浏览器、iphone safari)上进行测试时,它不能正常工作:它不流畅或根本不拖动。尝试滑动或触摸移动时,它只会移动非常微小的位置。

用 touch、touchstart、touchmove 做了一些测试,但运气不佳:

我在以下链接 (http://jsbin.com/cokil/1/) 中有一个演示。不确定我是否可以获得有关如何执行此操作的提示或建议?

  • 据报道,原始 github 链接没有加载hammerjs(正在这里加载),所以我从 CDN http://jsbin.com/cokil/3/

  • 得到了另一个加载它
  • 请记住问题出在移动浏览器上

感谢收看!

【问题讨论】:

  • 试试jquery ui draggable
  • 感谢收看!我在手机浏览器上打开过,还是不行。
  • 您只需尝试添加 mordernizer js 以及 jquery 和 jquery ui 然后尝试一次添加 jquery 然后 juery ui 然后 mordernizer js
  • 然后使用draggble事件
  • 我会尝试,目前我发现touchpunch.furf.com 可能是一个可能的解决方案。如果可能的话,如果我可以在不依赖许多外部库的情况下保持简单,那会很有趣吗?我知道我已经在使用hammer.js 等了。

标签: javascript mobile hammer.js


【解决方案1】:

您的 jsbin 未正确包含 Hammer js。替换:

https://raw.github.com/EightMedia/hammer.js/master/hammer.min.js

//cdnjs.cloudflare.com/ajax/libs/hammer.js/1.0.6/hammer.min.js

您的脚本运行良好。


目前脚本中不需要 jQuery。你可以使用原生的DOMContentLoaded,如果你愿意,可以去掉$(document).ready


您还需要在顶部和左侧声明的末尾添加'px'

imgEl.style.top = (y + parseFloat(event.gesture.deltaY))+'px';
imgEl.style.left = (x + parseFloat(event.gesture.deltaX))+'px';

DEMO

【讨论】:

  • 嗨@Fresheyeball!感谢您的浏览,原始 github 链接没有为您加载?那是一个错字,但问题是对于hammerJs,这在移动浏览器上不起作用。当您尝试触摸元素并拖动它时,它只会移动一点点。
  • 不是错字,github raw 拒绝执行。 Hammerjs 绝对适用于移动浏览器,这就是它的全部用途。问题出在您的实施中。我添加了一个演示,以便您可以看到它的工作原理。
  • 感谢您对以下解决方案发表评论。你是对的,不需要互操作,并且本机滚动确实阻止了它的工作,因为我没有注意到并想出了互操作。谢谢!
  • 很高兴为您服务 ;)
  • 它不会从我再次拖动后的最后一个位置移动元素
【解决方案2】:

在研究了很多安静之后,听了其他人对此的看法并尽量保持简单,我想出了以下解决方案,希望将来对其他人有用:

        document.addEventListener('touchstart', function(event) {
             event.preventDefault();
             var e = new Event('dragstart'); 
             element.dispatchEvent(e);
        }, false);

        document.addEventListener('touchmove', function(event) {
            event.preventDefault();
            var e = new Event('drag'); 
            element.dispatchEvent(e);
        }, false);

这通过触发在桌面上工作的原始代码来工作:

        Hammer(element).on("dragstart", function(event) {

            imgEl = document.querySelectorAll("img")[0];

            y = parseFloat(imgEl.style.top) || 0;
            x = parseFloat(imgEl.style.top) || 0;
        });

        Hammer(element).on("drag", function(event) {

            imgEl.style.top = y + parseFloat(event.gesture.deltaY);
            imgEl.style.left = x + parseFloat(event.gesture.deltaX);

        });

【讨论】:

  • hammerjs 不需要互操作touchmove。 Hammerjs 已经是 touchmove 的互操作工具,它经过了非常良好的测试并且在移动浏览器中非常成熟。
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多