美文网首页
js中好玩的案例之拖拽

js中好玩的案例之拖拽

作者: 周周很可爱 | 来源:发表于2019-10-21 16:39 被阅读0次

学习js的过程中,相信大家都学过拖拽这个案例吧,那么怎么让拖拽变得更高级,更好玩呢,下面给大家讲一下,下图是最终实现效果。


屏幕快照 2019-10-21 下午4.20.03.png 屏幕快照 2019-10-21 下午4.20.35.png

在上面的大盒子里有三个粉色的小盒子,我们通过拖拽 ,可以把这三个小盒子拖拽到下面的大盒子中,也可以再把在下面大盒子里的小盒子拖到上面大盒子中,是不是很有趣呢?下面给大家讲解一下。

html样式

   <div class="first"></div>
     <div class="second">
    <div class="sm-box">1</div>
    <div class="sm-box">2</div>
    <div class="sm-box">3</div>
   </div>

css样式

 * {
  padding: 0;
  margin: 0;
  list-style: none;
 }
body {
background-color: #87cccc;
  }
.first,
 .second {
 width: 500px;
height: 250px;
 margin: 100px auto;
border: 1px solid #9b8888;
}
 .sm-box {
  width: 50px;
  height: 50px;
   background-color: pink;
   text-align: center;
    color: #fff;
    line-height: 50px;
   user-select: none;
  }

js样式

 // 首先我们要考虑两个大盒子的坐标位置
 var firstBox = document.querySelector('.first');
  var secondBox = document.querySelector('.second');
  // 两个大盒子的范围
  var firstRect = firstBox.getBoundingClientRect();
  var secondRect = secondBox.getBoundingClientRect();
// 所有小盒子
var smBoxs = document.querySelectorAll('.sm-box');
// 鼠标按下的坐标
var downX = 0,
downY = 0;
// 鼠标坐标距离盒子左侧、顶部的距离
var distanceX = 0;
distanceY = 0;
 // 虚拟盒子
 var virtualBox = null;
// 按下的开关
 var flag = false;
 // 当前下标
 var curIdx= 0;
for (var i = 0; i < smBoxs.length; i++) {
// 第一种方法
(function (idx) {
    smBoxs[idx].onmousedown = function (e) {
        curIdx = idx;
        // 按下的坐标
        downX = e.clientX;
        downY = e.clientY;
        // 鼠标坐标距离盒子左侧、顶部的距离
        distanceX = downX - this.offsetLeft;
        distanceY = downY - this.offsetTop;
        // 开启
        flag = true;
        // 创建一个虚拟的盒子
        virtualBox = this.cloneNode(true);
        // 设定位置
        // virtualBox.style.position = 'absolute';
        // virtualBox.style.top = this.offsetTop;
        // virtualBox.style.left = this.offsetLeft;
        // virtualBox.style.opacity = .4;
        virtualBox.style.cssText = 'position: absolute; top:' + this.offsetTop + 'px; left:' + this.offsetLeft + 'px; opacity: .4; background-color: green;';
        document.body.appendChild(virtualBox);
    }
     })(i);
   }
var moveX = 0;
moveY = 0;
  window.onmousemove = function (e) {
if (flag) {
    // 移动的光标位置
    moveX = e.clientX;
    moveY = e.clientY;
    // 盒子移动的距离
    var left = moveX - distanceX;
    var top = moveY - distanceY;

    virtualBox.style.top = top + 'px';
    virtualBox.style.left = left + 'px';
    }
 }
 window.onmouseup = function (e) {
flag = false;
// 是否处于 第一个盒子范围
if (isRange(moveX, moveY, firstRect)) {
    smBoxs[curIdx].parentNode !==firstBox && firstBox.appendChild(smBoxs[curIdx]);      
}
// 是否处于 第二个盒子范围
if (isRange(moveX, moveY, secondRect)) {
    smBoxs[curIdx].parentNode !==secondBox && secondBox.appendChild(smBoxs[curIdx]);   
}
//移除虚拟元素
virtualBox && document.body.removeChild(virtualBox);
virtualBox = null;
moveX = 0;
moveY = 0;
downX = 0,
downY = 0;
distanceX = 0;
distanceY = 0;
    }
 // 判断鼠标是否进入范围
    function isRange(x, y, range) {
    return (range.left <= x) && (range.right >= x) && (range.top <= y) &&         (range.bottom >= y) ? true : false;
}

是不是很有趣呢?感兴趣的话可以试一下,js小白,如有错误,望多指教

相关文章

  • js中好玩的案例之拖拽

    学习js的过程中,相信大家都学过拖拽这个案例吧,那么怎么让拖拽变得更高级,更好玩呢,下面给大家讲一下,下图是最终实...

  • js之好玩的拖拽

    拖拽功能主要是用在让用户做一些自定义的动作,比如拖动排序,弹出框拖动移动等等,效果还是蛮不错的。下面讲解一下拖拽如...

  • Drag Drop---API

    在h4标准中,我们定义个拖拽事件是很麻烦的,用原生的js来实现拖拽的效果。我们需要计算拖拽的元素的坐标位置和距离之...

  • js拖拽html元素工具类

    复制就能用的拖拽js方法 原生js实现拖拽元素方法 使用(注意拖拽目标元素需绝对定位 position: 'abs...

  • JS 实现拖拽之 - 列表拖拽

    这次的列表拖拽模型主要模仿的就是简书后台写文章里面的功能。上个九宫格拖拽只是这次的一个意外。研究完上个模型再写这个...

  • 拖拽

    一、JS拖拽JS里拖拽三事件, onmousedown onmousemove onmouseup 是实现交互性效...

  • 原生js实现拖拽(碰撞检测)

    js实现拖拽

  • js实现拖拽

    ①鼠标按下+鼠标移动 → 拖拽②鼠标松开 → 无拖拽③鼠标偏移 → 拖拽距离 js实现 ① onmousedown...

  • h5拖拽相关事件

    拖拽 Sortable.js插件拖拽的时候主要由这几个事件完成,

  • Xcode编译WebApps找不到js的错误解决办法

    解决的办法:将Targets ->Build Phases-> Compile Sources 中的js文件拖拽到...

网友评论

      本文标题:js中好玩的案例之拖拽

      本文链接:https://www.haomeiwen.com/subject/wbwtvctx.html