プロバイダーの animation(並べ替え中のレイアウトの移動)、dropAnimation(オーバーレイの着地)、animateChanges(ドラッグ以外によるデータの変更)は、false、オプション、または独自の関数(GSAP や motion 用)を受け付けます。リストとツリーは animation と animateChanges を上書きできます。ドラッグ可能な要素、アイテム、リストは独自の dropAnimation を、ドロップターゲットは overDropAnimation を持てます。アニメーションを参照してください。
<DnDProvider :animation="{ duration: 180, easing: 'ease-out' }" :drop-animation="false" />
下の各レーンはそれぞれ独立したプロバイダーで、animation、dropAnimation、animateChanges に同じ種類の値を渡しています(animateChanges は move で関数を受け取ります)。
デモを読み込み中…
<script setup lang="ts">
import { ref } from 'vue';
import { DnDProvider, type AutoAnimation, type DropAnimation, type LayoutAnimation } from '@vue-dnd-kit/core';
import AnimLane from './AnimLane.vue';
import { tiltDrop, tiltMove } from './tilt';
const SLOW = { duration: 700, easing: 'ease-in-out' };
// One shape per lane, for all three options: sorting, the drop, and changes no drag made.
const lanes: { label: string; animation: LayoutAnimation; dropAnimation: DropAnimation; animateChanges: AutoAnimation }[] = [
{ label: 'true', animation: true, dropAnimation: true, animateChanges: true },
{ label: 'false', animation: false, dropAnimation: false, animateChanges: false },
{ label: '{ duration: 700 }', animation: SLOW, dropAnimation: SLOW, animateChanges: SLOW },
// `animateChanges` takes no function itself: its parts (`move`, `enter`, `leave`) do.
{ label: 'ƒ tilt', animation: tiltMove, dropAnimation: tiltDrop, animateChanges: { move: tiltMove } },
];
const letters = ['A', 'B', 'C', 'D'];
const rows = ref(lanes.map(() => letters.map((id, i) => ({ id, hue: 150 + i * 40 }))));
/** The same new order in every lane (Fisher–Yates: every order as likely): `animateChanges` plays it four ways. */
const shuffle = () => {
const order = [...letters];
for (let i = order.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[order[i], order[j]] = [order[j]!, order[i]!];
}
rows.value = rows.value.map((lane) => order.map((id) => lane.find((row) => row.id === id)!));
};
</script>
<template>
<div class="demo">
<code><DnDProvider :animation="shape" :drop-animation="shape" :animate-changes="shape"></code>
<div class="lanes">
<!-- A provider per lane: each one has its own animations. -->
<DnDProvider
v-for="(lane, index) in lanes"
:key="lane.label"
:animation="lane.animation"
:drop-animation="lane.dropAnimation"
:animate-changes="lane.animateChanges"
>
<AnimLane v-model="rows[index]!" :label="lane.label" />
</DnDProvider>
</div>
<button type="button" @click="shuffle">Shuffle all</button>
</div>
</template>
<style scoped>
.demo {
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
}
code {
max-width: 100%;
font: 11px/1.4 ui-monospace, Menlo, Consolas, monospace;
text-align: center;
opacity: 0.7;
}
button {
padding: 6px 12px;
border: 0;
border-radius: 8px;
background: #42b883;
color: #fff;
font: 600 12px/1 system-ui, sans-serif;
cursor: pointer;
}
button:focus-visible {
outline: 2px solid currentColor;
outline-offset: 2px;
}
.lanes {
display: grid;
grid-template-columns: repeat(4, 128px);
gap: 8px;
}
@media (max-width: 560px) {
.lanes {
grid-template-columns: repeat(2, 128px);
}
}
</style>オプション
アニメーションのタイミング。省略した部分は、そのアニメーションのデフォルトのままです。
並べ替え
アイテムが新しい位置へどう動くか:true(デフォルトのタイミング)、オプション、false(瞬時に移動)、または 1 つのアイテムを from から to へアニメーションさせ、その Animation、終了時に確定する Promise、または何も返さない関数。
type LayoutAnimation = | boolean | AnimationOptions | ((context: LayoutAnimationContext) => Animation | Promise<unknown> | void)レイアウトアニメーション関数が受け取るもの。新しい場所へ移動する 1 つのアイテムについての情報です。
Keyアイテムのキー。
HTMLElementアイテムの要素。すでに新しい場所にあります。
Rect変化の前の見た目上の矩形(実行中のアニメーションがアイテムを表示していた位置)。
Rect変化の後のレイアウト上の矩形。
Required<AnimationOptions>オプションが指定するタイミング。デフォルトで補われています。
'drag' | 'change'何がアイテムを動かしたか:ドラッグ('drag':並べ替え、ドロップ、キャンセル)、またはドラッグ以外によるデータの変更('change'。リストの animateChanges がオンの場合)。
AbortSignalライブラリがアニメーションを中断すると abort されます:アニメーションが終わる前にアイテムが再び動いた場合(次のアニメーションは表示されている位置から始まります)、またはアニメーションがオフにされた場合です。返された Animation は自動でキャンセルされます。それ以外のものはここで止め、設定したスタイルをすぐに元に戻してください:直後にレイアウトが計測されます。
booleanprefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。
ドロップ
ドロップ時にオーバーレイが着地し、キャンセル時に元の位置に戻る仕方:true(デフォルトのタイミング)、オプション、false(飛ばない:離した場所で終わります)、または overlay を from から to へアニメーションさせ、その Animation、終了時に確定する promise を返すか、何も返さない関数。
type DropAnimation = | boolean | AnimationOptions | ((context: DropAnimationContext) => Animation | Promise<unknown> | void)ドロップアニメーション関数が受け取るもの:オーバーレイ、その現在の位置、着地する位置。
HTMLElementオーバーレイのボックス。アクティブなアイテムの位置に着地します。マルチドラッグでは、その中に乗っているほかのアイテムのクローン(デフォルトのオーバーレイのもの、カスタムのオーバーレイの DragPreview)は、それぞれ自分の位置に自動で着地します(これがカスタム関数の場合はデフォルトのタイミングで)。
Rectドラッグが終わったときのオーバーレイの位置。
Rect | nullドロップされたアイテムの最終的な矩形。描画されていない、または見えていない場合は null(オーバーレイはフェードアウトします)。
Rect | nullゾーン(並べ替え可能なリストではないもの)へのドロップの後、アイテムが表示されない場合。たとえば別のアイテム(フォルダー)やゴミ箱ゾーンにドロップされた場合で、そのゾーンの見えている矩形です。デフォルトのアニメーションは、その場でフェードする代わりに、オーバーレイをフェードアウトさせながらこの中へ縮めます。
'drop' | 'cancel''drop':オーバーレイは、ドロップがアイテムを置いた場所に着地します。'cancel':アイテムがあった場所へ戻ります。
Active終了したドラッグ。
Over | nullドロップが着地するターゲット(リスト、ゾーン)。キャンセル時は null。
Required<AnimationOptions>オプションが指定するタイミング。デフォルトで補われています。
booleanprefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。
データの変更
ドラッグ以外によるリスト(またはツリー)のアイテムの変更をアニメーションさせます:アイテムの追加、削除、移動(ソート、シャッフル、同じグループのリスト間の移動)、フィルタリング。デフォルトはオフ(false)です。true は、移動・登場・退場するアイテムをデフォルトのタイミングでアニメーションさせます。ドラッグは独自のアニメーション(animation、dropAnimation)を保ちます。prefers-reduced-motion: reduce のときはデフォルトのアニメーションは実行されませんが、あなたの関数は(reducedMotion: true 付きで)実行されます。アニメーションするのは表示領域の近くのアイテムだけです(仮想リストのマウントされていない行はスキップされます)。
type AutoAnimation = boolean | AutoAnimationOptionsパーツごとに指定する animateChanges:duration と easing はすべてのパーツに適用され、変更の種類ごとに true、オプション(共通のものを上書き)、false、または独自の関数を指定します。
true、オプション、false(アイテムはそのまま現れます)、またはアイテムを登場させるアニメーションの関数。
type EnterAnimation = | boolean | AnimationOptions | ((context: EnterAnimationContext) => Animation | Promise<unknown> | void)animateChanges がオンのリストに現れたアイテム:追加された、または再び表示された(フィルター、展開されたツリーノード)もの。
Keyアイテムのキー。
HTMLElementアイテムの要素。すでに自分の位置にあります。
Rect現れた場所(レイアウト上の矩形)。
Required<AnimationOptions>オプションが指定するタイミング。デフォルトで補われています。
booleanprefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。
true、オプション、false(アイテムはそのまま消えます)、または元の場所に残されたコピーを退場させるアニメーションの関数:その Animation か Promise を返すと、終わったときにコピーが取り除かれます(関数が何も返さない場合はすぐに)。
type LeaveAnimation = | boolean | AnimationOptions | ((context: LeaveAnimationContext) => Animation | Promise<unknown> | void)animateChanges がオンのリストから出ていったアイテム:削除された、または非表示になった(フィルター、折りたたまれたツリーノード)もの。
Keyアイテムのキー。
HTMLElementアイテムの要素のコピー。アイテムがあった場所に表示されます(アイテム自体はもうありません):元の親の中で絶対配置され、ポインターを無視し、data-dnd-leaving が付きます。あなたのアニメーションが終わると、ライブラリがこれを取り除きます。
Rectアイテムがあった場所。
Required<AnimationOptions>オプションが指定するタイミング。デフォルトで補われています。
booleanprefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。