HTML5拖放图像在Chromium(和Opera)中获得水平偏移

时间:2015-11-29 21:11:33

标签: javascript html5 drag-and-drop chromium

Chromium (版本45.0.2454.101 Ubuntu 15.04(64位))中:

当我将两个可拖动文本放在一起时,并在右侧开始拖动操作时,拖动图像会向左移动一个奇怪的偏移。好像它已与左侧文本对齐。

我在firefox中没有看到这种行为。

HTML5对我来说有点新鲜,所以我不确定我做的一切都是正确的 这是一个错误吗? 有办法解决吗? (不离开Chromium);)

使用例如DnD测试页面(下面的链接)并将其代码替换为下面的(稍作修改)代码。然后开始拖动'HelloHello2'文本:

http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop

<!DOCTYPE HTML>
<html>
<head>
<style>
#div1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
</style>
<script>
function allowDrop(ev) {
    ev.preventDefault();
    document.getElementById("div1").style.backgroundColor = "#EEEEEE";
}

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function restoreBg() {
    document.getElementById("div1").style.backgroundColor = "white";
}

function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
</script>
</head>
<body>

<p>Start dragging the 'HelloHello2' text (into the rectangle):</p>

<div id="div1" ondrop="drop(event)" ondragleave="restoreBg()" ondragover="allowDrop(event)"></div>
<br>
<a id="drag1" draggable="true" ondragstart="drag(event)">HelloHello1</a><a id="drag2" draggable="true" ondragstart="drag(event)">HelloHello2</a>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

我能够在Chrome和Opera中重现这个问题(在Windows 64上),然后发现这似乎是导致这种行为的根本原因,但是找不到任何参考来支持它为什么会这样工作(如果我能找到答案,我稍后会检查并更新答案。

根本原因:可拖动元素(锚点)是inline元素。

解决方案:让可拖动元素使用CSS显示block(或您的inline-block),这样就可以解决问题。

&#13;
&#13;
function allowDrop(ev) {
    ev.preventDefault();
    document.getElementById("div1").style.backgroundColor = "#EEEEEE";
}

function drag(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function restoreBg() {
    document.getElementById("div1").style.backgroundColor = "white";
}

function drop(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}
&#13;
#div1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
#drag1, #drag2 { display:inline-block; }
&#13;
<p>Start dragging the 'HelloHello2' text (into the rectangle):</p>

<div id="div1" ondrop="drop(event)" ondragleave="restoreBg()" ondragover="allowDrop(event)"></div>
<br>
<a id="drag1" draggable="true" ondragstart="drag(event)">HelloHello1</a><a id="drag2" draggable="true" ondragstart="drag(event)">HelloHello2</a>
&#13;
&#13;
&#13;