Drag N Drop

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>Drag N Drop</title>
  </head>
  <body>
    <div class="empty">
      <!-- draggable  用于标识元素是否允许使用拖放操作 -->
      <div class="fill" draggable="true"></div>
    </div>
    <div class="empty"></div>
    <div class="empty"></div>
    <div class="empty"></div>
    <div class="empty"></div>

    <script src="script.js"></script>
  </body>
</html>
* {
  box-sizing: border-box;
}

body {
  background-color: steelblue;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  overflow: hidden;
  margin: 0;
}

.empty {
  height: 150px;
  width: 150px;
  margin: 10px;
  border: solid 3px black;
  background: white;
}

.fill {
  background-image: url('https://source.unsplash.com/random/150x150');
  height: 145px;
  width: 145px;
  cursor: pointer;
}

.hold {
  border: solid 5px #ccc;
}

.hovered {
  background-color: #333;
  border-color: white;
  border-style: dashed;
}

@media (max-width: 800px) {
  body {
    flex-direction: column;
  }
}
const fill = document.querySelector('.fill')
const empties = document.querySelectorAll('.empty')

// 当用户开始拖动一个元素或者一个选择文本的时候 dragstart 事件就会触发
fill.addEventListener('dragstart', dragStart)
// 拖放事件在拖放操作结束时触发 (通过释放鼠标按钮或单击 escape 键)
fill.addEventListener('dragend', dragEnd)

for(const empty of empties) {
    // 当元素或者选择的文本被拖拽到一个有效的放置目标上时,触发 dragover 事件,(每几百毫秒触发一次)
    empty.addEventListener('dragover', dragOver)
    // 当拖动的元素或被选择的文本进入有效的放置目标时, dragenter 事件被触发。
    empty.addEventListener('dragenter', dragEnter)
    // 当一个被拖动的元素或者被选择的文本离开一个有效的拖放目标时,将会触发dragleave 事件
    empty.addEventListener('dragleave', dragLeave)
    // 当一个元素或是选中的文字被拖拽释放到一个有效的释放目标位置时,drop 事件被抛出
    empty.addEventListener('drop', dragDrop)
}

function dragStart() {
    this.className += ' hold' 
    setTimeout(() => this.className = 'invisible', 0)
}

function dragEnd() {
    this.className = 'fill'
}

function dragOver(e) {
  // preventDefault(): 如果此事件没有被显式处理,它默认的动作也不应该照常执行。此事件还是继续传播,除非碰到事件侦听器调用stopPropagation() 或stopImmediatePropagation(),才停止传播
    e.preventDefault()
}

// 此处为+=
function dragEnter(e) {
    e.preventDefault()
    this.className += ' hovered'
}

// 此处为=
function dragLeave() {
    this.className = 'empty'
}

function dragDrop() {
    this.className = 'empty'
    this.append(fill)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值