<script>
(function() {
var menu = document.querySelector('.uc-scroll');
if (!menu) return;
var isFixed = false;
var placeholder = null;
var originalOffsetTop = 0; // запомненное расстояние от верха документа до меню
var originalStyles = {};
// Обновляет запомненную позицию (только когда меню не зафиксировано)
function updateOriginalOffset() {
if (!isFixed) {
originalOffsetTop = menu.getBoundingClientRect().top + window.scrollY;
}
}
function getWidth() { return menu.offsetWidth; }
function getHeight() { return menu.offsetHeight; }
function fix() {
if (isFixed) return;
// Сохраняем исходные стили
originalStyles.position = menu.style.position;
originalStyles.top = menu.style.top;
originalStyles.left = menu.style.left;
originalStyles.width = menu.style.width;
originalStyles.zIndex = menu.style.zIndex;
var width = getWidth();
var height = getHeight();
// Создаём блок-заполнитель, чтобы контент не дёргался
placeholder = document.createElement('div');
placeholder.style.width = width + 'px';
placeholder.style.height = height + 'px';
var menuStyle = window.getComputedStyle(menu);
placeholder.style.margin = menuStyle.margin;
placeholder.style.padding = menuStyle.padding;
placeholder.style.boxSizing = menuStyle.boxSizing;
menu.parentNode.insertBefore(placeholder, menu);
// Фиксируем меню
menu.style.position = 'fixed';
menu.style.top = '0';
menu.style.left = '0';
menu.style.width = width + 'px';
menu.style.zIndex = '1000';
isFixed = true;
}
function unfix() {
if (!isFixed) return;
if (placeholder && placeholder.parentNode) {
placeholder.parentNode.removeChild(placeholder);
}
menu.style.position = originalStyles.position || '';
menu.style.top = originalStyles.top || '';
menu.style.left = originalStyles.left || '';
menu.style.width = originalStyles.width || '';
menu.style.zIndex = originalStyles.zIndex || '';
isFixed = false;
placeholder = null;
}
function onScroll() {
if (!isFixed && window.scrollY >= originalOffsetTop) {
fix();
} else if (isFixed && window.scrollY < originalOffsetTop) {
unfix();
}
}
function onResize() {
if (isFixed) {
// Меню зафиксировано — обновляем ширину заполнителя и самого меню
var newWidth = getWidth();
var newHeight = getHeight();
if (placeholder) {
placeholder.style.width = newWidth + 'px';
placeholder.style.height = newHeight + 'px';
}
menu.style.width = newWidth + 'px';
} else {
// Меню не зафиксировано — пересчитываем его позицию (актуально при ресайзе)
updateOriginalOffset();
// Дополнительно проверяем, не пора ли зафиксировать после изменения размеров
if (window.scrollY >= originalOffsetTop) {
fix();
}
}
}
// Инициализация
updateOriginalOffset();
window.addEventListener('scroll', onScroll);
window.addEventListener('resize', onResize);
onScroll(); // первая проверка
})();
</script>