Dokumentation/API
Animationen
Die Optionen und Hooks der Animationen – Sortieren, der Drop und Änderungen, die kein Drag ausgelöst hat.
Diese Seite wurde von KI übersetzt und kann Ungenauigkeiten enthalten. Englisches Original lesen
Die Optionen animation (Layout-Bewegungen beim Sortieren), dropAnimation (die Landung des
Overlays) und animateChanges (Datenänderungen, die kein Drag ausgelöst hat) des Providers nehmen
false, Optionen oder deine eigene Funktion entgegen – für GSAP oder motion. Listen und Bäume
können animation und animateChanges überschreiben; ziehbare Elemente, sortierbare Elemente und
Listen können ihre eigene dropAnimation mitbringen, Drop-Ziele eine overDropAnimation. Siehe
Animationen.
<DnDProvider :animation="{ duration: 180, easing: 'ease-out' }" :drop-animation="false" />
Jede Bahn unten ist ein eigener Provider, der animation, dropAnimation und
animateChanges dieselbe Art von Wert gibt (animateChanges bekommt in move eine Funktion).
Demo wird geladen…
<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>Optionen
Das Timing einer Animation. Was weggelassen wird, behält den Standardwert dieser Animation.
Sortieren
Wie Elemente an ihre neuen Plätze gelangen: true (Standard-Timing), Optionen, false (sie springen) oder eine Funktion, die ein Element von from nach to animiert und seine Animation zurückgibt, ein Promise, das abgeschlossen ist, wenn sie endet, oder nichts.
type LayoutAnimation = | boolean | AnimationOptions | ((context: LayoutAnimationContext) => Animation | Promise<unknown> | void)Was eine Layout-Animationsfunktion erhält, für ein Element, das an seinen neuen Platz zieht.
KeySchlüssel des Elements.
HTMLElementDas DOM-Element des Elements, bereits an seinem neuen Platz.
RectSichtbares Rechteck vor der Änderung (wo eine laufende Animation das Element gezeigt hat).
RectLayout-Rechteck nach der Änderung.
Required<AnimationOptions>Das Timing aus den Optionen, mit eingesetzten Standardwerten.
'drag' | 'change'Was das Element bewegt hat: ein Drag ('drag': Sortieren, der Drop, ein Abbruch) oder eine Änderung deiner Daten, die kein Drag ausgelöst hat ('change', bei eingeschaltetem animateChanges der Liste).
AbortSignalWird abgebrochen, wenn die Bibliothek die Animation unterbricht: Das Element bewegt sich erneut, bevor sie endet (die nächste Animation beginnt dort, wo es gezeigt wird), oder Animationen werden ausgeschaltet. Eine zurückgegebene Animation wird für dich abgebrochen. Stoppe hier alles andere und mache die Styles, die es gesetzt hat, sofort rückgängig: Das Layout wird direkt danach gemessen.
booleanprefers-reduced-motion: reduce ist gesetzt. Die eigenen Animationen der Bibliothek laufen dann nicht; deine Funktionen laufen immer und entscheiden anhand dieses Werts (überspringen oder eine Überblendung beibehalten).
Der Drop
Wie das Overlay bei einem Drop landet und bei einem Abbruch zurückfliegt: true (Standard-Timing), Optionen, false (kein Flug: Es endet dort, wo es losgelassen wurde) oder eine Funktion, die overlay von from nach to animiert und seine Animation zurückgibt, ein Promise, das abgeschlossen ist, wenn sie endet, oder nichts.
type DropAnimation = | boolean | AnimationOptions | ((context: DropAnimationContext) => Animation | Promise<unknown> | void)Was eine Drop-Animationsfunktion erhält: das Overlay, wo es ist und wo es landet.
HTMLElementDie Box des Overlays; sie landet im Slot des aktiven Elements. Bei einem Multi-Drag landen die Klone der anderen Elemente, die darin mitfahren (die des Standard-Overlays, die DragPreviews eines eigenen), von selbst in ihren eigenen Slots (mit dem Standard-Timing, wenn dies eine eigene Funktion ist).
RectWo das Overlay ist, wenn der Drag endet.
Rect | nullEndgültiges Rechteck des abgelegten Elements; null, wenn es nicht gerendert oder nicht sichtbar ist (das Overlay wird ausgeblendet).
Rect | nullDas Element ist nach einem Drop auf eine Drop-Zone (keine sortierbare Liste) nicht zu sehen, z. B. wurde es in ein anderes Element (einen Ordner) oder eine Papierkorb-Zone abgelegt: das sichtbare Rechteck der Zone. Die Standardanimation lässt das Overlay beim Ausblenden in dieses Rechteck schrumpfen, statt es an Ort und Stelle auszublenden.
'drop' | 'cancel''drop': Das Overlay landet dort, wo der Drop das Element abgelegt hat. 'cancel': Es fliegt dorthin zurück, wo das Element war.
ActiveDer beendete Drag.
Over | nullDas Ziel, auf dem der Drop landet (eine Liste, eine Zone); null beim Abbrechen.
Required<AnimationOptions>Das Timing aus den Optionen, mit eingesetzten Standardwerten.
booleanprefers-reduced-motion: reduce ist gesetzt. Die eigenen Animationen der Bibliothek laufen dann nicht; deine Funktionen laufen immer und entscheiden anhand dieses Werts (überspringen oder eine Überblendung beibehalten).
Datenänderungen
Animiert Änderungen an den Elementen einer Liste (oder eines Baums), die kein Drag ausgelöst hat: hinzugefügte, entfernte, verschobene (eine Sortierung, ein Mischen, ein Verschieben zwischen Listen einer Gruppe) oder gefilterte Elemente. Standardmäßig aus (false); true animiert Verschiebungen sowie erscheinende und verschwindende Elemente mit dem Standard-Timing. Drags behalten ihre eigenen Animationen (animation, dropAnimation). Mit prefers-reduced-motion: reduce laufen die Standardanimationen nicht; deine Funktionen laufen trotzdem (mit reducedMotion: true). Nur Elemente in der Nähe des sichtbaren Bereichs werden animiert (nicht gemountete Zeilen einer virtuellen Liste werden übersprungen).
type AutoAnimation = boolean | AutoAnimationOptionsanimateChanges mit seinen Teilen: duration und easing für alle, und pro Art von Änderung true, Optionen (über den gemeinsamen), false oder eine eigene Funktion.
LayoutAnimationElemente, die ihren Platz gewechselt haben (das Standard-FLIP, wie bei animation; eine Funktion ersetzt es).
EnterAnimationErschienene Elemente. Standard: Sie werden an ihrem Platz eingeblendet.
LeaveAnimationVerschwundene Elemente. Standard: Eine Kopie des Elements wird dort ausgeblendet, wo es war, und schrumpft dabei ein wenig.
true, Optionen, false (das Element erscheint einfach) oder eine Funktion, die sein Erscheinen animiert.
type EnterAnimation = | boolean | AnimationOptions | ((context: EnterAnimationContext) => Animation | Promise<unknown> | void)Ein Element, das in einer Liste mit eingeschaltetem animateChanges erschienen ist: hinzugefügt oder wieder eingeblendet (ein Filter, ein aufgeklappter Baumknoten).
KeySchlüssel des Elements.
HTMLElementDas DOM-Element des Elements, bereits an seinem Platz.
RectWo es erschienen ist (Layout-Rechteck).
Required<AnimationOptions>Das Timing aus den Optionen, mit eingesetzten Standardwerten.
booleanprefers-reduced-motion: reduce ist gesetzt. Die eigenen Animationen der Bibliothek laufen dann nicht; deine Funktionen laufen immer und entscheiden anhand dieses Werts (überspringen oder eine Überblendung beibehalten).
true, Optionen, false (das Element verschwindet einfach) oder eine Funktion, die das Verschwinden der an seinem Platz zurückgelassenen Kopie animiert: Gib ihre Animation oder ein Promise zurück, und die Kopie wird entfernt, wenn sie endet (sofort, wenn die Funktion nichts zurückgibt).
type LeaveAnimation = | boolean | AnimationOptions | ((context: LeaveAnimationContext) => Animation | Promise<unknown> | void)Ein Element, das eine Liste mit eingeschaltetem animateChanges verlassen hat: entfernt oder ausgeblendet (ein Filter, ein zugeklappter Baumknoten).
KeySchlüssel des Elements.
HTMLElementEine Kopie des DOM-Elements, gezeigt dort, wo das Element war (das Element selbst ist weg): absolut positioniert in seinem alten Elternelement, für den Zeiger nicht erreichbar, markiert mit data-dnd-leaving. Die Bibliothek entfernt sie, wenn deine Animation endet.
RectWo das Element war.
Required<AnimationOptions>Das Timing aus den Optionen, mit eingesetzten Standardwerten.
booleanprefers-reduced-motion: reduce ist gesetzt. Die eigenen Animationen der Bibliothek laufen dann nicht; deine Funktionen laufen immer und entscheiden anhand dieses Werts (überspringen oder eine Überblendung beibehalten).