【前端案例】 22 - 案例:移动端拖动元素

案例演示

移动端拖拽元素

功能分析

  1. touchstarttouchmovetouchend可以实现拖动元素;

  2. 但是拖动元素需要当前手指的坐标值 我们可以使用 targetTouches[0] 里面的pageXpageY

  3. 移动端拖动的原理: 手指移动中,计算出手指移动的距离。然后用盒子原来的位置 + 手指移动的距离;

  4. 手指移动的距离: 手指滑动中的位置 减去 手指刚开始触摸的位置。

拖动元素三步曲:

  1. 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置;

  2. 移动手指touchmove: 计算手指的滑动距离,并且移动盒子;

  3. 离开手指 touchend

代码实现

div {
      position: absolute;
      left: 0;
      top: 0;
      width: 200px;
      height: 200px;
      background-color: pink;
    }
/**
   * 1. 触摸元素 touchstart 获取手指初始坐标,同时获得盒子原来的位置
   *
   * 2. 移动手指 touchmove 计算手指的滑动距离并且移动盒子
   *
   * 3. 手指离开 touchend
   *
   * 4. 手指移动也会触发滚动屏幕的事件这里需要阻止其默认的事件 e.preventDefault()
   */
  let div = document.querySelector('div');
  let startX = 0;
  let startY = 0;
  let x = 0;
  let y = 0;

  /**
   * 当鼠标触摸屏幕的时候获取到当前鼠标所在初始的位置 和 元素 div 的初始位置
   */
  div.addEventListener('touchstart', (e) => {
    startX = e.targetTouches[0].pageX;
    startY = e.targetTouches[0].pageY;
    x = div.offsetLeft;
    y = div.offsetTop;
  })

  /**
   * 当鼠标移动的时候 需要获取到当前鼠标的位置 计算出鼠标初始位置到当前位置移动的坐标
   */
  div.addEventListener('touchmove', (e) => {
    let moveX = e.targetTouches[0].pageX - startX;
    let moveY = e.targetTouches[0].pageY - startY;
    // 移动盒子
    div.style.left = x + moveX + 'px';
    div.style.top = y + moveY + 'px';
    // 禁用默认的屏幕滚动事件
    e.preventDefault();
  })

你可能感兴趣的:(【前端案例】 22 - 案例:移动端拖动元素)