react实现拖拽(许愿墙)

html部分:
<div className='wish' onLoad={ loadHandler }>
    {
         wish.map((item, index) => {
               return <div className='target' key={index}>
                         <img src={arr[item.idx].src} />
                         <p>{item.value}</p>
                         <span onClick={() => del(index)}>X</span>
                      </div>
         })
    }
</div>

css部分:

// 父盒子设置大小  设置相对定位
.wish {
    width: 100% ;
    height: 400px;
    position: relative;
}
// 许愿块设置大小  设置绝对定位
.target {
    width: 100px;
    height: 100px;
    position: absolute;
}

js代码:

 // 拖拽
    const loadHandler = function () {
        // 1.获取所有的 target 愿望
        var targetAll = document.querySelectorAll('.target');

        var startX = 0;
        var startY = 0;

        // 2.渲染遍历出所有的 target , 给每一个target 都添加了touchstart事件
        for (let i = 0; i < targetAll.length; i++) {
          var target = targetAll[i]
        }
    
        // 3.获取鼠标所在 元素内的 x y 轴坐标
        target.addEventListener('touchstart', function (e) {
          startX = e.targetTouches[0].pageX - this.offsetLeft;
          startY = e.targetTouches[0].pageY - this.offsetTop;
        });
        
        // 4 获取移动的 x y 轴的量
        target.addEventListener('touchmove', function (e) {
          // 移动的 X 轴值
          var leftX = e.targetTouches[0].pageX - startX;
          // 获取 Y 轴值
          var topY = e.targetTouches[0].pageY - startY;
          // 获取 target 的宽度
          var thisW = e.targetTouches[0].target.clientWidth;
          // 获取 target 父级 container 的宽度
          var parentW = e.targetTouches[0].target.offsetParent.offsetParent.clientWidth;
          // 获取 target 的高度
          var thisH = e.targetTouches[0].target.offsetParent.clientHeight;
          // 获取 target 父级 container 的高度
          var parentH = e.targetTouches[0].target.offsetParent.offsetParent.clientHeight;

           
          if (leftX <= 0) {  // x 开始位置
            leftX = 0;
          }
    
          if (leftX >= parentW - thisW) {  // x 结束位置
            leftX = parentW - thisW;
          }
    
          if (topY <= 0) {  // y 开始位置
            topY = 0;
          }
    
          if (topY >= parentH - thisH) {  // y 结束位置
            topY = parentH - thisH;
          }
    
          this.style.left = leftX + "px"
          this.style.top = topY + 'px';
        });
        target.addEventListener('touchend', function (e) {
          // this.innerHTML = '你终于放弃揪着我了,谢谢!';
        });
      };

拖拽

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值