原生实现一个拖拽小功能

HTML

  <div class="container">
    <div class="left" data-drop="move">
      <div data-effect="copy" draggable="true" class="color1 item">语文</div>
      <div data-effect="copy" draggable="true" class="color2 item">数学</div>
      <div data-effect="copy" draggable="true" class="color3 item">英语</div>
      <div data-effect="copy" draggable="true" class="color4 item">音乐</div>
      <div data-effect="copy" draggable="true" class="color5 item">政治</div>
      <div data-effect="copy" draggable="true" class="color6 item">历史</div>
      <div data-effect="copy" draggable="true" class="color7 item">体育</div>
    </div>
    <div class="right">
      <table>
        <caption>
          个人每周活动
        </caption>
        <colgroup>
          <col />
          <col span="5" class="weekdays" />
          <col span="2" class="weekend" />
        </colgroup>
        <tr>
          <th>时段</th>
          <th class="header">周一</th>
          <th class="header">周二</th>
          <th class="header">周三</th>
          <th class="header">周四</th>
          <th class="header">周五</th>
          <th class="header">周六</th>
          <th class="header">周日</th>
        </tr>
        <tr>
          <th>上午</th>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
        </tr>
        <tr>
          <th>下午</th>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
          <td data-drop="copy"></td>
        </tr>
      </table>
    </div>
  </div>

CSS

    .container {
      width: 1000px;
      display: flex;
      align-items: center;
    }

    .right {
      margin-left: 30px;
    }

    .item {
      width: 80px;
      height: 50px;
      text-align: center;
      line-height: 50px;
      color: white;
      font-size: 16px;
      margin: 10px 0;
      cursor: pointer;
    }

    .color1 {
      background-color: red;
    }

    .color2 {
      background-color: rgb(255, 242, 64);
    }

    .color3 {
      background-color: rgb(36, 255, 7);
    }

    .color4 {
      background-color: rgb(0, 195, 255);
    }

    .color5 {
      background-color: rgb(255, 0, 149);
    }

    .color6 {
      background-color: rgb(0, 255, 179);
    }

    .color7 {
      background-color: rgb(174, 0, 255);
    }

    table {
      border-collapse: collapse;
      border: 2px solid rgb(140 140 140);
    }

    caption {
      caption-side: bottom;
      padding: 10px;
    }

    th,
    td {
      border: 1px solid rgb(160 160 160);
      padding: 20px 30px;
      text-align: center;
    }

    .header {
      background-color: #d7d9f2;
    }

    .weekdays {
      /* background-color: #d7d9f2; */
    }

    .weekend {
      /* background-color: #ffe8d4; */
    }

    .drop-over {
      background-color: aquamarine;
    }

 JS

const container = document.querySelector('.container');

    // 拖拽开始
    let source
    container.ondragstart = (e) => {
      e.dataTransfer.effectAllowed = e.target.dataset.effect;
      console.log(e.target, 'start');
      source = e.target
    }

    // 拖拽到那个元素之上
    container.ondragover = (e) => {
      // 因为 td tr 这些标签不能拖拽所以需要 阻止默认行为 
      e.preventDefault();
    }

    function getDropNode(node) {
      while (node) {
        if (node.dataset && node.dataset.drop) {
          return node
        }
        node = node.parentNode;
      }
    }

    function clearDropStyle() {
      document.querySelectorAll('.drop-over').forEach(node => {
        node.classList.remove('drop-over');
      })
    }

    // 只触发一次
    container.ondragenter = (e) => {
      // 清楚之前的
      clearDropStyle()
      const dropNode = getDropNode(e.target)
      if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
        // 该节点能接受目前拖拽的节点
        dropNode.classList.add('drop-over');
      }
    }

    // 结束
    container.ondrop = (e) => {
      // console.log(e.target, 'drop');
      clearDropStyle()
      const dropNode = getDropNode(e.target)
      if (dropNode && dropNode.dataset.drop === e.dataTransfer.effectAllowed) {
        if (dropNode.dataset.drop === 'copy') {
          dropNode.innerHTML = '';
          const cloneNode = source.cloneNode(true);
          cloneNode.dataset.effect = 'move'
          dropNode.appendChild(cloneNode);
        } else {
          // move
          source.remove()
        }
      }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值