Исправить направление мыши перетаскиваемого div внутри повернутого родителя

Пожалуйста, посмотрите на мой jsfiddle, чтобы понять мою проблему: желтый - это родительский div, который вы можете вращать, используя красный кружок, он также перетаскивается, внутри этого div есть еще один div с черной рамкой, который мы могли бы рассматривать как содержимое на синий круг. Синий круг можно перетаскивать в пределах границ локализации, координата y больше ничего не требуется, проблема возникает, если вы поворачиваете желтый div ex; 90 градусов или больше, координаты мыши не соответствуют ожидаемой позиции перетаскивания, я пытался решить проблему с помощью тригонометрии и изменения оси, но это напрасно, я надеюсь, что кто-то может решить эту проблему и оставить jsfiddle для работы образец высоко ценится. "Пожалуйста, не направляйте меня на другие посты, так как я думаю, что прочитал все, что связано с этой проблемой"

HTML

<div id="container">
  <div id="containment">
    <div id="circle"></div>
  </div>
</div>

CSS

#container{width:100px;
       height:140px;
       background:#FFEB3B;
       position:absolute;
       top:50%;
       bottom:50%;
       margin-top:-70px;
       margin-right:-50px}

.ui-rotatable-handle {
        height: 30px;
        width: 30px;
        cursor: pointer;
        background:#ff0000;
        border-radius:50%;
        right: -15px;
        bottom: -15px;
        position:absolute;
        z-index:1}

#containment{width:30px;
         height:190px;
         position:absolute;
         bottom:70px;
         left:35px;
         border:solid 1px #000}

#circle{width:30px;
         height:30px;
         position:absolute;
         top:0;
         left:0;
         border-radius:50%;
         background:#3F51B5}             

JavaScript

$(function(){
            $('#container').draggable().rotatable();
            $('#circle').draggable({containment: $('#containment')
            });
          });

2 ответа

Only way I found it's to add "fake" rectangle and show it on needed degrees. I added only 1 fake rectangle for 45deg+ but you can also add other 2 by same logic for 90deg+ and 115deg+. See solution there.

HTML

      <div id="container">
  <div id="containment">
    <div id="circle" class="circle"></div>
  </div>
  <div id="containment2">
    <div id="circle2" class="circle">
      
    </div>
  </div>
</div>

CSS

      #container {
  width: 100px;
  height: 140px;
  background: #FFEB3B;
  position: absolute;
  top: 50%;
  bottom: 50%;
  margin-top: -70px;
  margin-right: -50px;
}

.ui-rotatable-handle {
  height: 30px;
  width: 30px;
  cursor: pointer;
  background: #ff0000;
  border-radius: 50%;
  right: -15px;
  bottom: -15px;
  position: absolute;
  z-index: 1;
}

#containment,
#containment2 {
  width: 30px;
  height: 190px;
  position: absolute;
  bottom: 70px;
  left: 35px;
  border: solid 1px #000
}

#containment2 {
  width: 190px;
  height: 30px;
  left: 51px;
  bottom: 54px;
  transform: rotate(-90deg);
  border: solid 1px green;
  transform-origin: left;
  display: none;
}

.circle {
  width: 30px;
  height: 30px;
  position: absolute;
  top: 0;
  left: 0;
  border-radius: 50%;
  background: #3F51B5;
  z-index: 10;
}

#circle2 {
  left: calc(100% - 30px);
  display: none;
}

#wrapper {
  width: 100%;
  height: 100%;
  outline: 1px solid red;
}

JavaScript

      $(function() {
  var Pi = 3.14;
  $('#container').draggable({}).rotatable({
    rotate: function(event, ui) {
      let deg = ui.angle.current * 180 / Pi;
      $("#containment").show();
      $("#containment2").hide();
      $("#circle").show();
      $("#circle2").hide();
      if (deg > 45) {
        $("#containment").hide();
        $("#containment2").show();
        $("#circle").hide();
        $("#circle2").show();
      }
    },
  });

  $('#circle').draggable({
    stop: function(event, ui) {
        console.log(ui.position.top);
        $("#circle2").css("inset", ui.position.left + "px auto auto " + (160 - ui.position.top) + "px");
    },
    containment: $('#containment')
  });
  $('#circle2').draggable({
    stop: function(event, ui) {
        $("#circle").css("inset", 160 - ui.position.left + "px auto auto " + ui.position.top + "px");
    },
    containment: $('#containment2')
  });
  
});

У меня были похожие проблемы с JQuery внутри приложения rtl. причина заключалась в том, что, поскольку ориентация макета использует left css позиционирование - right отсутствовал, и расчеты пошли не так.

Добавление их при создании элемента решило эту проблему.

Другие вопросы по тегам