changedTouches为什么包含多个触点时无法正确跟踪触摸移动?
我在移动端用touchmove事件处理多点触控时发现,当changedTouches里有多个触点时,怎么都拿不到某个特定触点的移动轨迹?比如用类似这样设置的圆点元素:
.touch-point {
position: absolute;
width: 20px;
height: 20px;
background: red;
border-radius: 50%;
}
我尝试用 touches[e.identifier] 和 targetTouches[e.identifier] 都不行,坐标总是跳变,甚至会跟丢触点,是不是哪里理解错了?
changedTouches是用来表示当前事件中发生变化的触点列表,但问题是它并不区分具体哪个手指对应哪个元素。如果你直接用它来跟踪特定触点,坐标跳变和跟丢触点是很正常的,因为它只记录变化,不保证持续性。正确的做法是用
touches列表,并结合每个触点的唯一标识符identifier来跟踪。以下是高效实现的代码示例:重点在于:
1. 使用
identifier唯一标识每个触点,避免混淆。2. 把触点和对应的 DOM 元素存到一个对象里,效率更高。
3.
touchmove时直接从touches获取数据,而不是changedTouches。这样就能准确跟踪每个触点的移动轨迹了,不会再出现跟丢或跳变的情况。
changedTouches本身的设计就是用来表示状态发生变化的触点集合(比如某个手指开始按下了、移动了、或者抬起了),但它并不适合直接用来跟踪每个触点的完整轨迹。下面我分步骤来解释怎么解决你的问题。---
### 第一步:理解
touches和changedTouches的区别-
是当前屏幕上所有的触点集合,无论这些触点的状态是否发生了变化。touches-
是那些状态发生变化的触点集合,比如新按下的手指、抬起的手指、或者正在移动的手指。changedTouches当你需要跟踪某个特定触点的移动轨迹时,不能仅仅依赖
changedTouches,因为它的设计是动态的,每次事件触发时只会包含“状态变化”的触点,而不是所有触点。所以,如果某些触点没有发生状态变化(比如其他手指静止不动),它们不会出现在changedTouches中。---
### 第二步:如何正确跟踪每个触点
为了跟踪每个触点的移动轨迹,你需要用到以下几个关键点:
1. 每个触点都有一个唯一的标识符
e.identifier,可以用它来区分不同的手指。2. 使用
而不是touches来获取所有当前屏幕上的触点。changedTouches3. 维护一个全局的对象或数组,用来存储每个触点的当前位置。
---
### 第三步:代码实现
下面是一个完整的代码示例,展示如何正确跟踪多点触控的移动轨迹:
---
### 第四步:解释代码逻辑
1. **
touchstart**:当手指按下时,我们遍历,获取每个触点的初始位置,并用e.touchese.identifier作为键存储到touchPoints对象中。2. **
touchmove**:在手指移动时,我们同样遍历,更新每个触点的最新位置。e.touches3. **
touchend和touchcancel**:当手指抬起或被取消时,我们通过找到对应的触点,并从e.changedTouchestouchPoints中删除。4. **
updateCircles**:根据touchPoints中存储的坐标,动态更新每个圆点元素的位置。---
### 第五步:常见问题排查
1. 如果发现坐标跳变,可能是因为你误用了
,导致丢失了某些触点的信息。changedTouches2. 确保你在
touchmove中使用的是,而不是e.touches。e.changedTouches3. 如果圆点元素没有正确跟随手指移动,检查 CSS 是否设置了正确的
position: absolute;和transform。---
希望这段代码和解释能帮你解决问题!如果有其他问题随时问。