▲TOPへ戻る

【Javascript】マウスの指す(X, Y)座標とドラッグ & ドロップを理解する

hover acrive

前回はマウスイベントについて説明しました。まだの方は以下を参照してください。

今回はその応用で、マウスの指す(X, Y)座標とドラッグ & ドロップを理解したいと思います。

js
【Javascript】マウスイベント(mouseEvent)の種類と書き方

マウスの指す座標を理解する

画面上での座標

画面上の任意の場所をクリックしてみてください。

画面左上角からの(X, Y)座標 : (0, 0)px

  document.addEventListener("click", function(event){
    let x = event.clientX;
    let y = event.clientY;
    
    console.log("画面左上角からの(X, Y)座標 : (" + x +", " + y + ")px");
  });

要素内の座標

クリックした場所での
画面左上角からの(X, Y)座標 : (0, 0)px
要素左上角からの(X, Y)座標 : (0, 0)px

要素内のX座標 = 画面左上角からのX座標 - 要素.getBoundingClientRect().left;

要素内のY座標 = 画面左上角からのY座標 - 要素.getBoundingClientRect().top;

マウスイベント
  area.addEventListener("click", function (event) {
    let x = event.clientX;
    let y = event.clientY;
    let propertyX = area.getBoundingClientRect().left;
    let propertyY = area.getBoundingClientRect().top;
    
    console.log("要素左上角からの(X, Y)座標 : (" + (x - propertyX) +", " + (y - propertyY) +")px ");

参考

js
【Javascript】要素の高さを取得する方法。getBoundingClientRectについて。

ドラッグ & ドロップ

left : , top :
gao

X軸方向だけ解説

X軸方向だけ解説します。Y軸方向も要領は一緒です。

mousemove
  // 要素を取得
  const area = document.querySelector(".area");
  // クリックする画像を取得
  const img = document.querySelector(".gao");
  
  // マウスボタンを押した時
  img.onmousedown = function (event) {
    //  画像上のクリックした場所を取得
    let adjustX =
      event.clientX -
      img.getBoundingClientRect().left +
      area.getBoundingClientRect().left;
    let adjustY =
      event.clientY -
      img.getBoundingClientRect().top +
      area.getBoundingClientRect().top;
    
    // この位置まで移動
    function moveAt(x, y) {
      img.style.left = x - adjustX + "px";
      img.style.top = y - adjustY + "px";
    }
    
    // マウスムーブしているときの処理
    function onMouseMove(e) {
      moveAt(e.x, e.y);
    }
  
    document.addEventListener("mousemove", onMouseMove);
  
    // マウスボタンを離した時の処理
    img.onmouseup = function () {
      document.removeEventListener("mousemove", onMouseMove);
      img.onmouseup = null;
    };
  };

不具合の処理

  // ブラウザ独自のドラッグ&ドロップと競合させない
  img.ondragstart = function () {
    return false;
  };
  // 不具合が起きた時、ダブルクリックでリロード
  window.ondblclick = function () {
    window.location.reload();
  };

応用

紙クズをゴミ箱までドラッグし、そのうえでマウスを離すと紙クズが消えるようにします。

trash

紙クズがゴミ箱に入った時の判定

 function inBx() {
  let trashcanRect = trashcan.getBoundingClientRect();
  let trashRect = trash.getBoundingClientRect();
  let inBox =
    trashRect.left >= trashcanRect.left &&  // ゴミ箱左端
    trashRect.right <= trashcanRect.right &&  // ゴミ箱右端
    trashRect.top >= trashcanRect.top &&  // ゴミ箱上端
    trashRect.bottom <= trashcanRect.bottom;  // ゴミ箱下端
    if (inBox == true) {
      return true;  // ゴミ箱に入った時
    } else {
      return false; //  ゴミ箱に入らなかった時 
    }
  }

全体のコード

  const wrapper = document.querySelector(".wrapper");
  const trash = document.querySelector(".trash");
  const trashcan = document.querySelector(".trashcan");
    
  // マウスをクリックした時
  trash.onmousedown = function (e) {
    trash.style.position = "absolute";
    trash.style.zIndex = "1000";
      
    let adjustX =
      event.clientX -
      trash.getBoundingClientRect().left +
      wrapper.getBoundingClientRect().left;
    let adjustY =
      event.clientY -
      trash.getBoundingClientRect().top +
      wrapper.getBoundingClientRect().top;
    
    function moveAt(x, y) {
      trash.style.left = x - adjustX + "px";
      trash.style.top = y - adjustY + "px";
    }
    
    function onMouseMove(e) {
      moveAt(e.x, e.y);
      trash.style.transform = "scale(0.9)";
      onMouseOver();
    }
    
    // 紙クズがゴミ箱の範囲に入った時の処理
    function inBx() {
      let trashcanRect = trashcan.getBoundingClientRect();
      let trashRect = trash.getBoundingClientRect();
      let inBox =
        trashRect.left >= trashcanRect.left &&
        trashRect.right <= trashcanRect.right &&
        trashRect.top >= trashcanRect.top &&
        trashRect.bottom <= trashcanRect.bottom;
      if (inBox == true) {
        return true;
      } else {
        return false;
      }
    }
    
    //  紙クズがゴミ箱の上に載った時(クリックした状態)
    function onMouseOver() {
      if (inBx() == true) {
        trashcan.style.background = "red";
      } else {
        trashcan.style.background = "rgb(216, 208, 224)";
      }
    }
    
    document.addEventListener("mousemove", onMouseMove);
    
    // クリックを離した時の処理
    trash.onmouseup = function () {
      //  紙クズがゴミ箱の範囲内にある時    
      if (inBx() == true) {
        trash.style.display = "none";
        trashcan.style.background = "rgb(216, 208, 224)";
      } else {
        document.removeEventListener("mousemove", onMouseMove);
      trash.style.transform = "scale(1)";
      trash.onmouseup = null;
      }
    };
  };

  // ブラウザ独自のドラッグ&ドロップと競合させない
  trash.ondragstart = function () {
    return false;
  };

まとめ

  1. 画面左上角からの(X, Y)座標を取得する
  2.   document.addEventListener("click", function(event){
      let x = event.clientX;
      let y = event.clientY;
    });
  3. getBoundingClientRect()でクリックした位置を取得し、調整
  4. ドラッグ & ドロップ
  5. マウスダウン → マウスムーブ → マウスアップ

こんな記事も読まれています。

profile

パソコン好きなガオ

コロナ禍によるステイホームを機にプログラミングを学ぶ。パソコンに関してはプロではないが、ちょっと詳しい程度。

パソコン

javascript

カメラ

ブログ