デモを読み込み中…
<script setup lang="ts">
import { ref } from 'vue';
import { DnDProvider, closestCenter, closestCorners, pointerFirst, pointerWithin, rectIntersection } from '@vue-dnd-kit/core';
import ModifierLab from './ModifierLab.vue';
// Collision detection is the provider's: it picks the target, here one of the two pads.
const COLLISIONS = { pointerFirst, pointerWithin, rectIntersection, closestCenter, closestCorners };
const collision = ref<keyof typeof COLLISIONS>('pointerFirst');
</script>
<template>
<DnDProvider :collision="COLLISIONS[collision]">
<div class="demo">
<code class="call"><DnDProvider :collision="{{ collision }}"></code>
<div class="collisions" role="radiogroup" aria-label="collision">
<label v-for="name in Object.keys(COLLISIONS)" :key="name" :class="{ on: collision === name }">
<input v-model="collision" type="radio" :value="name" />
{{ name }}
</label>
</div>
<ModifierLab />
</div>
</DnDProvider>
</template>
<style scoped>
.demo {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
.collisions {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 2px;
max-width: 100%;
padding: 3px;
border-radius: 9px;
background: color-mix(in srgb, currentColor 7%, transparent);
}
.call {
font: 11px/1.4 ui-monospace, Menlo, Consolas, monospace;
color: #42b883;
}
label {
padding: 4px 8px;
border-radius: 6px;
font: 11px/1.3 ui-monospace, Menlo, Consolas, monospace;
cursor: pointer;
}
label.on {
background: Canvas;
box-shadow: 0 1px 3px rgb(0 0 0 / 0.25);
font-weight: 600;
}
label:has(input:focus-visible) {
outline: 2px solid #42b883;
}
input {
position: absolute;
opacity: 0;
pointer-events: none;
}
</style>モディファイア
import { restrictToParent, snapToGrid } from '@vue-dnd-kit/core';
makeSortableList(list, { items, modifiers: [restrictToParent] });
makeDragArea(board, { modifiers: [snapToGrid({ x: 24, y: 24, smooth: true })] });
モディファイアはドラッグのオフセットを受け取り、新しいオフセットを返します。実行順は次のとおりです:プロバイダーの modifiers、ドラッグエリアのもの、ドラッグ可能な要素自身のもの(またはそのリストのもの)、次にエリアの境界(restrictToArea)、最後に axis による固定。軸、境界、グリッドを参照してください。
Modifier垂直方向にだけ動きます:水平方向では、ページがどうスクロールしても、開始時のコンテンツについていきます(containerShift)。axis: 'y' オプションも同じことを、最後に行います。
Modifier水平方向にだけ動きます:垂直方向では、ページがどうスクロールしても、開始時のコンテンツについていきます(containerShift)。axis: 'x' オプションも同じことを、最後に行います。
Modifierオーバーレイをウィンドウの中にとどめます。
Modifierオーバーレイを、ドラッグが始まったコンテナーの中にとどめます:並べ替え可能なリスト(その DOM 上の親ではなく)、または通常のドラッグ可能な要素では親要素。
(target: MaybeElementRef) => Modifierオーバーレイを要素の中にとどめます:要素、ref、またはゲッター。
Modifierオーバーレイを、ドラッグされている要素の最初のスクロール可能な祖先の中にとどめます。
(size: number | SnapToGridOptions) => Modifierオーバーレイをグリッドの最も近いセルにスナップします:数値は正方形のセルのサイズです。オプションでは、軸ごとの設定、グリッドの開始位置、セル間の滑らかな移動を指定します(SnapToGridOptions)。
Modifier掴んだ位置のオフセットを保つ代わりに、オーバーレイの中心をポインターの下に合わせます。
snapToGrid のオプション。
numberセルの幅(px)。指定しない(または 0)と、ドラッグは x 方向に自由に動きます。
numberセルの高さ(px)。指定しない(または 0)と、ドラッグは y 方向に自由に動きます:{ y: 15 } はカレンダーのイベントの時刻だけをスナップします。
'container' | 'delta''container'(デフォルト):オーバーレイの左上が、コンテナーの左上から引いたグリッド線に着地します(containerRect:並べ替え可能なリストまたは親要素)。'delta':ドラッグのオフセットを丸めるので、アイテムの開始位置のグリッドからのずれは保たれます。
boolean | AnimationOptionsスナップした位置の間でオーバーレイを滑らかに動かします(デフォルト 80ms)。衝突判定は引き続き、スナップした位置をすぐに使います。
ドラッグされたアイテムの行き先を変えます:ドラッグのオフセット(transform)を受け取り、新しいオフセットを返します。
type Modifier = (args: ModifierArgs) => Coordinatesモディファイアがドラッグの移動のたびに受け取るもの。
Coordinatesドラッグ開始位置からのオフセット。それより前のモディファイアで変更された後の値です。
Active現在のドラッグ。
Rectドラッグ開始時の、ドラッグ中の要素の矩形。
Rectオーバーレイのボックスを現在のサイズのまま transform だけ動かしたとした場合の矩形。overlayFit: 'slot' ではボックスがポインターを中心にサイズを変えるため、必ずしも activeRect を transform だけ動かしたものにはなりません。
Coordinatesドラッグ開始時のポインター位置。
Rect | nullドラッグ中のアイテムの並べ替え可能なリストのコンテナー(または親要素)の現在の位置(スクロールに追従します)。
Coordinatesドラッグを開始したコンテンツが、開始時から画面上でどれだけ動いたか。コンテナーが動いた分(ページやそれを囲むコンテナーのスクロール、レイアウトのずれ)と、その中でコンテンツがスクロールした分です。軸の固定はもう一方の軸をこの値に保つので、ドラッグはそのコンテンツの中で自分の行または列にとどまります。
Rectウィンドウ(ビューポート)の矩形。
Over | nullドラッグの下にあるドロップターゲット(最後に見つかったもの)。何もない上では null。
衝突判定
import { closestCorners } from '@vue-dnd-kit/core';
<DnDProvider :collision="closestCorners" />
プロバイダーの collision がターゲットを選びます。最も良い候補が先頭に来ます。
CollisionDetectionデフォルト:ポインターの下にあるもの。なければオーバーレイが重なっているもの。
CollisionDetectionポインターの下にあるターゲット。ヒットテストで求めます:z-order、オーバーレイ、シャドウルートを考慮します。
CollisionDetectionオーバーレイと重なっているターゲット:優先度の高いもの、次にネストの深いもの、次に IoU(intersection over union)の大きいもの。
CollisionDetectionすべてのターゲット。中心間の距離で並べます。
CollisionDetectionすべてのターゲット。角どうしの距離の合計で並べます(カンバンの列のように積み重なったターゲットに向いています)。
候補の id を、良いものから順に返します。
type CollisionDetection = (args: CollisionArgs) => Key[]衝突判定がドラッグの移動のたびに受け取るもの。
Coordinatesビューポート座標でのポインター。モディファイア適用後の値です。
Rect | nullドラッグされているボックス(オーバーレイ、または overlay: false の場合は要素自体)を、ドラッグが動かした位置で表す矩形。
CollisionCandidate[]ドラッグが向かう可能性のあるすべてのドロップターゲット。その accept ルールがドラッグを受け入れるかどうかは問いません。
Key[]ヒットテストで得られた、ポインターの下のドロップターゲット(z 順序と shadow root を考慮)。良いものから順に並びます。