【问题标题】:Drag and mouseover in snap.svg在 snap.svg 中拖动鼠标悬停
【发布时间】:2016-04-10 22:54:12
【问题描述】:

我对 javascript 比较陌生,并且正在学习使用 snap.svg 进行拖放。我的问题在于下降。我无法判断拖动的元素是否在放置目标上方。在这段代码中,我想将圆圈拖到正方形上,并认为我可以使用鼠标悬停。我的(提炼的)示例也可能是this post 的更简单版本。

var paper = Snap(300, 300);
var square = paper.rect(100, 100, 40, 40).attr({fill:"blue"});
var circle = paper.circle(50, 50, 20).attr({fill:"red"});

circle.drag();
square.mouseover(
        function() {
            console.log("Over the square");
        }
);

如前所述,当您将指针移到蓝色方块上时,鼠标悬停会触发,但当您将红色圆圈拖到蓝色方块上时不会触发。如果你反转正方形和圆形的创建,鼠标悬停会以任何一种方式触发,但当然圆形在正方形的后面。

显然,该事件被捕获在视图层次结构(或其他东西)中并且不会传播。必须有一个简单的方法来解决这个问题。有什么帮助吗?

(如果最好的答案是“使用 jQuery”,那很好,但我很想学习如何直接完成这项工作,因为 snap.svg 让拖动变得如此简单。)

添加:我希望的方向:Element.drag() 的 snap.svg 文档部分说,“当元素被拖到另一个元素上时,drag.over.<id> 也会触发。 "一个很好的、基于事件的方向,它可以让我(例如)毫不费力地突出显示放置目标。

但我还没弄清楚如何监听那个事件!有什么帮助或建议吗?

【问题讨论】:

  • 我认为这有点繁琐,除非我遗漏了什么,因为停止圆圈事件并允许鼠标​​悬停意味着它会阻止拖动工作。所以我认为这不会以某种“简单”的拖拽方式起作用。想到“可能”起作用的选项是在拖动处理程序中添加一些盒子碰撞类型检测,或者可能将处理程序附加到纸上,但是你没有直观的拖动,这可能会变得很繁琐并且可能无论如何都不起作用。
  • 然而,当圆圈在方块/目标后面时,方块会收到事件并且拖动继续。

标签: javascript svg drag-and-drop snap.svg


【解决方案1】:

我能想到的唯一没有碰撞或元素检测的快速方法是在对象前面放置一个几乎不可见的克隆,稍后在你看不到的 DOM 中,例如...

paper.append( square.clone().attr({ opacity: 0.000001 }) )

jsfiddle

取决于你的 svgs 的复杂程度,我猜这是否可行,如果你将元素放在它上面,你也会有一个小问题,你的重新拖动开始不会被拾起,所以你需要围绕它的代码。我认为一些测试可能是最没有错误的解决方案(在 S.O 上有一些解决方案用于 getElementFromPoint 或命中检测类型的解决方案)。

jsfiddle 上述问题的解决方法

【讨论】:

  • 酷!偷偷摸摸!我可能会走这条路,或者只是在我放下它时计算圆的位置。但我很想以更优雅、面向对象、事件驱动的方式来做这件事。在进一步挖掘的基础上,我在原始帖子中添加了一些内容;如果您知道如何使用drag.over.<id>,我将不胜感激:)
  • 我认为这取决于一个人追求什么。即,检测鼠标在一个元素上与一个元素稍微在另一个元素上是完全不同的,尤其是在需要比边界框检测更高的精度时。
  • 查看 Snap 代码,我认为这已被注释掉。我怀疑是因为它依赖于 el.getIntersectionList,我认为它在某些浏览器中有错误或不存在的支持(认为这是 Firefox 中的一个问题)。您可能需要自行比较所需元素与鼠标事件的边界框。
  • 谢谢;我会继续戳它... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2012-01-26
  • 2011-08-04
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多