MediaWiki:Common.js: відмінності між версіями

нема опису редагування
Немає опису редагування
Немає опису редагування
Рядок 69: Рядок 69:
     }
     }


  function scrollToTarget(target) {
  function scrollToTarget(target) {
         var attempts = 0;
         isAnimating = true;


         function step() {
         if (target === 'top') {
             var top = getTargetTop(target);
            window.scrollTo({ top: 0, behavior: 'smooth' });
             if (top === null) { isAnimating = false; return; }
        } else {
 
             var el = getTargetEl(target);
             var diff = Math.abs(top - window.pageYOffset);
             if (!el) { isAnimating = false; return; }
 
             el.scrollIntoView({ behavior: 'smooth', block: 'start' });
            // Уже на місці
        }
            if (diff <= 3) { isAnimating = false; return; }


            // Захист від нескінченного циклу
        // Знімаємо прапорець, коли прокрутка зупинилась
             if (attempts >= 4) {
        var timer = null;
                 window.scrollTo(0, Math.max(0, top));
        function onScroll() {
             clearTimeout(timer);
            timer = setTimeout(function () {
                 window.removeEventListener('scroll', onScroll);
                 isAnimating = false;
                 isAnimating = false;
                 return;
                 updateActive();
            }
             }, 120);
 
            attempts++;
            var duration = (attempts === 1) ? 280 : 90;
 
             $('html, body').stop(true, false).animate(
                { scrollTop: Math.max(0, top) },
                duration,
                function () {
                    // Даємо layout усістися, потім перевіряємо ще раз
                    setTimeout(step, 30);
                }
            );
         }
         }
 
         window.addEventListener('scroll', onScroll, { passive: true });
         isAnimating = true;
         onScroll(); // на випадок, якщо сторінка вже на місці й скролу не буде
         step();
     }
     }