九宫格 拖拽换位置,效果最全,最明显

直接C V !!!!!!!
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>九宫格拖拽</title>
  </head>
  <style type="text/css">
    #content {
      position: relative;
    }
    #content div {
      width: 100px;
      height: 100px;
      float: left;
      line-height: 100px;
      text-align: center;
      font-size: 40px;
      font-weight: 900;
      color: #fff;
      cursor: pointer;
      position: absolute;
      border-radius: 10px;
    }

    #content .draging {
      position: absolute;
    }
  </style>
  <body>
    <div id="content">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
      <div>6</div>
      <div>7</div>
      <div>8</div>
      <div>9</div>
    </div>
    <script type="text/javascript">
      var content = document.getElementById("content");
      var items = content.querySelectorAll("div");
      //   console.log(items);
      //随机颜色
      function colorFn() {
        var o = parseInt(Math.random() * 256);
        var t = parseInt(Math.random() * 256);
        var s = parseInt(Math.random() * 256);
        var str = "rgb(" + o + "," + t + "," + s + ")";
        return str;
      }
      //给每个div添加一个随机背景色,并确定它们的位置
      var r = items[0].clientHeight;
      items.forEach((v, i) => {
        v.style.backgroundColor = colorFn();
        v.style.top = Math.floor(i / 3) * (r + 10) + "px";
        v.style.left = (i % 3) * (r + 10) + "px";
      });
      function itemBox(itemName) {
        itemName.onmousedown = function (evt1) {
          var e = evt1 || window.event;
          //在鼠标点下item的时候克隆一个新的一模一样的名为cloneDiv
          var cloneDiv = document.createElement("div");
          //把样式文字赋给克隆div
          cloneDiv.innerHTML = itemName.innerHTML;
          cloneDiv.style.backgroundColor =
            getComputedStyle(itemName).backgroundColor;
          //使克隆div的class名为draging,使克隆div加绝对定位position:absolute
          cloneDiv.className = "draging";
          //克隆div的定位top left  和原div相同
          cloneDiv.style.top = itemName.offsetTop + "px";
          cloneDiv.style.left = itemName.offsetLeft + "px";
          //把kelongdiv加入到concent大盒子当中
          content.appendChild(cloneDiv);
          //算出鼠标点击克隆div时,鼠标在克隆div中的相对位置
          var offsetX = evt1.pageX - cloneDiv.offsetLeft;
          var offsetY = evt1.pageY - cloneDiv.offsetTop;
          //              cloneDiv.style.zIndex = 10;
          //鼠标开始移动的时候
          document.onmousemove = function (evt) {
            var e2 = evt || window.event;
            //克隆div定位的left  top   evt.pageX鼠标点相对于整个文档中的位置, offsetX鼠标相对于克隆div中的位置     二者相减就是克隆div相对于整个文档中的位置
            cloneDiv.style.left = evt.pageX - offsetX + "px";
            cloneDiv.style.top = evt.pageY - offsetY + "px";
          };
          //当鼠标松开的时候
          document.onmouseup = function () {
            //先把移动事件停止
            document.onmousemove = null;
            //需要判断 clonediv 的位置距 那个div 最近
            //先获取到content大盒子下所有的div
            var divs = content.getElementsByTagName("div");
            // console.log(divs.length);
            //然后判断移动到位置距离哪一个最近
            var min = 800; //考虑到被拖拽的div拖拽到大盒子之外还能进行交换,距离设为大盒子外   方圆800px
            var minDiv = null; //设一个空的div用来交换位置
            for (var i = 0; i < divs.length - 1; i++) {
              //遍历出除了鼠标移动的div外的所有的div  也就是length - 1
              var div = divs[i];
              //div cloneDiv
              //distance(cloneDiv,div)返回值为c,c为两div之间的距离
              var dis = distance(cloneDiv, div); //调用运用勾股定理进行比较距离的函数
              if (dis <= min) {
                //a^2 + b^2 和c^2比较
                min = dis;
                minDiv = div;
              }
            }
            //把距离小的那个div的样式给拖拽走空出来的div  itemName
            //如果这样赋值的话target的innerHTML就会丢失都变成minDiv.innerHTML,所以的设一个中转变量,让两者交换。background同理
            //                  minDiv.innerHTML = target.innerHTML;
            //两者样式交换,引入第三变量tmpInnerHTMl
            var tmpInnerHTMl = minDiv.innerHTML;
            minDiv.innerHTML = itemName.innerHTML;
            itemName.innerHTML = tmpInnerHTMl;
            //引入第三变量tmpColor
            var tmpColor = getComputedStyle(minDiv).backgroundColor;
            minDiv.style.backgroundColor =
              getComputedStyle(itemName).backgroundColor;
            itemName.style.backgroundColor = tmpColor;
            //删掉克隆元素
            content.removeChild(cloneDiv);
            document.onmouseup = null; //把鼠标松开后的操作清除
          };
          return false;
        };
      }
      //for循环使每一个item都调用itemBox()这个函数
      for (var i = 0; i < items.length; i++) {
        itemBox(items[i]);
      }
      function distance(div1, div2) {
        //勾股定理 记录 两个元素的距离
        var a = div1.offsetLeft - div2.offsetLeft;
        var b = div1.offsetTop - div2.offsetTop;
        var c = Math.sqrt(a * a + b * b); //利用勾股定理算出两个div的距离     a^2 + b^2 再开平方得出c
        return c;
      }
    </script>
  </body>
</html>

各位直接CV,效果绝对实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用HTML5中的draggable属性和JavaScript来实现九宫格单元格的拖拽效果。以下是一个简单的实现: HTML: ``` <div class="grid"> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> <div class="cell" draggable="true"></div> </div> ``` CSS: ``` .grid { display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 10px; } .cell { width: 100%; height: 100%; background-color: #ddd; } ``` JavaScript: ``` var cells = document.querySelectorAll('.cell'); var draggingCell = null; for (var i = 0; i < cells.length; i++) { var cell = cells[i]; cell.addEventListener('dragstart', function() { draggingCell = this; setTimeout(function() { draggingCell.style.display = 'none'; }, 0); }); cell.addEventListener('dragend', function() { draggingCell.style.display = 'block'; draggingCell = null; }); cell.addEventListener('dragover', function(e) { e.preventDefault(); }); cell.addEventListener('dragenter', function(e) { e.preventDefault(); this.classList.add('hover'); }); cell.addEventListener('dragleave', function() { this.classList.remove('hover'); }); cell.addEventListener('drop', function() { if (this !== draggingCell) { var temp = this.innerHTML; this.innerHTML = draggingCell.innerHTML; draggingCell.innerHTML = temp; } this.classList.remove('hover'); }); } ``` 这段代码首先选择所有的单元格,然后为每个单元格添加拖拽事件监听器。当一个单元格开始被拖拽时,我们把它的引用存储在draggingCell变量中,并且在0ms后将其隐藏。当单元格拖拽结束时,我们恢复其显示状态并将draggingCell变量设置为null。 当一个单元格被拖拽到另一个单元格上时,我们使用preventDefault()方法来防止默认的drop事件发生,并且给目标单元格添加一个.hover类。当拖拽离开一个单元格时,我们移除.hover类。当一个单元格被放置时,我们检查是否目标单元格不是当前拖拽的单元格,如果不是,我们交它们的innerHTML。 最后,我们使用CSS来布局九宫格,并将每个单元格设置为可拖拽的。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值