Yandex Metrika
sanches.free

Широкое горизонтальное меню: авто-свёртка пунктов под «ещё», чтобы не выходило за строку навигации

Разбор задачи

Разметка содержит список элементов основного меню и отдельный контейнер overflow. После каждого resize измеряют доступную строку клиентской шириной родителя минус боковые отступы и по порядку прячут элементы начиная с конца строки до тех пор, пока сумма fit ≤ лимита.

function packMainNav(navRoot) {
  const lane = navRoot.querySelector('[data-slot=lane]');
  const extra = navRoot.querySelector('[data-slot=overflow]');
  const items = [...lane.children];
  items.forEach((li) => li.classList.remove('is-hidden'));
  extra.innerHTML = '';

  while (lane.scrollWidth > lane.clientWidth && items.length > 1) {
    const last = items.pop();
    last.classList.add('is-hidden');
    extra.prepend(last);
  }
}
window.addEventListener('resize', () => packMainNav(document.getElementById('main-nav-bar')));
window.addEventListener('DOMContentLoaded', () => packMainNav(document.getElementById('main-nav-bar')));

Для производительности debounce событие resize тем же requestAnimationFrame, чтобы не множить расчёт на мобильных при повороте экрана.

Замечания перед выкладкой

Вносите правки только через среду с бэкапом и понятным diff. Если сниппет идёт в шаблон на Битрикс, проверьте конфликт с уже подключённым jQuery/UI и включите «отложенный» запуск там, где длинный главный файл может обрезать DOMContentLoaded.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии