From e7e0f2c559028e80cb25f42c9bae102a11973f24 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:08:32 +0300 Subject: [PATCH] =?UTF-8?q?debug:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B4=D0=B5=D1=82=D0=B0=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B5=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B0=D0=B2=D1=82=D0=BE=D1=81=D0=BA=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D0=BB=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Логи до и после клонирования элементов - Логи размеров: scrollWidth, clientWidth, copiesNeeded - Логи количества элементов до и после клонирования - Добавлена защита от застревания (прыжок при достижении конца) - Логи прыжков с maxScrollLeft для диагностики - Исправлена логика вычисления blockScrollWidth = rail.scrollWidth / totalCopies --- .../js/components/autoScrollerHandler.js | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/backend/static/js/components/autoScrollerHandler.js b/backend/static/js/components/autoScrollerHandler.js index 498a886c..fff38863 100644 --- a/backend/static/js/components/autoScrollerHandler.js +++ b/backend/static/js/components/autoScrollerHandler.js @@ -86,10 +86,17 @@ function initSingleScroller(wrapper, options = {}) { const originalScrollWidth = rail.scrollWidth; const minScrollWidth = wrapper.clientWidth * 3; // Минимум 3 экрана контента + console.log('initSingleScroller: BEFORE cloning - originalChildren.length =', originalChildren.length); + console.log('initSingleScroller: BEFORE cloning - originalScrollWidth =', originalScrollWidth); + console.log('initSingleScroller: BEFORE cloning - wrapper.clientWidth =', wrapper.clientWidth); + console.log('initSingleScroller: BEFORE cloning - minScrollWidth =', minScrollWidth); + // Вычисляем сколько копий нужно создать let copiesNeeded = Math.ceil(minScrollWidth / originalScrollWidth); copiesNeeded = Math.max(2, copiesNeeded); // Минимум 2 копии (оригинал + 1 клон) + console.log('initSingleScroller: copiesNeeded =', copiesNeeded); + // Создаем копии const allClones = []; for (let i = 0; i < copiesNeeded; i++) { @@ -99,6 +106,8 @@ function initSingleScroller(wrapper, options = {}) { } console.log('initSingleScroller: created', copiesNeeded, 'copies,', allClones.length, 'total cloned items'); + console.log('initSingleScroller: AFTER cloning - rail.children.length =', rail.children.length); + console.log('initSingleScroller: AFTER cloning - rail.scrollWidth =', rail.scrollWidth); // Пересчитываем overflow после клонирования const hasOverflowAfterClone = rail.scrollWidth > wrapper.clientWidth + 4; @@ -114,11 +123,17 @@ function initSingleScroller(wrapper, options = {}) { // Состояние let scrollStep = computeScrollStep(rail); const originalCount = originalChildren.length; + const totalCopies = copiesNeeded + 1; // +1 потому что есть оригиналы + копии + + // Вычисляем точную ширину блока после рендеринга + const blockScrollWidth = rail.scrollWidth / totalCopies; + let animationFrame = null; let paused = false; let resizeFrame = null; - console.log('initSingleScroller: scrollStep =', scrollStep, 'originalCount =', originalCount); + console.log('initSingleScroller: scrollStep =', scrollStep, 'originalCount =', originalCount, 'totalCopies =', totalCopies); + console.log('initSingleScroller: blockScrollWidth =', blockScrollWidth, 'totalScrollWidth =', rail.scrollWidth); /** * Один кадр анимации - плавный скролл. @@ -134,13 +149,16 @@ function initSingleScroller(wrapper, options = {}) { frameCount++; - const maxScroll = scrollStep * originalCount; + // Максимальный scrollLeft (конец контента) + const maxScrollLeft = rail.scrollWidth - wrapper.clientWidth; - // Если достигли конца первой копии - прыгаем в начало - if (wrapper.scrollLeft >= maxScroll - 2) { + // Прыгаем когда прокрутили первый блок (оригиналы) + // ИЛИ когда достигли конца контейнера (защита от застревания) + if (wrapper.scrollLeft >= blockScrollWidth || wrapper.scrollLeft >= maxScrollLeft - 5) { + const oldScrollLeft = wrapper.scrollLeft; wrapper.scrollLeft = 0; accumulatedScroll = 0; - console.log('animate: reset to start, maxScroll =', maxScroll); + console.log('animate: SEAMLESS LOOP! jumped from', oldScrollLeft, 'to 0, blockScrollWidth =', blockScrollWidth, 'maxScrollLeft =', maxScrollLeft); } // Накапливаем дробные пиксели