6395
редагувань
Admin (обговорення | внесок) Немає опису редагування |
Admin (обговорення | внесок) Немає опису редагування |
||
| Рядок 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 = | var max = getMaxScroll(); | ||
if (top < 0) top = 0; | |||
if (max > 0 && top > max) top = max; // клампимо ТІЛЬКИ якщо max адекватний | |||
return top; | |||
} | } | ||
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); | ||
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 (Math.abs(window.pageYOffset - start) < 2 && Math.abs(end - start) > 10) { | |||
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; | ||