From c3db56793a2d5e9c0baa6ca67025a39bd9d7a76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 8 Dec 2025 11:21:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/components/autoScrollerHandler.js | 59 +++++++++---------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/backend/static/js/components/autoScrollerHandler.js b/backend/static/js/components/autoScrollerHandler.js index f61f5ef2..96d5a3cc 100644 --- a/backend/static/js/components/autoScrollerHandler.js +++ b/backend/static/js/components/autoScrollerHandler.js @@ -211,22 +211,25 @@ function initSingleScroller(wrapper, options = {}) { * Обработчик наведения на элемент. */ function handleItemMouseEnter(event) { - // Больше НЕ ставим на паузу при наведении на карточку - // Просто применяется CSS hover эффект (увеличение) - // Пауза и центрирование сработают только при наведении у краев (см. handleWrapperMouseMove) + // Ставим на паузу, но НЕ центрируем (в отличие от старой версии) + paused = true; } /** * Обработчик ухода курсора с элемента. */ function handleItemMouseLeave() { - // Пауза контролируется через handleWrapperMouseMove + // Снимаем паузу + paused = false; } /** - * Обработчик движения мыши по контейнеру - логика паузы у краев. + * Обработчик движения мыши по контейнеру - логика центрирования у краев. */ function handleWrapperMouseMove(event) { + // Пропускаем если уже на паузе из-за hover на карточке + if (paused) return; + const containerRect = wrapper.getBoundingClientRect(); const mouseX = event.clientX - containerRect.left; const containerWidth = containerRect.width; @@ -238,36 +241,32 @@ function initSingleScroller(wrapper, options = {}) { const isNearRightEdge = mouseX > (containerWidth - edgeZone); if (isNearLeftEdge || isNearRightEdge) { - // Мышь у края - останавливаем скролл - if (!paused) { - paused = true; + // Мышь у края - останавливаем скролл и центрируем ближайший элемент + paused = true; + + // Находим ближайший элемент к курсору + const items = Array.from(rail.querySelectorAll('.join-item')); + let closestItem = null; + let minDistance = Infinity; + + items.forEach(item => { + const itemRect = item.getBoundingClientRect(); + const itemCenterX = itemRect.left + itemRect.width / 2; + const distance = Math.abs(event.clientX - itemCenterX); - // Находим ближайший элемент к курсору - const items = Array.from(rail.querySelectorAll('.join-item')); - let closestItem = null; - let minDistance = Infinity; - - items.forEach(item => { - const itemRect = item.getBoundingClientRect(); - const itemCenterX = itemRect.left + itemRect.width / 2; - const distance = Math.abs(event.clientX - itemCenterX); - - if (distance < minDistance) { - minDistance = distance; - closestItem = item; - } - }); - - // Центрируем ближайший элемент - if (closestItem) { - centerItemInView(wrapper, closestItem); + if (distance < minDistance) { + minDistance = distance; + closestItem = item; } + }); + + // Центрируем ближайший элемент + if (closestItem) { + centerItemInView(wrapper, closestItem); } } else { // Мышь в центральной зоне - возобновляем скролл - if (paused) { - paused = false; - } + paused = false; } }