移动端盒子拖拽

简介: 移动端盒子拖拽

react 移动端盒子拖拽


html结构


<div className='content' ref={boxs} >
        {
          lists.map((item, index) => {
            return (
              <span key={index}
                className='box'
                style={{ backgroundImage: `url(${item.img})`, top: item.top, left: item.left }}
              >
                {item.title}
                <div className='close' onClick={(e) => delCard(e, index)}></div>
              </span>
            )
          })
        }
      </div>


盒子的基本样式



.movecard>.content {
  border: 1px solid black;
  height: 400px;
  position: relative;
  padding: 20px;
  box-sizing: border-box;
}
.movecard>.content>.box {
  border: 1px solid black;
  position: absolute;
  border-radius: 3px;
  height: 60px;
  width: 60px;
  cursor: move;
  background-size: cover;
  background-repeat: no-repeat;
  color:white;
  box-sizing: border-box;
  padding-top: 10px;
}
.movecard>.content>.box .close{
  position: absolute;
  top: 0;
  right: 0;
  text-align: center;
  line-height: 15px;
  border-radius: 50%;
  height: 15px;
  width: 15px;
  position: absolute;
  background-color:white;
  color: red;
}
.movecard>.imgs {
  display: flex;
  justify-content: space-evenly;
  margin: 20px 0;
}
.movecard>.imgs img {
  border-radius: 3px;
  height: 60px;
  width: 60px;
}
.imgOn{
  border-radius: 3px;
  height: 60px;
  width: 60px;
  border: 3px solid rgb(98, 255, 98);
  box-sizing: border-box;
}


拖拽的方法


// 设置心愿卡片的拖动监听事件
  useEffect(() => {
    // 第一步:给元素添加开始触摸事件,获取元素原本对于浏览器的x,y位置
    boxs.current.addEventListener('touchstart', (e) => {
      if (e.target.nodeName !== 'SPAN') return;
      let X = e.touches[0].clientX;
      let Y = e.touches[0].clientY;
      let boxX = e.target.offsetLeft;
      let boxY = e.target.offsetTop;
      // 第二步:设置元素拖动事件,拖动时获取元素对于窗口的位置,
      // 使用这个位置-开始点击时对于窗口的位置+元素当前对于父盒子定位的偏移值
      // 就可以实时得到当前的偏移值,实时赋值给元素的top、left属性
      e.target.addEventListener('touchmove', (e) => {
        let { clientX, clientY } = e.touches[0];
        let moveX = clientX - X + boxX <= 0 ? 0 : clientX - X + boxX;
        let moveY = clientY - Y + boxY <= 0 ? 0 : clientY - Y + boxY;
        e.target.style.left = moveX + 'px';
        e.target.style.top = moveY + 'px';
        // 第三步:最后加个拖动的范围就可
        if (moveX >= 345 - e.target.clientWidth) {
          e.target.style.left = 345 - e.target.clientWidth + 'px';
        }
        if (moveY >= 395 - e.target.clientHeight) {
          e.target.style.top = 395 - e.target.clientHeight + 'px';
        }
      })
    })
  }, [])

目录
相关文章
|
7月前
|
前端开发 JavaScript 容器
实现一个移动端焦点轮播图
实现一个移动端焦点轮播图
|
7月前
|
前端开发 JavaScript
uniapp移动端悬浮按钮(吸附边缘)
uniapp移动端悬浮按钮(吸附边缘)
361 0
|
小程序 前端开发 容器
微信小程序隐藏右侧滚动条并可以滚动
微信小程序隐藏右侧滚动条并可以滚动
483 0
|
2月前
|
前端开发 JavaScript API
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
本文通过构建一个 3D 翻卡动画深入探讨了 CSS Houdini 的强大功能,展示了如何通过 Worklets、自定义属性、Paint API 等扩展 CSS 的能力,实现高度灵活的动画效果。文章首先介绍了 Houdini 的核心概念与 API,并通过构建一个动态星空背景、圆形进度条以及交互式 3D 翻卡动画的实际示例,展示了如何利用 CSS Houdini 赋予网页设计更多创造力。最后,还演示了如何将这种 3D 翻卡效果集成到公司网站中,提升用户体验。CSS Houdini 的创新能力为网页设计带来了前所未有的灵活性,推动了前端开发迈向新的高度。
50 0
探索 CSS Houdini:轻松构建酷炫的 3D 卡片翻转动画
|
7月前
|
前端开发
Flutter笔记:光影动画按钮、滚动图标卡片组等
Flutter笔记:光影动画按钮、滚动图标卡片组等
88 0
|
小程序
uniapp悬浮图标支持拖动支持微信小程序
uniapp悬浮图标支持拖动支持微信小程序
136 0
|
JavaScript Serverless 容器
ue仿携程轮播图效果(滑动轮播,下方高度自适应)
这篇文章主要介绍了vue仿携程轮播图效果(滑动轮播,下方高度自适应),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
uniapp实现横向滚动样式条
本文讲解,uniapp如何实现横向滚动样式条
1243 0
uniapp实现横向滚动样式条
|
前端开发
前端项目实战213-移动端控制单页面全屏背景色
前端项目实战213-移动端控制单页面全屏背景色
183 0
|
前端开发 JavaScript
【前端】侧边栏显示隐藏的实现和动画效果
【前端】侧边栏显示隐藏的实现和动画效果
606 0