[ Оставить заявку ]
Обсудить проект
[ Оставить заявку ]
Записаться на встречу

Фиксация меню в Тильде: прилипание и отлипание при скролле

Коротко: скрипт делает меню с классом .uc-scroll фиксированным у верхнего края окна, когда оно доходит до него, и возвращает обратно в поток при скролле вверх. Работает без дёрганья контента.
<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>
Сохрани вкладку в избранном, чтоб не потерять
Помог код?
Что еще есть полезного:
    СВЯЖИТЕСЬ С НАМИ В ЛЮБОМ МЕССЕНДЖЕРЕ
    Основное
    Мы на связи с понедельника по пятницу с 10:00 до 18:00 по МСК
    ИНФОРМАЦИЯ
    ИНН: 644910511905
    Политика конфиденциальности
    2025, KETE DESIGN AGENCY – создание сайтов на Tilda