<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>拖放API on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/%E6%8B%96%E6%94%BEapi/</link><description>Recent content in 拖放API on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 06 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/%E6%8B%96%E6%94%BEapi/index.xml" rel="self" type="application/rss+xml"/><item><title>拖放API</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-018/</link><pubDate>Thu, 17 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/html/html-018/</guid><description>&lt;p&gt;HTML5 中的拖拽（Drag and Drop，简称 DnD）功能为网页元素提供了原生的拖放支持。通过 HTML5 的拖放 API，开发者可以让元素变得可拖动，并实现拖拽和释放的交互效果。&lt;/p&gt;
&lt;h3 id="html5-拖拽的基本原理"&gt;&lt;strong&gt;HTML5 拖拽的基本原理&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;HTML5 拖拽操作的核心是 &lt;code&gt;dragstart&lt;/code&gt;、&lt;code&gt;dragover&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 等事件。以下是拖拽的工作流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;可拖动元素&lt;/strong&gt;：使用 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使一个元素可被拖拽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;源元素触发拖拽&lt;/strong&gt;：当用户点击并开始拖动可拖动元素时，触发 &lt;code&gt;dragstart&lt;/code&gt; 事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽中&lt;/strong&gt;：拖拽过程中，目标区域会触发 &lt;code&gt;dragover&lt;/code&gt; 事件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;释放元素&lt;/strong&gt;：当用户释放被拖动的元素到目标区域时，目标会触发 &lt;code&gt;drop&lt;/code&gt; 事件。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="实现步骤"&gt;&lt;strong&gt;实现步骤&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设置拖拽元素&lt;/strong&gt;：使用 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使 HTML 元素可拖动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监听拖拽事件&lt;/strong&gt;：&lt;br&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dragstart&lt;/code&gt;：当拖拽开始时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragover&lt;/code&gt;：在拖拽过程中，拖动到可放置目标区域时持续触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;：当拖动的元素被释放到目标区域时触发。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;阻止默认行为&lt;/strong&gt;：&lt;code&gt;dragover&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 事件默认情况下是禁止的，需要使用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来阻止默认行为，从而允许放置元素。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="拖拽的相关事件"&gt;&lt;strong&gt;拖拽的相关事件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dragstart&lt;/code&gt;：在拖动开始时触发，用来设置拖动数据（如拖动的数据类型和数据内容）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragend&lt;/code&gt;：拖动操作结束时触发，可以用来清理状态。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragenter&lt;/code&gt;：当拖动的元素进入目标区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragover&lt;/code&gt;：当拖动元素在目标区域上方移动时持续触发，默认情况下不会触发 &lt;code&gt;drop&lt;/code&gt;，因此需要通过 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来允许放置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dragleave&lt;/code&gt;：当拖动的元素离开目标区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop&lt;/code&gt;：当拖动的元素释放到目标区域时触发，可以获取拖动的数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="拖拽实例"&gt;&lt;strong&gt;拖拽实例&lt;/strong&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;html&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lang&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;charset&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;meta&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;viewport&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;content&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;width=device-width, initial-scale=1.0&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;HTML5 拖拽示例&amp;lt;/&lt;span style="color:#f92672"&gt;title&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #dragElement {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lightcoral&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;cursor&lt;/span&gt;: grab;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; #dropZone {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;background-color&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lightblue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;margin-top&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;text-align&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;style&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;head&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dragElement&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggable&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&amp;gt;拖拽我&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;dropZone&amp;#34;&lt;/span&gt;&amp;gt;放置到这里&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 获取元素
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dragElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragElement&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dropZone&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 拖拽开始事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dragElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragstart&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 设置数据，类型和内容
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 拖拽过程中在目标上方移动时，必须阻止默认行为
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragover&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 放置事件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;dropZone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;drop&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 阻止默认行为
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggedElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;appendChild&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;draggedElement&lt;/span&gt;); &lt;span style="color:#75715e"&gt;// 将拖动的元素放入目标区域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;/&lt;span style="color:#f92672"&gt;script&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;body&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#f92672"&gt;html&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="代码说明"&gt;&lt;strong&gt;代码说明&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拖拽元素&lt;/strong&gt;：&lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt; 使得 &lt;code&gt;#dragElement&lt;/code&gt; 可拖动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽开始&lt;/strong&gt;：&lt;code&gt;dragstart&lt;/code&gt; 事件设置了拖拽的元素数据，存入 &lt;code&gt;dataTransfer&lt;/code&gt; 对象中。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;允许放置&lt;/strong&gt;：&lt;code&gt;dragover&lt;/code&gt; 事件通过 &lt;code&gt;event.preventDefault()&lt;/code&gt; 允许拖拽元素放置在目标区域。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;放置元素&lt;/strong&gt;：&lt;code&gt;drop&lt;/code&gt; 事件在目标区域中，通过 &lt;code&gt;event.dataTransfer.getData()&lt;/code&gt; 获取拖动的数据并进行处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见考点"&gt;常见考点&lt;/h2&gt;
&lt;h3 id="1-基本概念与原理"&gt;1. &lt;strong&gt;基本概念与原理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定义&lt;/strong&gt;：HTML5 提供了内置的拖拽功能，通过 &lt;code&gt;draggable&lt;/code&gt; 属性和 Drag and Drop API 实现元素拖放操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理&lt;/strong&gt;：拖拽功能依赖一系列事件，如 &lt;code&gt;dragstart&lt;/code&gt;、&lt;code&gt;drag&lt;/code&gt;、&lt;code&gt;dragend&lt;/code&gt;、&lt;code&gt;dragover&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt; 等来实现拖放操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-如何启用拖拽"&gt;2. &lt;strong&gt;如何启用拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;draggable 属性&lt;/strong&gt;：默认情况下，HTML 元素是不可拖拽的。要启用拖拽，需要设置元素的 &lt;code&gt;draggable=&amp;quot;true&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;div&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggable&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&amp;gt;Drag me!&amp;lt;/&lt;span style="color:#f92672"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;事件绑定&lt;/strong&gt;：考察点可能包括如何通过 &lt;code&gt;dragstart&lt;/code&gt; 等事件处理拖拽行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draggableElement&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;draggable&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;draggableElement&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragstart&amp;#39;&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text/plain&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;This is a draggable element&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-drag-and-drop-的核心事件"&gt;3. &lt;strong&gt;Drag and Drop 的核心事件&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dragstart&lt;/strong&gt;：用户开始拖动时触发，通常用于设置拖拽的数据和外观。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drag&lt;/strong&gt;：在拖动过程中持续触发，可用于动态更新拖拽效果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragend&lt;/strong&gt;：拖动结束时触发，可以用于清除拖拽状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragenter&lt;/strong&gt;：被拖拽的元素进入可放置区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragover&lt;/strong&gt;：在拖动元素悬停在放置区域时持续触发，通常需要调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来允许放置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dragleave&lt;/strong&gt;：当拖动元素离开放置区域时触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drop&lt;/strong&gt;：用户放开被拖动的元素时触发，用于处理放置操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-数据传输"&gt;4. &lt;strong&gt;数据传输&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;dataTransfer 对象&lt;/strong&gt;：&lt;code&gt;event.dataTransfer&lt;/code&gt; 是拖拽过程中传输数据的关键对象。常见考点包括如何通过 &lt;code&gt;dataTransfer.setData()&lt;/code&gt; 和 &lt;code&gt;dataTransfer.getData()&lt;/code&gt; 方法在 &lt;code&gt;dragstart&lt;/code&gt; 和 &lt;code&gt;drop&lt;/code&gt; 事件之间传递数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// dragstart 中设置数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;Dragged Data&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// drop 中获取数据
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;getData&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;text&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;传输多种数据类型&lt;/strong&gt;：考察如何传输不同的数据类型（如文本、URL、文件等）以及如何处理这些数据。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-dropzone-区域的设置"&gt;5. &lt;strong&gt;dropzone 区域的设置&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;允许放置元素&lt;/strong&gt;：默认情况下，放置区域不会接受被拖拽的元素，需要在 &lt;code&gt;dragover&lt;/code&gt; 事件中调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 来显式地允许放置操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dropzone&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; document.&lt;span style="color:#a6e22e"&gt;getElementById&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dropzone&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;dropzone&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addEventListener&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;dragover&amp;#39;&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;preventDefault&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;// 允许放置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="6-拖拽的样式处理"&gt;6. &lt;strong&gt;拖拽的样式处理&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义拖拽效果&lt;/strong&gt;：通过 &lt;code&gt;event.dataTransfer.setDragImage()&lt;/code&gt; 设置自定义的拖拽图片，考察点可能包括如何替换默认的拖拽预览图。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;setDragImage&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;imageElement&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;offsetX&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;offsetY&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;拖拽时的 CSS 样式&lt;/strong&gt;：考察如何使用 CSS 类和事件配合，实现拖拽时的视觉效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;.&lt;span style="color:#a6e22e"&gt;dragging&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;opacity&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="7-跨页面或跨应用的拖拽"&gt;7. &lt;strong&gt;跨页面或跨应用的拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;跨文档拖拽&lt;/strong&gt;：考察是否了解如何处理跨 iframe 或浏览器窗口的拖拽。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拖拽文件&lt;/strong&gt;：用户可以将外部文件（如从桌面拖动文件）拖入浏览器的 &lt;code&gt;dropzone&lt;/code&gt;，需要处理 &lt;code&gt;dataTransfer.files&lt;/code&gt; 属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;files&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;event&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;dataTransfer&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;files&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-拖拽与输入法的冲突"&gt;8. &lt;strong&gt;拖拽与输入法的冲突&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在移动设备上，拖拽和触摸事件可能存在冲突，因此考察点可能包括如何处理拖拽在移动端的实现或替代方案。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9-可访问性"&gt;9. &lt;strong&gt;可访问性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;键盘可用性&lt;/strong&gt;：默认拖拽操作主要依赖鼠标，因此考察点可能包括如何使拖拽操作可通过键盘导航，确保网站的无障碍性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ARIA 支持&lt;/strong&gt;：在实现拖拽功能时，如何使用 ARIA 属性为屏幕阅读器用户提供反馈是常见的可访问性考察点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="10-兼容性"&gt;10. &lt;strong&gt;兼容性&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;浏览器兼容性&lt;/strong&gt;：HTML5 拖拽在不同浏览器中的支持情况不一致，尤其是在移动端，考察点可能包括如何处理浏览器兼容性问题，特别是在触摸设备上使用拖拽功能时的挑战。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="11-常见的应用场景"&gt;11. &lt;strong&gt;常见的应用场景&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文件上传&lt;/strong&gt;：通过拖拽文件进行上传是常见的考察场景，如何实现文件的拖放上传功能是常见问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可拖拽列表&lt;/strong&gt;：如何通过拖拽重新排序列表项，如实现类似于 &lt;code&gt;Trello&lt;/code&gt; 的拖放功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;游戏和图形界面&lt;/strong&gt;：拖放在交互式游戏或图形应用中被广泛使用，可能会考察如何通过拖拽元素实现复杂的交互效果。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="12-事件顺序"&gt;12. &lt;strong&gt;事件顺序&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;了解拖拽过程中的事件触发顺序也是一个重要的考察点，常见顺序为：&lt;code&gt;dragstart&lt;/code&gt; -&amp;gt; &lt;code&gt;drag&lt;/code&gt; -&amp;gt; &lt;code&gt;dragenter&lt;/code&gt; -&amp;gt; &lt;code&gt;dragover&lt;/code&gt; -&amp;gt; &lt;code&gt;drop&lt;/code&gt; -&amp;gt; &lt;code&gt;dragend&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="13-拖拽的取消"&gt;13. &lt;strong&gt;拖拽的取消&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;取消拖拽&lt;/strong&gt;：通过调用 &lt;code&gt;event.preventDefault()&lt;/code&gt; 可以阻止某些拖拽事件的默认行为，如取消 &lt;code&gt;drop&lt;/code&gt; 事件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="14-使用-javascript-框架实现拖拽"&gt;14. &lt;strong&gt;使用 JavaScript 框架实现拖拽&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;有些前端面试可能会考察如何利用 JavaScript 框架（如 React、Vue、Angular）实现拖拽交互，以及如何处理拖拽相关的状态管理和数据绑定。&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>