dojo.dnd.moveable与position:fixed

时间:2012-10-16 00:36:07

标签: javascript css dojo drag-and-drop

我尝试在浏览器窗口中使用具有固定位置的dojo moveable。 不幸的是,每当我用鼠标移动div时,位置都设置为绝对值。如何修复div?

HTML:

<html>
<body>

<div id="moveMe" style="position:fixed;width:100px;height:100px;border:1px solid black;background-color:#00ff00;cursor:pointer;">bla</div>
<p>test<br>test<br>test<br>test<br>test<br>test<br>test<br>test<br>
test<br>test<br>test<br>test<br>test<br>test<br>test<br>test<br>
test<br>test<br>test<br>test<br>test<br>test<br>test<br>test<br>
test<br>test<br>test<br>test<br>test<br>test<br>test<br>test<br>
test<br>test<br>test<br>test<br>test<br>test<br>test<br>test<br>
</body>
</html>

脚本:

dojo.require("dojo.dnd.move");
dojo.ready(function(){

    var pcm = new dojo.dnd.move.boxConstrainedMoveable(dojo.byId("moveMe"), {
        box : dojo.window.getBox(),
        within : true
    });

});

测试链接: http://jsfiddle.net/zPVdX/

欢呼声, krater

3 个答案:

答案 0 :(得分:0)

位置:已修复位置:绝对是浏览器用来确定元素定位方式的两种完全相反的方法。

我首先建议您阅读它们之间的差异:http://css-tricks.com/absolute-relative-fixed-positioining-how-do-they-differ/

希望现在您将理解为什么Dojo draggable需要将您的元素设置为绝对位置。这允许Dojo通过它的 top: left:属性可视地移动可拖动元素。

将此与静态定位进行比较,静态定位将尝试将元素锚定到相对于当前视口的位置。

如果您在视觉上尝试完成的内容中添加更多详细信息,可能会有另一种解决方案。

答案 1 :(得分:0)

您可以在DND(可拖动元素)上使用事件'MoveStop',以便在拖动操作的END处强制添加position: fixed;。通过这种方式,您可以使用position: absolute;在元素周围拖动,并在拖动完成时将其固定。

一些pesudo代码

  yourDnd.on('MoveStop', function (e) {
        // Set position FIXED
        domStyle.set(this.node, {
            'position': 'fixed ',
        });
    });

有关事件的更多信息,请访问:

http://livedocs.dojotoolkit.org/dojo/dnd

关于this hack我不建议您更改DOJO库,因为您的更改可能不安全并在框架的其他部分中创建错误。

答案 2 :(得分:0)

我刚开始使用:

<块引用>
        dnd.on('MoveStart', function (e) {
            var p = dojo.position(e.node, true);
            var parent_position = dojo.position(e.node.parentNode, true)

            dojo.style(e.node, "top", p.y - parent_position.y + "px");
            dojo.style(e.node, "position", "absolute");
        });
        dnd.on('MoveStop', function (e) {
            var p = dojo.position(e.node, false);
            dojo.style(e.node, "top", p.y + "px");
            dojo.style(e.node, "position", "fixed");
        });