Search code examples
javascriptjquerydraggabledroppable

Stop element moving on mouse scroll using rotatable class


I am currently working on a drag-drop web application whereupon users can plan a marquee layout.

Part of the functionality is that users can rotate certain items of furniture on the canvas. However, it seems that scrolling whilst your mouse pointer is over a rotatable element will also rotate that element, which causes problems, especially if the user has got their layout perfect and then scrolls down the page to fill in a form - potentially messing up the layout.

The app uses the rotatable class from jQuery, and implements the draggable and droppable classes.

This is my javascript:

$(function() {
  //Make every clone image unique.
  var counts = [0];
  var resizeOpts = {
    handles: "all",
    autoHide: true
  };
  var nw = $("<div>", {
    class: "ui-rotatable-handle"
  });
  var ne = nw.clone();
  var se = nw.clone();

  $('.box div.ui-rotatable-handle').addClass("ui-rotatable-handle-sw");
  nw.addClass("ui-rotatable-handle-nw");
  ne.addClass("ui-rotatable-handle-ne");
  se.addClass("ui-rotatable-handle-se");

  $(".dragImg").draggable({
    helper: "clone",
    //Create counter
    start: function() {
      counts[0]++;
    }
  });


  $("#dropHere").droppable({
    drop: function(e, ui) {
      if (ui.draggable.hasClass("dragImg")) {
        $(this).append($(ui.helper).clone());
        //Pointing to the dragImg class in dropHere and add new class.
        $("#dropHere .dragImg").addClass("item-" + counts[0]);
        $("#dropHere .img").addClass("imgSize-" + counts[0]);

        //Remove the current class (ui-draggable and dragImg)
        $("#dropHere .item-" + counts[0]).removeClass("dragImg ui-draggable ui-draggable-dragging").addClass('rotatable');

        $('.rotatable').resizable().rotatable();
        //$(".rotatable").append(nw, ne, se);
        $(".small-table div[class*='ui-rotatable-handle-']").bind("mousedown", function(e) {
          $('.rotatable').resizable().rotatable();
          $('.rotatable').rotatable("instance").startRotate(e);
        });

        $(".item-" + counts[0]).dblclick(function() {
          $(this).remove();
        });

        make_draggable($(".item-" + counts[0]));
        $(".imgSize-" + counts[0]).resizable(resizeOpts);
      }

    }
  });


  var zIndex = 0;

  function make_draggable(elements) {
    elements.draggable({
      containment: 'parent',
      start: function(e, ui) {
        ui.helper.css('z-index', ++zIndex);
      },
      stop: function(e, ui) {}
    });
  }
});

As you can see, each item that is dragged is cloned once it's dropped on the dropzone (#dropHere div) and then remains on there unless it's double clicked. I want to know, is there any way to stop the element rotating if the user scrolls their mouse over it?

EDIT: Here is a FIDDLE of the app:


