2

I'm trying to make some code to resize an element to the mouse cursor, with the element "anchored" to a certain starting position. However, it quickly falls apart when the element is rotated. Here's my code right now:

var block = document.getElementById("block");
var desiredX = block.offsetLeft;
var desiredY = block.offsetTop;
function resize(event) {
    block.style.left = Math.min(event.pageX, desiredX) + "px";
    block.style.top = Math.min(event.pageY, desiredY) + "px";
    block.style.width = Math.abs(event.pageX - desiredX) + "px";
    block.style.height = Math.abs(event.pageY - desiredY) + "px";
}
document.addEventListener("mousemove", resize);
#block {
    height: 10em;
    width: 2em;
    background-color: gray;
    border: 1px solid black;
    position: absolute;
  zIndex: 1;
    cursor: pointer;
}
#inputs {
  zIndex: 2;
  position: absolute;
  right: 10px;
  bottom: 10px;
}
<div id="block" style="left: 50px; top: 50px;"></div>
<div id="inputs"><label for="rotation">Rotate block:</label><br /><input type="range" min="0" max="360" value="0" id="rotation" style="width: 250px" oninput="block.style.transform = 'rotate(' + this.value + 'deg)'"></input></div>

How can I make it so that the corner of the block will always reach the cursor, regardless of rotation?

I did find a similar question/answer (Resizing Handles on a Rotated Element), but I couldn't figure out how to properly adapt the answer for this situation. Here was my failed attempt at doing so:

var block = document.getElementById("block");
var desiredX = block.offsetLeft;
var desiredY = block.offsetTop;
function resize(event) {
  var angle = +block.style.transform.replace(/[^0-9]/gi, '')*(Math.PI/180);
  var len = Math.sqrt(Math.pow(event.pageX - block.offsetLeft, 2)+Math.pow(event.pageY - block.offsetTop, 2));
    block.style.left = Math.min(event.pageX, desiredX) + "px";
    block.style.top = Math.min(event.pageY, desiredY) + "px";
    block.style.width = Math.abs(Math.sin(angle)*len) + "px";
    block.style.height = Math.abs(Math.cos(angle)*len) + "px";
}
document.addEventListener("mousemove", resize);
#block {
        height: 10em;
        width: 2em;
        background-color: gray;
        border: 1px solid black;
        position: absolute;
      zIndex: 1;
        cursor: pointer;
    }
    #inputs {
      zIndex: 2;
      position: absolute;
      right: 10px;
      bottom: 10px;
    }
<div id="block" style="left: 50px; top: 50px;"></div>
<div id="inputs"><label for="rotation">Rotate block:</label><br /><input type="range" min="0" max="360" value="0" id="rotation" style="width: 250px" oninput="block.style.transform = 'rotate(' + this.value + 'deg)'"></input></div>
Lemondoge
  • 959
  • 4
  • 17

0 Answers0