6

我花了一天时间解决一个有趣的问题 - 我有一些画布,我想使用原生 HTML5 拖放功能来拖动它们。一切都很好,除了我最终发现在 Chrome 28.0.1500.95 中,如果画布是内联块 div 的子级,则不会出现画布的默认重影图像。查看这个最小的工作示例:

<html>
    <body>
        <div style='display:inline-block'> 
            <canvas id='canvas1' width='100px' height='100px' draggable='true'></canvas>
        </div>

        <div> 
            <canvas id='canvas2' width='100px' height='100px' draggable='true'></canvas>
        </div>

        <script type="text/JavaScript">
            var canvas1, canvas2, context1, context2;

            canvas1 = document.getElementById('canvas1');
            context1 = canvas1.getContext('2d');

            canvas2 = document.getElementById('canvas2');
            context2 = canvas2.getContext('2d');

            context1.fillText('no drag', 10, 30);
            context2.fillText('yes drag', 10, 30);
        </script>
    </body>
</html>

当我尝试拖动“是拖动”时会出现重影图像,但不会出现“不拖动”。但是,如果我还坚持一个放置目标,我可以通过照常在其上放置“不拖动”来触发它,尽管没有幽灵。我想了解为什么幽灵图像显然基于父级的 CSS 消失了,或者这里是否发生了其他事情 - 在此先感谢!

4

1 回答 1

0

这可能只是 Chrome 中的一个错误(似乎在 Firefox 中工作,一旦你真的.setData()

如果您只是在寻找一个简单但有点讨厌的解决方法:.setDragImage()明确地,基于画布。

function dragstart(e) {
    var di = new Image();
    di.src = this.toDataURL("image/png");
    e.dataTransfer.setDragImage(di, 10, 10);
    // Run in firefox
    e.dataTransfer.setData("text/plain", this.id);
}

小提琴(您可能想稍微调整一下图像的位置)。

于 2013-09-04T02:38:52.263 回答