20190530 div-ドラッグドラッグ(2)

以下のリストは、DOM要素のリストと、イベントの大きさであり、それは位置を計算するために様々な方法で使用される、非常に精通している必要があります。

分割線>>>>> <<<<< -------------- -------------------

elment要素には属性が来ます

サイズ スタイルの属性に対応 リマーク
offsetWidth 幅+ 2 * borderWidth 境界線の幅+ 2 *
offsetHeight 高さ+ 2 * borderWidth ボーダーの高さ+ 2 *
offsetTop (ドラッグ現在の要素の位置を取得するための)親要素に対して
offsetLeft (ドラッグ現在の要素の位置を取得するための)親要素に対して
clientWidth 内部素子幅
clientHeight 高さ 室内高の要素

getBoundingClientRect() - >魔法のAPI

サイズ 計算 リマーク
offsetWidth 全体の幅の要素
高さ offsetHeight 全体の高さの要素
offsetTop(親要素)+ boderWidth(親要素)+ offsetTop ビューポートに関して
offsetLeft(親要素)+ boderWidth(親要素)+ offsetLeft
左+ offsetWidth
トップ+ offsetHeight
バツ 左  
上  

イベントオブジェクトの寸法

サイズ 説明
clientX、clientYプロパティ クライアント・アプリケーションは、イベントを提供するレベル領域が---垂直座標(ページとは異なる座標)、発生したマウスの位置を計算するために使用します
layerX、layerY 親要素の外縁にマウスの位置
offsetX、offsetY 内縁(パディングエッジ)にマウスを相対的に充填するX、Y軸方向に親要素の縁内のターゲットノードイベントオブジェクトとの位置をオフセット
pageX、pageY 文書のエッジに基づいて、任意のページのレベルを考慮すると、垂直方向にスクロールします。
がscreenX、screenYの マウスがスクリーンの水平からの相対座標、垂直オフセット
X、Y clientX、別名clientYプロパティプロパティ。

分割線>>>>> <<<<< -------------- -------------------

分割線>>>>> <<<<< -------------- -------------------

コードはまだ完全に目が覚えていないことを理解するためにノックする必要があります。したがって、以下のコードをコピーし、紙の位置を計算します

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>drag</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    #container {
      border: 1px solid #000;
      position: absolute;
      left: 30px;
      top: 50px;
      width: 1000px;
      height: 800px;
    }

    #dragEl {
      position: absolute;
      width: 50px;
      height: 50px;
      border: 1px solid #000;
      left: 10px;
      top: 10px;
    }
  </style>
</head>
<body>
<div style="position: relative;height: 1000px">
  <div id="container">
    <div id="dragEl"></div>
  </div>
</div>
</body>
</html>
<script>
  const dragEl = document.getElementById('dragEl');

  const {
    offsetLeft, // 10 ===> 相对于父元素
    offsetTop, // 10 ===> 相对于父元素
    offsetWidth, // 52 ==> 加边框宽度
    offsetHeight, // 52 ==> 加边框宽度
    clientWidth, // 50 ===> 不包含边框
    clientHeight, // 50 ===> 不包含边框
  } = dragEl;

  console.log(dragEl.offsetParent);

  // 获取当前元素的位置+尺寸信息
  // width: 52 ===> offsetWidth
  // height: 52 ===> offsetHeight
  // top: 61 ====> 50 + 1(父元素边宽) + 10
  // left: 41 ===> 30 + 1(父元素边宽) + 10
  // right: 93 ====> 41(left) + 50 + 2(自己的边宽)
  // bottom: 113 ====> 61(top) + 50 + 2(自己的边宽)
  // x: 41 = left
  // y: 61 = top
  const dragElRect = dragEl.getBoundingClientRect();

  /*
  * 点击event上的尺寸数据:
  * 提供事件发生时的应用客户端区域的水平、垂直坐标 (与页面坐标不同)
  * clientX: 73 = 32(layerX) + 41(left)
  * clientY: 90 = 29(layerY) + 61(top)
  *
  * 鼠标相对于父元素外边缘的位置
  * layerX: 32
  * layerY: 29
  *
  * 鼠标相对于父元素内边缘的位置
  * 事件对象与目标节点的内填充边(padding edge)在 X、Y轴方向上的偏移量
  * offsetX: 31
  * offsetY: 28
  *
  * 基于文档的边缘,考虑任何页面的水平、垂直方向上的滚动。
  * pageX: 73
  * pageY: 90
  *
  * 鼠标相对于屏幕坐标系的水平、垂直偏移量
  * screenX: 73
  * screenY: 161
  *
  * clientX、clientY 属性的别名.
  * x: 73
  * y: 90
  *
  * */
  dragEl.addEventListener('mousedown', function (e) {
    console.log(e);
  });

</script>
复制代码

ます。https://juejin.im/post/5cefdeace51d45598611b906で再現

おすすめ

転載: blog.csdn.net/weixin_34377919/article/details/91413473