目錄
推薦幾個好用的工具
#在實現元素拖曳時,只需要給被拖曳的元素加上
实现拖拽的核心
补充其它部分代码和演示
总结
首頁 web前端 Vue.js 手把手教你使用Vue3實作一個飄逸元素拖曳功能

手把手教你使用Vue3實作一個飄逸元素拖曳功能

Mar 30, 2023 pm 08:57 PM
前端 vue.js

怎麼實現元素拖曳功能?以下這篇文章一步一步帶大家了解如何使用Vue3實作一個飄逸元素拖曳功能,並在實例中了解相關知識點,希望對大家有幫助!

手把手教你使用Vue3實作一個飄逸元素拖曳功能

推薦幾個好用的工具

進入正題

元素拖曳是比較典型的前端學習案例,需要對JavaScript 的事件有一定的了解,我也是在最近的工作中才重新拾起了這塊內容,透過在Vue3 這種聲明式程式設計風格的框架中把元素拖曳一次講清楚。 【相關建議:

vuejs影片教學web前端開發

#PS:Vue3 範本全域樣式中的居中屬性可能會造成實驗幹擾,請注意! ! !

元素的位置和移動

在實作元素拖曳我們使用

mouse 事件,在mouse 事件的回調函數中可以得到目前事件發生時元素的位置,對應的屬性是MouseEvent 中的clientXclientY,我們後續將透過讀取這兩個屬性來即時更新元素的位置。

元素的行動推薦優先使用

transform 中的translate 實現,相較於修改元素的topleft 屬性來說不會造成元素佈局的改變,避免了回流和重繪造成的效能影響。

PS:在

MDN 有一份關於translate的使用和體驗,可以感受一下。

定義三組座標

分別定義用來記錄元素初始位置的一組座標(

originalPosition)、元素被按下時指針在元素上的座標(mousedownOffset)和元素在移動時即時更新的一組座標(elementPosition)。

記錄元素初始位置的座標,原點位於頁面左上角,用來在初始化和被拖曳結束後還原被拖曳元素的位置,固定值不發生變化:

const originalPosition = reactive({
  x: 10,
  y: 10,
})
登入後複製

元素被按下時指針在元素上的座標,原點位於被拖曳元素的左上角,透過按下時指針的座標- 元素初始的偏移位置得到:

const mousedownOffset = reactive({
  x: 0,
  y: 0,
})
登入後複製

元素在移動時即時更新的座標,原點位於頁面左上角,初始值應該同

originalPosition ,在mousemove 事件發生時,透過指標的即時座標- mousedownOffset 得到:

const elementPosition = reactive({
  x: 0,
  y: 0,
})
登入後複製

PS:當原點是頁面左上角時在圖中的1號點表示

originalPositionelementPosition#,2號點表示指標按下時的座標,當原點是1號點時在圖中的2號點表示mousedownOffset;

##註冊mousedown 事件

#在實現元素拖曳時,只需要給被拖曳的元素加上

mousedown

事件即可,監聽事件使用完後記得要清楚掉,成對出現的習慣一定要養成。 如果你把

mousemove

mouseup 都加到被拖曳的元素上,你會發現有脫離控制的現象發生。 在頁面載入完成後首先要重置一下被拖曳元素的預設位置,並增加

mousedown

