debug: добавлено детальное логирование автоскроллера

- Логи до и после клонирования элементов
- Логи размеров: scrollWidth, clientWidth, copiesNeeded
- Логи количества элементов до и после клонирования
- Добавлена защита от застревания (прыжок при достижении конца)
- Логи прыжков с maxScrollLeft для диагностики
- Исправлена логика вычисления blockScrollWidth = rail.scrollWidth / totalCopies
This commit is contained in:
admin i 2025-12-05 11:08:32 +03:00
parent de5ca9e70f
commit e7e0f2c559

View File

@ -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);
}
// Накапливаем дробные пиксели