Solution

  • Note that you just can configure you rotatable by passing parameters as and object , one of those parameters is the wheelRotate whihch set to true by default , so you've just to create an object contating this param with false value : var rotateParams = {wheelRotate:false}; and then passe the object in the rotatable() fanction as below :

    $('.rotatable').resizable().rotatable(rotateParams);
    

    Please see bellow working snippet : //adds are commented

    $(function() {
      //Make every clone image unique.
      var counts = [0];
      var resizeOpts = {
        handles: "all",
        autoHide: true
      };
      var nw = $("<div>", {
        class: "ui-rotatable-handle"
      });
      var ne = nw.clone();
      var se = nw.clone();
    
      $('.box div.ui-rotatable-handle').addClass("ui-rotatable-handle-sw");
      nw.addClass("ui-rotatable-handle-nw");
      ne.addClass("ui-rotatable-handle-ne");
      se.addClass("ui-rotatable-handle-se");
    
      $(".dragImg").draggable({
        helper: "clone",
        //Create counter
        start: function() {
          counts[0]++;
        }
      });
    
      /****** adding config param ******/
      var rotateParams = {
        wheelRotate: false
      };
      /**/
      $("#dropHere").droppable({
        drop: function(e, ui) {
          if (ui.draggable.hasClass("dragImg")) {
            $(this).append($(ui.helper).clone());
            //Pointing to the dragImg class in dropHere and add new class.
            $("#dropHere .dragImg").addClass("item-" + counts[0]);
            $("#dropHere .img").addClass("imgSize-" + counts[0]);
    
            //Remove the current class (ui-draggable and dragImg)
            $("#dropHere .item-" + counts[0]).removeClass("dragImg ui-draggable ui-draggable-dragging").addClass('rotatable');
    
            /****** applying the config param ******/
            $('.rotatable').resizable().rotatable(rotateParams);
            //$(".rotatable").append(nw, ne, se);
            $(".small-table div[class*='ui-rotatable-handle-']").bind("mousedown", function(e) {
              /****** applying the config param ******/
              $('.rotatable').resizable().rotatable(rotateParams);
              $('.rotatable').rotatable("instance").startRotate(e);
            });
    
            $(".item-" + counts[0]).dblclick(function() {
              $(this).remove();
            });
    
            make_draggable($(".item-" + counts[0]));
            $(".imgSize-" + counts[0]).resizable(resizeOpts);
          }
    
        }
      });
    
    
      var zIndex = 0;
    
      function make_draggable(elements) {
        elements.draggable({
          containment: 'parent',
          start: function(e, ui) {
            ui.helper.css('z-index', ++zIndex);
          },
          stop: function(e, ui) {}
        });
      }
    
    });
    #outer-dropzone {
      height: 140px;
    }
    
    #inner-dropzone {
      height: 80px;
    }
    
    .dropzone {
      background-color: #ccc;
      border: dashed 4px transparent;
      border-radius: 4px;
      margin: 10px auto 30px;
      padding: 10px;
      width: 80%;
      transition: background-color 0.3s;
    }
    
    .drop-active {
      border-color: #aaa;
    }
    
    .drop-target {
      background-color: #29e;
      border-color: #fff;
      border-style: solid;
    }
    
    .drag-drop {
      display: inline-block;
      min-width: 40px;
      color: #fff;
      background-color: transparent;
      -webkit-transform: translate(0px, 0px);
      transform: translate(0px, 0px);
      transition: background-color 0.3s;
    }
    
    .drag-drop.can-drop {}
    
    .dragImg {
      width: 50px;
      height: 50px;
      cursor: move;
    }
    
    .small-table {
      width: 50px;
      height: 50px;
      cursor: move;
    }
    
    #dropHere {
      width: 400px;
      height: 400px;
      border: dotted 1px black;
      float: left;
    }
    
    .box {
      border: 2px solid black;
      width: 100px;
      height: 100px;
      background-color: green;
      margin: 27px;
      position: relative;
    }
    
    .ui-rotatable-handle {
      background: url("https://image.ibb.co/knL4iF/1497037929_rotate_right.png");
      background-repeat: no-repeat;
      background-size: 100% 100%;
      height: 25px;
      width: 25px;
      position: absolute;
      top: -10px;
      left: -10px;
    }
    
    .ui-rotatable-handle-sw {
      bottom: -27px;
      left: -27px;
    }
    
    .ui-rotatable-handle-nw {
      top: -27px;
      left: -27px;
    }
    
    .ui-rotatable-handle-se {
      bottom: -27px;
      right: -27px;
    }
    
    .ui-rotatable-handle-ne {
      top: -27px;
      right: -27px;
    }
    
    .small-table {
      background-image: url('https://image.ibb.co/gXCjiF/small_table.png');
      background-size: contain;
    }
    
    .dance-floor {
      background-image: url('https://image.ibb.co/gjHjiF/dance_floor.png');
      background-size: contain;
      width: 100px;
      height: 100px;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <script src="https://cdn.jsdelivr.net/jquery.ui.rotatable/1.1/jquery.ui.rotatable.min.js"></script>
    <div class="container">
    
      <div class="dragImg small-table"></div>
      <div class="dragImg dance-floor"></div>
    
      <div id="dropHere"></div>
    
    </div>