9. 元素拖拽

元素拖拽

API 介紹

1. 拖放過程

整個拖放過程中,存在兩個關鍵元素:拖拽元素、放置元素 拖拽元素:被拖拽的元素

  • drag:元素被拖拽時觸發,從開始拖拽到拖拽結束前整個過程會一直持續的觸發
  • dragstart:元素被拖拽開始時觸發
  • drop:拖拽元素被放置到放置元素內時觸發,如果沒有在放置元素內松手,則不會觸發

放置元素:

  • dragenter:有拖拽元素進入時觸發
  • dragover:有拖拽元素在該元素上時觸發,在離開前會持續觸發
  • dragleave:拖拽元素離開時觸發
  • dragend:拖拽元素放置時觸發

在這里插入圖片描述

2. 可拖拽元素

在 HTML 中,文本、圖片和鏈接是默認可以拖放的元素。其他元素都是默認不可拖動的,如果需要讓其他非默認可拖動的 HTML 元素變得可拖動,比如<div><span>等,你需要明確地為這些元素設置 draggable="true" 屬性。這樣,這些元素就能夠接受拖放操作了。

3. 放置元素

所有 HTML 元素在默認情況下都不接受拖拽元素的放置,除非通過特定的事件處理來允許。

要使一個 HTML 元素能夠接受被拖動的元素,需要對這個元素進行一些特定的設置和事件綁定:

  • dragover 事件:當被拖動的元素在另一個元素上方移動時,會觸發 dragover 事件。為了接受拖放,必須在 dragover 事件處理器中調用 event.preventDefault()方法,這會阻止瀏覽器的默認行為,也就是不接受任何被拖放的元素。

4. DataTransfer

DataTransfer 對象用于保存拖動并放下(drag and drop)過程中的數據。它可以保存一項或多項數據,這些數據項可以是一種或者多種數據類型

  • dropEffect:獲取當前選定的拖放操作類型,或設置為一個新的類型。值必須為 none、copy、link、move
  • effectAllowed:提供所有可用的操作類型。值必須為 none、copy、copyLink、copyMove、link、copyMove、move、all、uninitialized
  • files:包含數據傳輸中的所有本地文件列表
  • items(只讀):提供一個包含所有拖動數據列表的 DataTransferItemList 對象
  • types(只讀):一個提供 dragstart 事件中設置的格式的 strings 數組
<template><div id="drag-content" ref="contentRef" @dragstart="dragstart" @dragover="dragover" @dragenter="dragenter" @drop="drop" @dragend="dragend"><div class="left" data-drop="move"><div data-effect="copy" draggable="true" style="background: rgb(26, 231, 156)">語文</div><div data-effect="copy" draggable="true" style="background: rgb(107, 219, 15)">數學</div><div data-effect="copy" draggable="true" style="background: rgb(208, 133, 13)">英語</div><div data-effect="copy" draggable="true" style="background: rgb(30, 98, 246)">物理</div><div data-effect="copy" draggable="true" style="background: rgb(210, 40, 113)">化學</div><div data-effect="copy" draggable="true" style="background: rgb(210, 224, 26)">生物</div></div><div class="right"><table><thead><tr><td>星期一</td><td>星期二</td><td>星期三</td><td>星期四</td><td>星期五</td></tr></thead><tbody><tr><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><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><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><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></tbody></table></div></div>
</template><script setup lang="ts">
import { reactive, ref } from 'vue'
const contentRef = ref(null)const state = reactive({source: null as HTMLElement | null,dropNode: null
})const dragover = (e) => {// 接受拖放元素e.preventDefault()
}const dragstart = (e) => {if (e.target.dataset.effect === 'move') {e.dataTransfer.effectAllowed = 'move'}state.source = e.target// 設置拖拽元素的樣式e.target.style.opacity = '0.2'
}const dragenter = (e) => {const dropNode = getDropNode(e.target)// 判斷放置元素是否可以接收拖拽元素,當 data-effect 和 data-drop 的值相等時,說明可以if (dropNode && dropNode.dataset.drop === (state.source as HTMLElement).dataset.effect) {// 給放置元素添加樣式dropNode.classList.add('hover-background')}
}// 獲取最近的可接受拖拽元素的父節點
const getDropNode = (node) => {while (node) {//  判斷元素是否設置了data-drop屬性,如果設置了,說明此元素是一個放置元素if (node.dataset && node.dataset.drop) {return node}node = node.parentNode}return node
}const clearHoverClass = () => {document.querySelectorAll('.hover-background').forEach((ele) => ele.classList.remove('hover-background'))
}const drop = (e) => {// 清除hover時的樣式clearHoverClass()// 獲取最近的放置節點const dropNode = getDropNode(e.target)if (dropNode && dropNode.dataset.drop === (state.source as HTMLElement).dataset.effect) {// 如果是新增課程if (dropNode.dataset.drop === 'copy') {dropNode.innerHTML = ''const cloned = (state.source as HTMLElement).cloneNode(true)if (cloned instanceof HTMLElement) {cloned.dataset.effect = 'move'cloned.style.opacity = '1'}dropNode.appendChild(cloned)// 移除課程} else {;(state.source as HTMLElement).remove()}}
}const dragend = (e) => {e.target.style.opacity = '1'
}
</script><style scoped lang="scss">
#drag-content {display: flex;.left {width: 80px;line-height: 32px;margin-right: 20px;div {padding: 10px;margin-bottom: 10px;text-align: center;color: white;}}.right {flex: 1;table {margin: 10px;td {width: 120px;height: 65px;div {padding: 10px;text-align: center;color: white;}}}}.hover-background {background-color: aqua;}
}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912076.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912076.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912076.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

