| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
| <style> |
| * { |
| box-sizing: border-box; |
| padding: 0; |
| margin: 0; |
| } |
| |
| main { |
| width: 100vw; |
| height: 100vh; |
| display: grid; |
| grid-template-columns: 1fr 1fr; |
| place-items: center; |
| background-color: hsl(0deg, 0%, 10%); |
| } |
| |
| .draggable-container { |
| width: 100%; |
| height: 100%; |
| display: grid; |
| place-items: center; |
| } |
| |
| .draggable, |
| .droppable { |
| border-radius: 4px; |
| } |
| |
| .draggable { |
| width: 25vw; |
| height: 25vw; |
| background: #00d9ff; |
| } |
| |
| .droppable { |
| width: 30vw; |
| height: 30vw; |
| border: 8px dashed #00d9ff; |
| position: relative; |
| display: grid; |
| place-items: center; |
| } |
| |
| .droppable::before { |
| display: block; |
| content: "请拖放到此区域"; |
| position: absolute; |
| color: white; |
| font-family: sans-serif; |
| font-size: 3vw; |
| color: hsl(0, 0%, 30%); |
| } |
| |
| .droppable img { |
| width: 80%; |
| height: 80%; |
| object-fit: contain; |
| } |
| |
| .dragover { |
| border: 8px dashed #ffae00; |
| } |
| |
| .dropped { |
| border: 8px dashed #48ff00; |
| } |
| .dropped::before { |
| z-index: -1; |
| } |
| </style> |
| <title>原生拖拽</title> |
| </head> |
| <body> |
| <main> |
| <div class="draggable-container"> |
| <div id="draggable" class="draggable" draggable="true"></div> |
| </div> |
| <div id="droppable" class="droppable"></div> |
| </main> |
| <script> |
| const draggable = document.getElementById("draggable"); |
| const droppable = document.getElementById("droppable"); |
| |
| draggable.addEventListener("dragstart", handleDragStart); |
| droppable.addEventListener("dragover", handleDragover); |
| droppable.addEventListener("dragleave", handleDragLeave); |
| droppable.addEventListener("drop", handleDrop); |
| |
| function handleDragStart(e) { |
| e.dataTransfer.setData("text/plain", e.target.id); |
| |
| |
| |
| } |
| |
| function handleDragover(e) { |
| e.preventDefault(); |
| droppable.classList.add("dragover"); |
| |
| } |
| |
| function handleDragLeave(e) { |
| droppable.classList.remove("dragover"); |
| } |
| |
| function handleDrop(e) { |
| e.preventDefault(); |
| |
| [...e.dataTransfer.items].forEach((item) => { |
| if (item.kind === "file") { |
| const file = item.getAsFile(); |
| createPreview(file); |
| } |
| }); |
| |
| |
| const draggedId = e.dataTransfer.getData("text/plain"); |
| droppable.appendChild(document.getElementById(draggedId)); |
| droppable.classList.add("dropped"); |
| } |
| |
| function createPreview(imageFile) { |
| if (!imageFile.type.startsWith("image/")) { |
| return; |
| } |
| |
| const image = document.createElement("img"); |
| image.src = URL.createObjectURL(imageFile); |
| image.onload = function () { |
| URL.revokeObjectURL(this.src); |
| }; |
| droppable.appendChild(image); |
| } |
| </script> |
| </body> |
| </html> |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!