要素のドラッグ機能を実装するにはどうすればよいですか?次の記事では、Vue3 を使用してエレガントな要素のドラッグ機能を実装する方法を段階的に説明し、例を通じて関連する知識ポイントを学習します。
、Web フロントエンド開発 ]PS: Vue3 テンプレートのグローバル スタイルの中心属性は実験的な干渉を引き起こす可能性があります。料金を払ってください。注意! ! !
要素の位置と移動 イベントと mouse のコールバックを使用します。
event 現在のイベントが発生したときの要素の位置を関数で取得することができ、対応する属性は MouseEvent
の clientX
と clientY
です。これら 2 つは後で読みます。要素の位置をリアルタイムで更新するプロパティ。 transform
の
を使用して、top
と left## を変更するのではなく、最初に
要素を移動することをお勧めします。 # 属性によって要素のレイアウトが変更されることはなく、リフローや再描画によるパフォーマンスへの影響が回避されます。
PS:
MDN
mousedownOffset) と、要素の移動に応じてリアルタイムで更新される一連の座標 (
elementPosition)。
要素の初期位置の座標を記録します。原点はページの左上隅にあります。初期化とドラッグ後にドラッグされた要素の位置を復元するために使用されます。固定値は、変更しない:
const originalPosition = reactive({ x: 10, y: 10, })
const mousedownOffset = reactive({ x: 0, y: 0, })
と同じである必要があります。
mousemove イベントが発生すると、ポインターのリアルタイム座標 - mousedownOffset
が取得されます: <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">const elementPosition = reactive({
x: 0,
y: 0,
})</pre><div class="contentsignin">ログイン後にコピー</div></div>
#PS: 原点がページの左上隅の場合、図の点 1 は
または elementPosition
を表し、点 2 はポインタが押されたときの座標を表します原点が点 1 の場合、図の点 2 はmousedownOffset;
マウスダウン イベントの登録
mousemove と
mouseup
ページがロードされたら、まずドラッグされた要素のデフォルトの位置をリセットし、
mousedown イベントを追加します。コンポーネントがアンロードされたら、
mousedown
const restore = () => { elementPosition.x = originalPosition.x; elementPosition.y = originalPosition.y; } onMounted(() => { restore(); floatButton.value.addEventListener('mousedown', onMousedown, true); }) onUnmounted(() => { floatButton.value.removeEventListener('mousedown', onMousedown, true); })
选择 Vuejs
的原因就是因为其是 MVVM
型框架,我们关注点在声明上,内部的运转机制有框架负责,所以在下面的事件处理上就只需要在对应的事件中去更新一开始声明的三组坐标就可以了。
在 onMousedown
时,通过指针所在的坐标 - 被拖拽元素初始位置的坐标得到指针此时在被拖拽元素上的坐标,onMousedown
时要为 document
添加 mousemove
和 mouseup
事件:
const onMousedown = (event: MouseEvent) => { event.stopPropagation(); mousedownOffset.x = event.clientX - originalPosition.x; mousedownOffset.y = event.clientY - originalPosition.y; document.addEventListener('mousemove', onMousemove, true); document.addEventListener('mouseup', 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('mousemove', onMousemove, true); document.removeEventListener('mouseup', onMouseup, true); restore(); }
<div ref="floatButton" class="float-button" :style="{ 'transition-duration': '0.1s', 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 上增加点击事件时还需要多做一些处理,有答案的朋友可以留下你的想法~
以上がVue3 を使用してエレガントな要素のドラッグ機能を実装する方法を段階的に説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。