用來提升同花順軟件進程優先級的C#程序

為了提高炒股軟件同花順的運行速度&#xff0c;消除卡頓&#xff0c;編寫一個C#程序&#xff0c;來設置同花順進程的優先級。 using System; using System.Diagnostics; using System.Security.Principal;namespace ProcessPrioritySetter {class Program{static void Main(st…

linux初階---一些指令

一.快速認識6-8個簡單指令 1.pwd pwd指令是用來查看用戶當前所處在的目錄&#xff08;目錄的概念在理解上可以等效為文件夾&#xff09;。 &#xff08;1&#xff09;在windows系統中我們通過文件路徑表示唯一的文件&#xff0c;在linux中也是一樣的&#xff0c;所以pwd是一個很…

全國產傳感器外殼的綜合分析:材料選擇、考量因素與尺寸精度影響

全國產傳感器作為現代工業、科研、生活等領域的 “感知觸角”&#xff0c;其外殼的性能與質量直接關乎設備的穩定性、可靠性與使用壽命。從材料選型、關鍵考量因素到尺寸精度的影響&#xff0c;每個環節都需精細把控。 一、全國產傳感器外殼材料的多元選擇 全國產傳感器外殼材…

本地緩存Caffeine詳解(含與Spring Cache集成)

目錄 一、介紹 二、Caffeine核心原理與架構設計 2.1 存儲引擎與數據結構 2.2 緩存淘汰策略 2.3 并發控制機制 三、入門案例 3.1 引入依賴 3.2 測試接口 3.3 小結 四、Caffeine常用方法詳解 4.1 getIfPresent 4.2 get 4.3 put 4.4 putAll 4.5 invalidate 4.6 inv…

論特定領域軟件架構

20250413-作 題目 特定領域軟件架構DSSA&#xff08;Domain Specific Software Architecture&#xff09;就是在一個特定應用領域中為一組應用提供組織結構參考的標準軟件體系結構。對DSSA 研究的角度、關心的問題不同導致了對DSSA 的不同定義。DSSA 的必備特征如下。 一…

iOS 遠程調試與離線排查實戰:構建非現場問題復現機制

iOS開發者都知道&#xff0c;調試最怕兩個字&#xff1a;“偶發”。用戶說App閃退了&#xff0c;你點了十遍也沒問題&#xff1b;測試說功能卡頓了&#xff0c;你抓日志時它又順滑如新。最麻煩的是&#xff0c;這種“現場問題”往往在你連接不到用戶設備時發生。 面對這種情況…

SpringBoot -- 整合 Swagger3

8.SpringBoot3 整合 Swagger3 由于目前主流的開發模式是前后端分離開發。所以前后端的交互需要通過一個 API&#xff08;開發接口&#xff09; 來規范。而這個接口的開發是由后端程序員編寫的。“網站式 API 文檔” 1.導入依賴 <!-- 引入swagger3(springdoc)的依賴--> …

A Machine Learning Approach for Non-blind Image Deconvolution論文閱讀

A Machine Learning Approach for Non-blind Image Deconvolution 1. 研究目標與實際意義2. 創新方法與模型設計2.1 核心思路2.2 正則化反演:理論與公式2.2.1 退化模型2.2.2 正則化目標函數2.2.3 傅里葉域閉式解2.3 MLP去偽影:架構與訓練2.3.1 MLP架構設計2.3.2 訓練流程2.3.…

微信小程序<rich-text>支持里面圖片點擊放大

使用<rich-text>渲染類似下面的html代碼&#xff1a; <div stylecolor: red>寵物友好<br/>xxx提供寵物友好服務&#xff0c;具體請見下圖<br/></div> <img srchttps://xxx.com/xxx1.png width100%/> <img srchttps://xxx.com/xxx2.png…

BVH 文件是一種用于記錄 3D 動畫數據的文件格式,常用于 3D 建模和動畫制作。以下是對這個 BVH 文件的逐行解讀

