rotating div with mouse move

12,653

Solution 1

There is a lib for this. Works standalone or as jQuery plugin https://github.com/PixelsCommander/Propeller

Solution 2

I think the problem was that when the native drag event (that dragged the image) was fired (on mouse down) it was preventing the mouse up event to be fired. So you just need to prevent the default action of the mouse down event.

Here you have a working example:

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');
  });
});

Demo: http://jsfiddle.net/rwBku/13/

I have used jquery's namespaced events so you can unbind only the mousemove event that you want to.

Please note that the rotation of the image is buggy, but I really didn't look at that method.

Share:
12,653
zzai
Author by

zzai

Updated on June 09, 2022

Comments

  • zzai
    zzai almost 2 years

    I have the following code to rotate a div. By mousedown event on the image in the upper-right corner of the same div. I want the div to rotate till mouse up. logically I believe the code is fine but it works after a click. Instead of mouseup the rotation stops when I click on an other item. I think on dragging after mouse down the browser tries to drag the image but I need help.. thanks in advance :)

    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)');
    }​