From 33ec0cd33e935e0698bc3431909ea51e8238f88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=BC=E5=90=B8=E4=BA=8C=E6=B0=A7=E5=8C=96=E7=A2=B3?= Date: Thu, 30 Oct 2025 17:04:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20cl-banner=201=E5=A4=84bug?= =?UTF-8?q?=E3=80=81=E4=BC=98=E5=8C=96=E6=89=8B=E5=8A=BF=E6=93=8D=E4=BD=9C?= =?UTF-8?q?=E3=80=81=E5=A2=9E=E5=8A=A0touch=E4=BB=A3=E7=90=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复bug: 在ios端滑动时,transition-duration: 0.3s 样式导致卡顿,将class改成style更新 优化手势: 判断手势方向,当很向滑动时阻止页面上下滚动 touch代理: 将 onTouchStart,onTouchMove,onTouchEnd 三个方法暴露出去,可以在其它view上定义相应方法,绑定后,滑动其它地方相当于滑动banner --- .../components/cl-banner/cl-banner.uvue | 49 +++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/uni_modules/cool-ui/components/cl-banner/cl-banner.uvue b/uni_modules/cool-ui/components/cl-banner/cl-banner.uvue index 64fb560..acf86e7 100644 --- a/uni_modules/cool-ui/components/cl-banner/cl-banner.uvue +++ b/uni_modules/cool-ui/components/cl-banner/cl-banner.uvue @@ -12,11 +12,9 @@ > Math.abs(y)) { + // 如果x轴移动距离大于y轴移动距离则表明是横向移动手势 + touchHorizontal = 1 + } + if (touchHorizontal == 1) { + // 如果是横向移动手势,则阻止默认行为(防止页面滚动) + e.preventDefault() + } + } + + // 横向移动时才处理 + if (touchHorizontal != 1) { + return + } + // 计算手指移动距离,实时更新偏移量 const deltaX = e.touches[0].clientX - touchStartPoint.value; slideOffset.value = initialOffset.value + deltaX; @@ -347,6 +372,9 @@ function onTouchMove(e: TouchEvent) { */ function onTouchEnd() { if (props.list.length <= 1 || !isTouching.value) return; + + touchStartY = 0; + touchHorizontal = 0; // 重置触摸状态 isTouching.value = false; @@ -409,6 +437,13 @@ onMounted(() => { getRect(); startAutoplay(); }); + +// 将触摸事件暴露给父组件,支持控制其它view将做touch代理 +defineExpose({ + onTouchStart, + onTouchMove, + onTouchEnd, +});