ドキュメント/API

アニメーション

アニメーションのオプションとフック。並べ替え、ドロップ、そしてドラッグ以外による変更。

このページを編集

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

プロバイダーの 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 で関数を受け取ります)。

Live

デモを読み込み中…

<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>&lt;DnDProvider :animation="shape" :drop-animation="shape" :animate-changes="shape"&gt;</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>

オプション

アニメーションのタイミング。省略した部分は、そのアニメーションのデフォルトのままです。

number

ms 単位。デフォルトはレイアウトの移動で 200、ドロップで 250。0 でアニメーションをオフにします。

string

CSS のイージング('ease-out'、cubic-bezier(…))。

並べ替え

アイテムが新しい位置へどう動くか: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 は自動でキャンセルされます。それ以外のものはここで止め、設定したスタイルをすぐに元に戻してください:直後にレイアウトが計測されます。

boolean

prefers-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>

オプションが指定するタイミング。デフォルトで補われています。

boolean

prefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。

データの変更

ドラッグ以外によるリスト(またはツリー)のアイテムの変更をアニメーションさせます:アイテムの追加、削除、移動(ソート、シャッフル、同じグループのリスト間の移動)、フィルタリング。デフォルトはオフ(false)です。true は、移動・登場・退場するアイテムをデフォルトのタイミングでアニメーションさせます。ドラッグは独自のアニメーション(animation、dropAnimation)を保ちます。prefers-reduced-motion: reduce のときはデフォルトのアニメーションは実行されませんが、あなたの関数は(reducedMotion: true 付きで)実行されます。アニメーションするのは表示領域の近くのアイテムだけです(仮想リストのマウントされていない行はスキップされます)。

type AutoAnimation = boolean | AutoAnimationOptions

パーツごとに指定する animateChanges:duration と easing はすべてのパーツに適用され、変更の種類ごとに true、オプション(共通のものを上書き)、false、または独自の関数を指定します。

LayoutAnimation

位置が変わったアイテム(デフォルトの FLIP で、animation のものと同じ。関数で置き換えられます)。

EnterAnimation

現れたアイテム。デフォルト:その場でフェードインします。

LeaveAnimation

出ていったアイテム。デフォルト:アイテムのコピーが元の場所で少し縮みながらフェードアウトします。

true、オプション、false(アイテムはそのまま現れます)、またはアイテムを登場させるアニメーションの関数。

type EnterAnimation = | boolean | AnimationOptions | ((context: EnterAnimationContext) => Animation | Promise<unknown> | void)

animateChanges がオンのリストに現れたアイテム:追加された、または再び表示された(フィルター、展開されたツリーノード)もの。

Key

アイテムのキー。

HTMLElement

アイテムの要素。すでに自分の位置にあります。

Rect

現れた場所(レイアウト上の矩形)。

Required<AnimationOptions>

オプションが指定するタイミング。デフォルトで補われています。

boolean

prefers-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>

オプションが指定するタイミング。デフォルトで補われています。

boolean

prefers-reduced-motion: reduce が設定されています。このときライブラリ自身のアニメーションは実行されませんが、あなたの関数は常に実行され、これを見て判断します(省略するか、フェードだけ残すか)。