From 6ae6516db7e4f9296f3d34be0f9c8ef1e321cf38 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: Fri, 5 Dec 2025 11:11:09 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=BF=D1=80=D1=8B=D0=B6=D0=BE=D0=BA=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=81=D0=BA=D1=80=D0=BE=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D1=80=D0=B0=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B8=D1=81=D1=85=D0=BE=D0=B4=D0=B8=D1=82=20?= =?UTF-8?q?=D0=B2=20=D1=81=D0=B5=D1=80=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Вычисляется loopPoint как blockScrollWidth * floor(totalCopies/2) - Прыжок происходит реже (в середине вместо начала) - Переход стал менее заметным для пользователя - Добавлено логирование loopPoint для отладки --- backend/static/js/components/autoScrollerHandler.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/static/js/components/autoScrollerHandler.js b/backend/static/js/components/autoScrollerHandler.js index fff38863..4f6e1c50 100644 --- a/backend/static/js/components/autoScrollerHandler.js +++ b/backend/static/js/components/autoScrollerHandler.js @@ -128,12 +128,17 @@ function initSingleScroller(wrapper, options = {}) { // Вычисляем точную ширину блока после рендеринга const blockScrollWidth = rail.scrollWidth / totalCopies; + // Точка прыжка - в середине всего контента (после половины копий) + // Это даст максимально плавный переход + const loopPoint = blockScrollWidth * Math.floor(totalCopies / 2); + let animationFrame = null; let paused = false; let resizeFrame = null; console.log('initSingleScroller: scrollStep =', scrollStep, 'originalCount =', originalCount, 'totalCopies =', totalCopies); console.log('initSingleScroller: blockScrollWidth =', blockScrollWidth, 'totalScrollWidth =', rail.scrollWidth); + console.log('initSingleScroller: loopPoint =', loopPoint, '(will jump back at this position)'); /** * Один кадр анимации - плавный скролл. @@ -152,13 +157,13 @@ function initSingleScroller(wrapper, options = {}) { // Максимальный scrollLeft (конец контента) const maxScrollLeft = rail.scrollWidth - wrapper.clientWidth; - // Прыгаем когда прокрутили первый блок (оригиналы) + // Прыгаем в середине контента для максимально незаметного перехода // ИЛИ когда достигли конца контейнера (защита от застревания) - if (wrapper.scrollLeft >= blockScrollWidth || wrapper.scrollLeft >= maxScrollLeft - 5) { + if (wrapper.scrollLeft >= loopPoint || wrapper.scrollLeft >= maxScrollLeft - 5) { const oldScrollLeft = wrapper.scrollLeft; wrapper.scrollLeft = 0; accumulatedScroll = 0; - console.log('animate: SEAMLESS LOOP! jumped from', oldScrollLeft, 'to 0, blockScrollWidth =', blockScrollWidth, 'maxScrollLeft =', maxScrollLeft); + console.log('animate: SEAMLESS LOOP! jumped from', oldScrollLeft, 'to 0, loopPoint =', loopPoint, 'maxScrollLeft =', maxScrollLeft); } // Накапливаем дробные пиксели