Documentação/API
Modificadores e colisão
Funções que mudam para onde vai o item arrastado, e as que escolhem o alvo sob ele.
Esta página foi traduzida por IA e pode conter imprecisões. Ler o original em inglês
Carregando a demo…
<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>Modificadores
import { restrictToParent, snapToGrid } from '@vue-dnd-kit/core';
makeSortableList(list, { items, modifiers: [restrictToParent] });
makeDragArea(board, { modifiers: [snapToGrid({ x: 24, y: 24, smooth: true })] });
Um modificador recebe o deslocamento do arraste e retorna um novo. Eles rodam em ordem: os
modifiers do provider, os de uma área de arraste, os do próprio draggable (ou da lista dele),
depois os limites da área (restrictToArea), e a trava de axis por último. Veja
Eixos, limites e grades.
ModifierMove só na vertical: na horizontal ele acompanha o conteúdo onde começou (containerShift), não importa como a página role. A opção axis: 'y' faz o mesmo, por último.
ModifierMove só na horizontal: na vertical ele acompanha o conteúdo onde começou (containerShift), não importa como a página role. A opção axis: 'x' faz o mesmo, por último.
ModifierMantém o overlay dentro da janela.
ModifierMantém o overlay dentro do contêiner onde o arraste começou: a lista ordenável (não o pai dela no DOM) ou, para draggables simples, o elemento pai.
(target: MaybeElementRef) => ModifierMantém o overlay dentro de um elemento: o elemento, um ref ou um getter.
ModifierMantém o overlay dentro do primeiro ancestral rolável do elemento arrastado.
(size: number | SnapToGridOptions) => ModifierEncaixa o overlay em uma grade, na célula mais próxima: um número é o tamanho de células quadradas; as opções definem cada eixo, onde a grade começa e um deslizamento entre as células (SnapToGridOptions).
ModifierCentraliza o overlay sob o ponteiro em vez de manter o deslocamento de onde ele foi pego.
Opções de snapToGrid.
numberA largura da célula em px. Sem ela (ou 0), o arraste se move livremente no eixo x.
numberA altura da célula em px. Sem ela (ou 0), o arraste se move livremente no eixo y: { y: 15 } encaixa só o horário de um evento de calendário.
'container' | 'delta''container' (padrão): o canto superior esquerdo do overlay pousa nas linhas de uma grade traçada a partir do canto superior esquerdo do contêiner (containerRect: a lista ordenável ou o elemento pai). 'delta': o deslocamento do arraste é arredondado, mantendo fora da grade o ponto onde o item começou.
boolean | AnimationOptionsDesliza o overlay entre as posições encaixadas (padrão 80ms). A colisão continua usando a posição encaixada na hora.
Muda para onde o item arrastado vai: recebe o deslocamento do arraste (transform) e retorna um novo.
type Modifier = (args: ModifierArgs) => CoordinatesO que um modificador recebe, a cada movimento do arraste.
CoordinatesDeslocamento desde o início do arraste, como modificado pelos modificadores anteriores.
ActiveO arraste.
RectRetângulo do elemento arrastado no início do arraste.
RectRetângulo da caixa do overlay se ela fosse movida por transform, no tamanho que tem agora. Com overlayFit: 'slot', a caixa se redimensiona ao redor do ponteiro, então nem sempre é activeRect movido por transform.
CoordinatesPosição do ponteiro no início do arraste.
Rect | nullContêiner da lista ordenável (ou elemento pai) do item arrastado, onde ele está agora (acompanha a rolagem).
CoordinatesQuanto o conteúdo onde o arraste começou se moveu na tela desde o início: o contêiner se moveu (a página ou um contêiner em volta dele rolou, o layout mudou) e o conteúdo dele rolou dentro dele. As travas de eixo prendem o outro eixo ali, para que o arraste fique na sua linha ou coluna desse conteúdo.
RectRetângulo da janela (a viewport).
Over | nullO alvo de drop sob o arraste, como encontrado por último; null sobre nada.
Detecção de colisão
import { closestCorners } from '@vue-dnd-kit/core';
<DnDProvider :collision="closestCorners" />
O collision do provider escolhe o alvo; o melhor candidato vem primeiro.
CollisionDetectionPadrão: o que está sob o ponteiro, senão o que o overlay sobrepõe.
CollisionDetectionAlvos sob o ponteiro, obtidos por hit-testing: respeita z-order, overlays e shadow roots.
CollisionDetectionAlvos que se sobrepõem ao overlay: maior prioridade, depois aninhamento mais profundo, depois intersection over union.
CollisionDetectionTodos os alvos, pela distância entre os centros.
CollisionDetectionTodos os alvos, pela soma das distâncias entre os cantos (bom para alvos empilhados, como colunas de kanban).
Retorna os ids dos candidatos, o melhor primeiro.
type CollisionDetection = (args: CollisionArgs) => Key[]O que uma detecção de colisão recebe, a cada movimento do arraste.
CoordinatesPonteiro em coordenadas da viewport, depois dos modificadores.
Rect | nullRetângulo da caixa arrastada (o overlay, ou o próprio elemento com overlay: false) onde o arraste a colocou.
CollisionCandidate[]Todos os alvos de drop para onde o arraste poderia ir, quer a regra accept deles aceite o arraste ou não.
Key[]Alvos de drop sob o ponteiro, obtidos por hit-testing (respeita z-order e shadow roots), o melhor primeiro.
Um alvo de drop que uma detecção de colisão pode escolher: habilitado, na página e não totalmente recortado.
KeyId do alvo de drop.
RectParte visível do alvo: recortada pelos contêineres de rolagem dele e pela viewport.
numberA priority do alvo (padrão 0): o maior vence quando alvos se sobrepõem sem aninhamento. Itens ordenáveis vencem os contêineres.
numberNível de aninhamento entre os alvos de drop: 0 no topo, alvos mais profundos têm valores maiores.