Skip to content

Commit 8dfffcb

Browse files
committed
iosでtouchstartとclickが両方呼ばれる?問題を解決したかも
1 parent 1da03d6 commit 8dfffcb

1 file changed

Lines changed: 36 additions & 14 deletions

File tree

src/lib/pixelBurst.ts

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -213,30 +213,52 @@ function createBurst(centerX: number, centerY: number, options: PixelBurstOption
213213

214214
// グローバルなクリックハンドラを設定
215215
export function initPixelBurst(options: PixelBurstOptions = {}) {
216-
function handleClick(event: MouseEvent | TouchEvent) {
217-
let x: number, y: number;
218-
219-
if (event instanceof TouchEvent) {
220-
const touch = event.touches[0] || event.changedTouches[0];
221-
// pageX/pageY を使用してページ座標を取得
222-
x = touch.pageX;
223-
y = touch.pageY;
224-
} else {
225-
// pageX/pageY を使用してページ座標を取得
226-
x = event.pageX;
227-
y = event.pageY;
216+
let lastTouchTime = 0;
217+
let lastTouchX = 0;
218+
let lastTouchY = 0;
219+
const TOUCH_DEBOUNCE_MS = 300; // 300ms以内の重複を防ぐ
220+
const TOUCH_DISTANCE_THRESHOLD = 10; // 10px以内の距離を同じタップとみなす
221+
222+
function handleTouch(event: TouchEvent) {
223+
const touch = event.touches[0] || event.changedTouches[0];
224+
const x = touch.pageX;
225+
const y = touch.pageY;
226+
const now = Date.now();
227+
228+
// 短時間内に同じ位置でタッチされた場合は無視(デバウンス)
229+
const timeDiff = now - lastTouchTime;
230+
const distance = Math.sqrt(
231+
Math.pow(x - lastTouchX, 2) + Math.pow(y - lastTouchY, 2)
232+
);
233+
234+
if (timeDiff < TOUCH_DEBOUNCE_MS && distance < TOUCH_DISTANCE_THRESHOLD) {
235+
return;
228236
}
229237

238+
lastTouchTime = now;
239+
lastTouchX = x;
240+
lastTouchY = y;
241+
230242
createBurst(x, y, options);
231243
}
232244

245+
function handleClick(event: MouseEvent) {
246+
// タッチイベントの直後に発火したclickイベントは無視
247+
const now = Date.now();
248+
if (now - lastTouchTime < TOUCH_DEBOUNCE_MS) {
249+
return;
250+
}
251+
252+
createBurst(event.pageX, event.pageY, options);
253+
}
254+
255+
document.addEventListener('touchstart', handleTouch, { passive: true });
233256
document.addEventListener('click', handleClick);
234-
document.addEventListener('touchstart', handleClick, { passive: true });
235257

236258
// クリーンアップ関数を返す
237259
return () => {
238260
document.removeEventListener('click', handleClick);
239-
document.removeEventListener('touchstart', handleClick);
261+
document.removeEventListener('touchstart', handleTouch);
240262

241263
// 全パーティクルを削除
242264
for (const p of particles) {

0 commit comments

Comments
 (0)