8

我有以下代码来旋转 div。通过同一 div 右上角的图像上的 mousedown 事件。我希望 div 旋转直到鼠标向上。从逻辑上讲,我相信代码很好,但点击后它就可以工作。当我单击其他项目时,旋转停止而不是 mouseup。我认为在鼠标向下拖动后,浏览器会尝试拖动图像,但我需要帮助..提前谢谢:)

fl_rotate: false,
rotdivs: function() {
    var pw;
    var oThis = this;
    $('.drop div img').mousedown(function(e) {
        oThis.destroyDragResize();
        oThis.fl_rotate = true;
        return;
    });
    $(document).mousemove(function(e) {
        if (oThis.fl_rotate) {
            var element = $(oThis.sDiv);
            oThis.rotateOnMouse(e, element);
        }
    });
    $(document).mouseup(function(e) {
        if (oThis.fl_rotate) {
            oThis.initDragResize();
            var ele = $(oThis.sDiv);
            ele.unbind('mousemove');
            ele.draggable({
                containment: 'parent'
            });
            ele = 0;
            oThis.fl_rotate = false;
        }
    });
},
rotateOnMouse: function(e, pw) {
    var offset = pw.offset();
    var center_x = (offset.left) + ($(pw).width() / 2);
    var center_y = (offset.top) + ($(pw).height() / 2);
    var mouse_x = e.pageX;
    var mouse_y = e.pageY;
    var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
    var degree = (radians * (180 / Math.PI) * -1) + 100;
    //            window.console.log("de="+degree+","+radians);
    $(pw).css('-moz-transform', 'rotate(' + degree + 'deg)');
    $(pw).css('-webkit-transform', 'rotate(' + degree + 'deg)');
    $(pw).css('-o-transform', 'rotate(' + degree + 'deg)');
    $(pw).css('-ms-transform', 'rotate(' + degree + 'deg)');
}​
4

3 回答 3

2

为此有一个库。独立工作或作为 jQuery 插件https://github.com/PixelsCommander/Propeller

于 2014-02-04T14:06:25.977 回答
2

我认为问题在于当本机拖动事件(拖动图像)被触发(鼠标按下)时,它阻止了鼠标向上事件被触发。所以你只需要阻止鼠标按下事件的默认动作。

这里有一个工作示例:

HTML:

<div class="drop">
    <div>
        <img src="http://www.belugerinstudios.com/image/picturethumbnail/FunnyCatFootballIcon.JPG"/>
    </div>
</div>​

Javascript:

$(document).ready(function() {
  // the same as yours.
  function rotateOnMouse(e, pw) {
      var offset = pw.offset();
      var center_x = (offset.left) + ($(pw).width() / 2);
      var center_y = (offset.top) + ($(pw).height() / 2);
      var mouse_x = e.pageX;
      var mouse_y = e.pageY;
      var radians = Math.atan2(mouse_x - center_x, mouse_y - center_y);
      var degree = (radians * (180 / Math.PI) * -1) + 100;
      //            window.console.log("de="+degree+","+radians);
      $(pw).css('-moz-transform', 'rotate(' + degree + 'deg)');
      $(pw).css('-webkit-transform', 'rotate(' + degree + 'deg)');
      $(pw).css('-o-transform', 'rotate(' + degree + 'deg)');
      $(pw).css('-ms-transform', 'rotate(' + degree + 'deg)');
  }

  $('.drop div img').mousedown(function(e) {
    e.preventDefault(); // prevents the dragging of the image.
    $(document).bind('mousemove.rotateImg', function(e2) {
      rotateOnMouse(e2, $('.drop div img'));
    });
  });

  $(document).mouseup(function(e) {
    $(document).unbind('mousemove.rotateImg');
  });
});

演示:http: //jsfiddle.net/rwBku/13/

我使用了 jquery 的命名空间事件,因此您可以只取消绑定您想要的 mousemove 事件。

请注意,图像的旋转是错误的,但我真的没有看那个方法。

于 2012-06-16T22:18:23.553 回答
0

我认为这个堆栈溢出问题回答了您的问题如何在 mousemove 完成后触发 mouseup

诀窍是在 mousedown 事件中“封装”mousemove 和 mouseup 事件。

于 2012-06-19T09:36:57.630 回答