You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

父div应用transform:scale()时@dnd-kit列表排序功能异常求助

解决transform:scale()导致@dnd-kit拖动光标与区块错位的问题

当页面通过transform:scale()做整体缩放时,@dnd-kit的拖动逻辑会因为坐标空间被修改而失效——它默认基于原始未缩放的坐标计算拖动位置,导致视觉上光标和拖动区块对不上。

两种可行的解决办法:

1. 给dnd-kit的坐标计算加缩放适配

自定义pointerCoordinatesGetter,把光标原始坐标除以缩放比例,让dnd-kit基于缩放后的坐标体系计算位置:

import { DndContext, pointerCoordinatesGetter } from '@dnd-kit/core';

// 这里的scale替换成你实际使用的缩放值,也可以动态从元素style里获取
const scale = 0.8;

const adjustedPointerGetter = (event) => {
  const originalPos = pointerCoordinatesGetter(event);
  return {
    x: originalPos.x / scale,
    y: originalPos.y / scale,
  };
};

// 在DndContext中传入这个自定义方法
<DndContext pointerCoordinatesGetter={adjustedPointerGetter}>
  {/* 你的可排序区块组件 */}
</DndContext>

如果缩放比例是动态调整的,记得实时更新scale值并重新渲染DndContext。

2. 换用不修改坐标空间的缩放方式

放弃transform:scale(),改用zoom属性(Chrome、Edge原生支持,Firefox可以加-moz-transform: scale()+transform-origin: 0 0模拟),或者用根元素font-size配合rem单位实现页面缩放,这样不会干扰dnd-kit的坐标计算:

/* 用zoom替代transform:scale */
.page-container {
  zoom: 0.8;
  /* Firefox兼容写法 */
  -moz-transform: scale(0.8);
  -moz-transform-origin: 0 0;
}

在你的场景里测试这两种方法,都能解决光标和拖动区块错位的问题。

内容的提问来源于stack exchange,提问作者Alpesh Baraiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:37:17