ドキュメント/API

モディファイアと衝突判定

ドラッグ中のアイテムの行き先を変える関数と、その下のターゲットを選ぶ関数。

このページを編集

このページは AI によって翻訳されており、不正確な箇所が含まれている可能性があります。 英語の原文を読む

Live

デモを読み込み中…

<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">&lt;DnDProvider :collision="{{ collision }}"&gt;</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 のオプション。

x?
number

セルの幅(px)。指定しない(または 0)と、ドラッグは x 方向に自由に動きます。

y?
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 を考慮)。良いものから順に並びます。

衝突判定が選べるドロップターゲット:有効で、ページ上にあり、完全には切り取られていないもの。

Key

ドロップターゲットの id。

Rect

ターゲットの見えている部分:スクロールコンテナーとビューポートで切り取られたもの。

number

ターゲットの priority(デフォルト 0):ネストせずにターゲットが重なるときは、高いほうが勝ちます。並べ替え可能なアイテムはコンテナーに勝ちます。

number

ドロップターゲット間のネストの階層:最上位は 0 で、深いターゲットほど大きな値になります。