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

нема опису редагування
Немає опису редагування
Немає опису редагування
 
Рядок 60: Рядок 60:
         var $heading = $(el).closest('h1, h2, h3, h4');
         var $heading = $(el).closest('h1, h2, h3, h4');
         return $heading.length ? $heading[0] : el;
         return $heading.length ? $heading[0] : el;
    }
  function getMaxScroll() {
        var h = Math.max(
            document.body.scrollHeight || 0,
            document.body.offsetHeight || 0,
            document.documentElement.scrollHeight || 0,
            document.documentElement.offsetHeight || 0
        );
        return Math.max(0, h - window.innerHeight);
     }
     }


Рядок 66: Рядок 76:
         var el = getTargetEl(target);
         var el = getTargetEl(target);
         if (!el) return null;
         if (!el) return null;
         var top = el.getBoundingClientRect().top + window.pageYOffset - HEADER_OFFSET;
         var top = el.getBoundingClientRect().top + window.pageYOffset - HEADER_OFFSET;
         var max = Math.max(0, document.documentElement.scrollHeight - window.innerHeight);
         var max = getMaxScroll();
         return Math.max(0, Math.min(top, max));
 
        if (top < 0) top = 0;
         if (max > 0 && top > max) top = max;  // клампимо ТІЛЬКИ якщо max адекватний
        return top;
     }
     }
    function easeOutCubic(t) { return 1 - Math.pow(1 - t, 3); }


     function scrollToTarget(target) {
     function scrollToTarget(target) {
        // Перериваємо попередню анімацію, якщо вона ще йде
         if (rafId) { cancelAnimationFrame(rafId); rafId = null; }
         if (rafId) { cancelAnimationFrame(rafId); rafId = null; }


Рядок 80: Рядок 91:
         var end = getTargetTop(target);
         var end = getTargetTop(target);
         if (end === null) return;
         if (end === null) return;
         if (Math.abs(end - start) < 2) return;
         if (Math.abs(end - start) < 2) return;


Рядок 90: Рядок 100:
             var t = Math.min(1, (now - startTime) / DURATION);
             var t = Math.min(1, (now - startTime) / DURATION);


            // Переміряємо ціль щокадру — layout міг зсунутись
             var currentEnd = getTargetTop(target);
             var currentEnd = getTargetTop(target);
             if (currentEnd === null) currentEnd = end;
             if (currentEnd === null) currentEnd = end;
Рядок 100: Рядок 109:
             } else {
             } else {
                 rafId = null;
                 rafId = null;
                 // Фінальна корекція, якщо контент зсунувся під час руху
 
                 var finalTop = getTargetTop(target);
                 // Якщо документ узагалі не зрушив — віддаємо прокрутку браузеру
                if (finalTop !== null && Math.abs(finalTop - window.pageYOffset) > 3) {
                if (Math.abs(window.pageYOffset - start) < 2 && Math.abs(end - start) > 10) {
                    window.scrollTo(0, finalTop);
                    var el = getTargetEl(target);
                    if (el) el.scrollIntoView({ block: 'start' });
                    else window.scrollTo(0, 0);
                 } else {
                    var finalTop = getTargetTop(target);
                    if (finalTop !== null && Math.abs(finalTop - window.pageYOffset) > 3) {
                        window.scrollTo(0, finalTop);
                    }
                 }
                 }
                 suppressSpyUntil = Date.now() + 100;
                 suppressSpyUntil = Date.now() + 100;