BVH 文件是一種用于記錄 3D 動畫數據的文件格式&#xff0c;常用于 3D 建模和動畫制作。以下是對這個 BVH 文件的逐行解讀&#xff1a; HIERARCHY ROOT Hips { OFFSET 0 0 0 CHANNELS 6 Xposition Yposition Zposition Zrotation Xrotation Yrotation JOINT LeftUpLeg { OFFSE…

C語言開發:Onvif(一)

根據ONVIF官網 的介紹&#xff1a; ONVIF是一個開放的安防行業組織&#xff0c;致力于為安防行業提供和促進標準化開放接口&#xff0c;以實現IP網絡安防產品和服務的有效互操作性。 在具體實現上&#xff0c;ONVIF使用了Web Service的方式&#xff0c;設備通過WSDL定義的接口…

中科米堆三維掃描儀耳機3D掃描尺寸測量數字化建模

當下&#xff0c;耳機已從單純的音頻輸出設備進化為集娛樂、健康、辦公于一體的智能穿戴終端。相關數據顯示&#xff0c;2025年全球智能個人音頻設備出貨量突破4.55億臺&#xff0c;中國以22%的增速領跑全球&#xff0c;其中開放式耳機&#xff08;OWS&#xff09;出貨量占比達…

學習接口自動化框架pytest有哪些好處?

學習 pytest 作為接口自動化測試框架&#xff0c;具有以下顯著優勢&#xff0c;能大幅提升測試效率和質量&#xff1a; Pytest自動化測試教程&#xff0c;自動化必備之Pytest測試框架訓練營&#xff0c;只需一小時速成&#xff0c;學會直接上手實操&#xff01; 1. 代碼簡潔&…

LinuxBridge的作用與發展歷程:從基礎橋接到云原生網絡基石

LinuxBridge作為Linux網絡虛擬化的核心組件&#xff0c;已悄然支撐互聯網基礎設施20余年。它不僅是虛擬機網絡連接的橋梁&#xff0c;更是容器網絡、云原生架構的隱形支柱。 一、LinuxBridge的核心作用剖析 1. 二層網絡虛擬化的實現者 本質功能&#xff1a;模擬物理交換機行為…

探討 SYSCFG 時鐘對 ADC 采樣的影響

探討 SYSCFG 時鐘對 ADC 采樣的影響 在嵌入式系統開發中&#xff0c;對于 GD32F4 系列微控制器&#xff0c;理解 SYSCFG 時鐘與 ADC 采樣之間的關系至關重要。 以下是詳細分析&#xff1a; 一、SYSCFG 時鐘對 ADC 采樣過程的基礎性作用 1. 提供采樣時鐘信號 ADC 采樣需要時鐘…

Spring Boot 項目實訓 - 圖書信息網站

文章目錄 1. 實訓目的2. 系統設計3. 運行演示4. 實現步驟4.1 創建數據庫與表4.2 創建Spring Boot項目4.3 創建實體類4.4 創建映射器接口4.5 編寫應用配置文件4.6 測試映射器接口4.7 創建服務類4.8 創建控制器4.9 準備靜態資源4.10 創建模板頁面4.11 測試整個項目 5. 實訓總結 1…

GPU 性能可變性分析框架

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 抽象。 分析來自 GPU 分析器的大規模性能日志通常需要數 TB 的內存和數小時的運行時間&#xff0c;即使是基本摘要也是如此。這些限制會阻止及時洞察&#xff0c;并阻礙將性能分析集成到自動化工作流程中…

Redis主從復制原理

一、Redis主從復制概述 Redis主從復制&#xff08;Master-Slave Replication&#xff09;是Redis實現高可用性和讀寫分離的基礎架構。通過主從復制&#xff0c;數據可以從一個Redis服務器&#xff08;主節點&#xff09;復制到一個或多個Redis服務器&#xff08;從節點&#x…

將ONNX模型轉換為(OPENMV可用的格式)TensorFlow Lite格式

將ONNX模型轉換為TensorFlow Lite格式 在深度學習模型部署過程中&#xff0c;我們常常需要將模型從一種格式轉換為另一種格式&#xff0c;以適應不同的硬件平臺和應用場景。本文將詳細介紹如何將ONNX格式的模型轉換為TensorFlow Lite格式&#xff0c;以便在移動設備或嵌入式設…

EXILIUM×亞矩云手機:重構Web3虛擬生存法則,開啟多端跨鏈元宇宙自由征途

在鏈游與元宇宙賽道競爭加劇的當下&#xff0c;EXILIUM憑借其去中心化開放世界、鏈上資產確權與玩家自治經濟系統&#xff0c;成為Web3原住民逃離“中心化牢籠”的首選之地。然而&#xff0c;其多鏈交互門檻高、跨設備身份管理復雜、鏈上安全風險頻發等問題&#xff0c;讓普通玩…