求助:从右向左滑动打开抽屉导航的滑动逻辑异常问题
嘿,我来帮你搞定这个右滑抽屉的手势逻辑问题!你已经把抽屉的位置改到右侧了,但滑动逻辑反向的核心原因是手势位移的判断逻辑和抽屉的过渡方向没对应上,只改translateX的正负是不够的,得从CSS初始定位和JS手势判断两方面调整:
第一步:修正CSS的初始位置与过渡方向
先确保抽屉初始完全藏在视口右侧外,并且过渡方向是从右往左滑入:
.drawer { position: fixed; top: 0; right: 0; width: 300px; height: 100vh; background-color: #fff; /* 初始状态:完全在右侧视口外 */ transform: translateX(100%); /* 保持平滑过渡 */ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); } /* 打开状态的类 */ .drawer.open { transform: translateX(0); }
第二步:反转JavaScript的手势判断逻辑
原版是检测**向右滑动(deltaX为正)来打开左侧抽屉,现在我们需要改成检测向左滑动(deltaX为负)**来打开右侧抽屉,同时调整拖动时的位移计算:
const drawer = document.querySelector('.drawer'); const drawerWidth = drawer.offsetWidth; let startX; let isDragging = false; // 触摸开始:记录初始位置 drawer.addEventListener('touchstart', (e) => { startX = e.touches[0].clientX; isDragging = true; // 拖动时关闭过渡,让滑动更流畅 drawer.style.transition = 'none'; }); // 触摸移动:实时更新抽屉位置 drawer.addEventListener('touchmove', (e) => { if (!isDragging) return; const currentX = e.touches[0].clientX; const deltaX = currentX - startX; // 计算抽屉的位移比例:向左滑动时deltaX为负,抽屉从100%往0移动 const translatePercent = Math.max(0, Math.min(100, 100 + (deltaX / drawerWidth) * 100)); drawer.style.transform = `translateX(${translatePercent}%)`; }); // 触摸结束:判断是否触发打开/关闭 drawer.addEventListener('touchend', (e) => { isDragging = false; drawer.style.transition = 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)'; const currentX = e.changedTouches[0].clientX; const deltaX = currentX - startX; // 设定阈值:向左滑动超过抽屉宽度的30%就打开,否则回弹关闭 if (deltaX < -drawerWidth * 0.3) { drawer.classList.add('open'); } else { drawer.classList.remove('open'); } });
额外提示:页面边缘滑动触发优化
如果你想实现从屏幕右边缘往左滑就能打开抽屉(而非只能在抽屉上滑动),可以把触摸事件监听加到document上,同时判断触摸起始点是否在屏幕右侧的触发区域内:
document.addEventListener('touchstart', (e) => { // 只监听屏幕右侧10%区域内的触摸 if (e.touches[0].clientX > window.innerWidth * 0.9) { startX = e.touches[0].clientX; isDragging = true; drawer.style.transition = 'none'; } });
这样调整后,滑动手势和抽屉的动作就能完全匹配了——向左滑打开,向右滑关闭,抽屉从右侧平滑滑入滑出。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