事件,在元件卸載後刪除mousedown 事件:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>const restore = () =&gt; { elementPosition.x = originalPosition.x; elementPosition.y = originalPosition.y; } onMounted(() =&gt; { restore(); floatButton.value.addEventListener(&amp;#39;mousedown&amp;#39;, onMousedown, true); }) onUnmounted(() =&gt; { floatButton.value.removeEventListener(&amp;#39;mousedown&amp;#39;, onMousedown, true); })</pre><div class="contentsignin">登入後複製</div></div><h3 id="strong-实现拖拽的核心-strong"><strong>实现拖拽的核心</strong></h3><p>选择 <code>Vuejs 的原因就是因为其是 MVVM 型框架,我们关注点在声明上,内部的运转机制有框架负责,所以在下面的事件处理上就只需要在对应的事件中去更新一开始声明的三组坐标就可以了。

onMousedown 时,通过指针所在的坐标 - 被拖拽元素初始位置的坐标得到指针此时在被拖拽元素上的坐标,onMousedown 时要为 document 添加 mousemovemouseup 事件:

const onMousedown = (event: MouseEvent) => {
  event.stopPropagation();
  
  mousedownOffset.x = event.clientX - originalPosition.x;
  mousedownOffset.y = event.clientY - originalPosition.y;
  
  document.addEventListener(&#39;mousemove&#39;, onMousemove, true);
  document.addEventListener(&#39;mouseup&#39;, onMouseup, true);
}
登入後複製

onMousemove时,通过指针所在的坐标 - 指针在被拖拽元素上的位置得到被拖拽元素左上角距离页面左上角的距离,并更新到 elementPosition

const onMousemove = (event: MouseEvent) => {
  event.stopPropagation();
  
  elementPosition.x = event.clientX - mousedownOffset.x;
  elementPosition.y = event.clientY - mousedownOffset.y;
}
登入後複製

onMouseup时,主要做的就是为 document 移除在 onMousemove 时注册的两个事件,要注意的是移除的事件要是同一个事件,也就是引用一致的事件,推荐将对应的处理事件赋值给一个变量使用,最后可以在拖拽结束后还原被拖拽元素的位置:

const onMouseup = (event: MouseEvent) => {
  event.stopPropagation();
  document.removeEventListener(&#39;mousemove&#39;, onMousemove, true);
  document.removeEventListener(&#39;mouseup&#39;, onMouseup, true);
  restore();
}
登入後複製

补充其它部分代码和演示

<div 
 ref="floatButton"
 class="float-button"
 :style="{
    &#39;transition-duration&#39;: &#39;0.1s&#39;,
    transform: `translate(${elementPosition.x}px, ${elementPosition.y}px)`
  }">
</div>
登入後複製
.float-button {
  position: absolute;
  width: 42px;
  height: 42px;
  background: red;
  border-radius: 5px;
  user-select: none;
  background-image: url(../assets/taobao.svg);
  background-size: cover;
}
登入後複製

总结

使用 mousemove、translate 在 Vue3 中实现可以随意拖拽的 Icon 的案例就完成了,在本次案例中需要认真思考对应的几个坐标和移动时坐标如何更新,事件的使用要成对出现,如何在这个拖拽的 Icon 上增加点击事件时还需要多做一些处理,有答案的朋友可以留下你的想法~

(学习视频分享:vuejs入门教程编程基础视频

以上是手把手教你使用Vue3實作一個飄逸元素拖曳功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP與Vue:完美搭檔的前端開發利器 PHP與Vue:完美搭檔的前端開發利器 Mar 16, 2024 pm 12:09 PM

PHP與Vue:完美搭檔的前端開發利器在當今網路快速發展的時代,前端開發變得愈發重要。隨著使用者對網站和應用的體驗要求越來越高,前端開發人員需要使用更有效率和靈活的工具來創建響應式和互動式的介面。 PHP和Vue.js作為前端開發領域的兩個重要技術,搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結合,以及詳細的程式碼範例,幫助讀者更好地理解和應用這兩

C#開發經驗分享:前端與後端協同開發技巧 C#開發經驗分享:前端與後端協同開發技巧 Nov 23, 2023 am 10:13 AM

身為C#開發者,我們的開發工作通常包括前端和後端的開發,而隨著技術的發展和專案的複雜性提高,前端與後端協同開發也變得越來越重要和複雜。本文將分享一些前端與後端協同開發的技巧,以幫助C#開發者更有效率地完成開發工作。確定好介面規範前後端的協同開發離不開API介面的交互。要確保前後端協同開發順利進行,最重要的是定義好介面規格。接口規範涉及到接口的命

Django是前端還是後端?一探究竟! Django是前端還是後端?一探究竟! Jan 19, 2024 am 08:37 AM

Django是一個由Python編寫的web應用框架,它強調快速開發和乾淨方法。儘管Django是web框架,但要回答Django是前端還是後端這個問題,需要深入理解前後端的概念。前端是指使用者直接和互動的介面,後端是指伺服器端的程序,他們透過HTTP協定進行資料的互動。在前端和後端分離的情況下,前後端程式可以獨立開發,分別實現業務邏輯和互動效果,資料的交

前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

在前端開發面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎、JavaScript基礎、框架和函式庫、專案經驗、演算法和資料結構、效能最佳化、跨域請求、前端工程化、設計模式以及新技術和趨勢。面試官的問題旨在評估候選人的技術技能、專案經驗以及對行業趨勢的理解。因此,應試者應充分準備這些方面,以展現自己的能力和專業知識。

前端怎麼實現即時通訊 前端怎麼實現即時通訊 Oct 09, 2023 pm 02:47 PM

實作即時通訊的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。詳細介紹:1、WebSocket,它可以在客戶端和伺服器之間建立持久連接,實現即時的雙向通信,前端可以使用WebSocket API來創建WebSocket連接,並透過發送和接收訊息來實現即時通訊;2、Long Polling,是一種模擬即時通訊的技術等等

Go語言前端技術探秘:前端開發新視野 Go語言前端技術探秘:前端開發新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發領域廣受歡迎。然而,很少有人將Go語言與前端開發聯繫起來。事實上,使用Go語言進行前端開發不僅可以提高效率,還能為開發者帶來全新的視野。本文將探討使用Go語言進行前端開發的可能性,並提供具體的程式碼範例,幫助讀者更了解這一領域。在傳統的前端開發中,通常會使用JavaScript、HTML和CSS來建立使用者介面

Django:前端和後端開發都能搞定的神奇框架! Django:前端和後端開發都能搞定的神奇框架! Jan 19, 2024 am 08:52 AM

Django:前端和後端開發都能搞定的神奇框架! Django是一個高效、可擴展的網路應用程式框架。它能夠支援多種Web開發模式,包括MVC和MTV,可以輕鬆地開發出高品質的Web應用程式。 Django不僅支援後端開發,還能夠快速建構出前端的介面,透過模板語言,實現靈活的視圖展示。 Django把前端開發和後端開發融合成了一種無縫的整合,讓開發人員不必專門學習

Golang與前端技術結合:探討Golang如何在前端領域發揮作用 Golang與前端技術結合:探討Golang如何在前端領域發揮作用 Mar 19, 2024 pm 06:15 PM

Golang與前端技術結合:探討Golang如何在前端領域發揮作用,需要具體程式碼範例隨著互聯網和行動應用的快速發展,前端技術也愈發重要。而在這個領域中,Golang作為一門強大的後端程式語言,也可以發揮重要作用。本文將探討Golang如何與前端技術結合,以及透過具體的程式碼範例來展示其在前端領域的潛力。 Golang在前端領域的角色作為一門高效、簡潔且易於學習的

See all articles