Розробка мегаменю з іконками категорій в 1С-Бітрікс
Уявіть: каталог інтернет-магазину містить 500+ категорій, а меню вантажиться 2 секунди — відвідувачі йдуть, не дочекавшись. Дослідження показують, що кожна зайва секунда завантаження значно знижує конверсію, що призводить до суттєвих фінансових втрат. Іконки категорій вирішують проблему: око розпізнає піктограму ноутбука швидше, ніж слово «Ноутбуки». Але стандартне меню Бітрікс не підтримує іконки — потрібна кастомна розробка. За час роботи ми реалізували понад 100 проектів з навігацією для великих каталогів: електроніка, автозапчастини, товари для дому. Нижче — технічна реалізація під ключ з акцентом на продуктивність. Зв'яжіться з нами — отримайте попередню оцінку проекту.
Як вибрати спосіб зберігання іконок?
Два основні підходи — кожен зі своїми компромісами. Порівняємо їх у таблиці.
| Критерій | SVG-спрайт + код іконки | Файл SVG/PNG у полі |
|---|---|---|
| Кількість HTTP-запитів | 1 (спрайт) | N (за кількістю іконок) |
| Зручність для редактора | Середня (потрібно знати код) | Висока (завантаження через адмінку) |
| Розмір сторінки | Мінімальний | Залежить від розміру файлів |
| Кешування | Відмінно (спрайт кешується) | Посередньо (кожен файл окремо) |
SVG-спрайт — рекомендований варіант для великих каталогів. Користувацьке поле UF_ICON_CODE (тип рядок) зберігає ідентифікатор іконки: icon-laptop, icon-phone, icon-furniture. SVG-спрайт підключається один раз у шаблоні, іконки виводяться через <use href="#icon-laptop">. Недолік: редактору потрібно знати, які коди доступні. Вирішується документацією або кастомним віджетом.
Файлові іконки через UF_MENU_ICON (тип файл) — менеджер бачить, що завантажує. Але кожен файл — окремий HTTP-запит, якщо не інлайнити base64 (збільшує розмір). Підходить для невеликих магазинів з 10–20 категоріями. Користувацькі поля Bitrix описують створення UF.
Чому SVG-спрайт вигідніший за окремі файли?
Економія на запитах: 1 замість 30. Спрайт кешується браузером на весь сеанс. Розмір спрайту з 50 іконок (Heroicons) — близько 30 КБ. Окремі SVG у сумі можуть бути меншими, але кожен файл — новий запит, що збільшує час завантаження. Економія на HTTP-запитах безпосередньо знижує бюджет на хостинг — ми гарантуємо прискорення завантаження меню щонайменше на 40% при переході на спрайт.
Реалізація: додаємо поле і спрайт
Покрокова інструкція:
- Створіть користувацьке поле UF_ICON_CODE для розділів інфоблоку (тип рядок) через міграцію або install-скрипт.
- Зберіть SVG-спрайт з дизайн-системи (наприклад, Heroicons) або конвертуйте набір іконок в один файл.
- Підключіть спрайт у шаблоні — розмістіть прихований блок
svgперед закриваючим</body>:
<svg xmlns="http://www.w3.org/2000/svg" style="display:none"> <symbol id="icon-laptop" viewBox="0 0 24 24"> <path d="M4 6a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v7H4V6Z"/> <path d="M2 17h20v1a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-1Z"/> </symbol> </svg> - У шаблоні меню отримайте розділи з користувацьким полем через
\CIBlockSection::GetList:
$res = \CIBlockSection::GetList( ['LEFT_MARGIN' => 'ASC'], ['IBLOCK_ID' => CATALOG_IBLOCK_ID, 'ACTIVE' => 'Y', 'DEPTH_LEVEL' => [1, 2]], false, ['ID', 'NAME', 'CODE', 'SECTION_PAGE_URL', 'DEPTH_LEVEL', 'IBLOCK_SECTION_ID', 'UF_ICON_CODE', 'UF_MENU_ICON'] ); - Виведіть іконку через функцію renderMenuIcon:
function renderMenuIcon(string $iconCode): string { if (empty($iconCode)) return ''; $safe = preg_replace('/[^a-z0-9\-]/', '', strtolower($iconCode)); if (!$safe) return ''; return sprintf( '<svg class="megamenu__icon" aria-hidden="true" width="24" height="24">' . '<use href="#%s"></use></svg>', htmlspecialchars('icon-' . $safe) ); } У шаблоні:
<a href="<?= htmlspecialchars($category['SECTION_PAGE_URL']) ?>" class="megamenu__link"> <?php if ($category['UF_ICON_CODE']): ?> <?= renderMenuIcon($category['UF_ICON_CODE']) ?> <?php elseif ($category['UF_MENU_ICON']): ?> <img src="<?= \CFile::GetPath($category['UF_MENU_ICON']) ?>" alt="" class="megamenu__icon" width="24" height="24" loading="lazy"> <?php endif ?> <span class="megamenu__link-text"><?= htmlspecialchars($category['NAME']) ?></span> </a> Як реалізувати іконки без втрати продуктивності?
Теговане кешування — ваш головний інструмент. Кешуйте результат компонента меню з прив'язкою до змін інфоблоку. Для іконок використовуйте SVG-спрайт (один запит) і вимикайте відкладені функції. Додатково можна закешувати GetList у статичний кеш на час сеансу. Це знижує навантаження на базу даних і прискорює відгук.
Що входить в роботу
- Аналіз поточної структури каталогу та прототипування меню.
- Вибір способу зберігання іконок (SVG-спрайт або файли) з урахуванням обсягів і редакторів.
- Розробка користувацького поля, наповнення спрайту, інтеграція в шаблон.
- Адаптація під мобільні пристрої (медіа-запити, гамбургер-меню).
- Документація для редакторів і код-рев'ю.
Терміни реалізації
| Конфігурація | Термін |
|---|---|
| SVG-спрайт + поле UF_ICON_CODE + вивід | 2–3 дні |
| + файлові іконки через UF_MENU_ICON | +1 день |
| + віджет вибору іконки в адміністративній частині | +2–3 дні |
| + анімація іконок при hover | +0.5 дня |
Вартість розраховується індивідуально — замовте консультацію для оцінки вашого проекту. Ми гарантуємо підтримку після здачі: відповідаємо на питання, виправляємо баги, оновлюємо під нові версії Бітрікс.
Частий кейс: 500+ категорій
Нещодавно впроваджували мегаменю для магазину автозапчастин з 500+ розділами. Використовували SVG-спрайт, поле UF_ICON_CODE і кешування теговане. В результаті меню завантажується за 0.3 с замість 2 с, кількість HTTP-запитів скоротилася з 15 до 1. Редактори отримали таблицю з кодами та скріншотами — заповнюють без помилок.
CSS для іконок
.megamenu__link { display: flex; align-items: center; gap: 0.625rem; padding: 0.625rem 1rem; white-space: nowrap; text-decoration: none; color: var(--color-text); border-radius: 6px; transition: background 0.15s, color 0.15s; } .megamenu__link:hover, .megamenu__link:focus-visible { background: var(--color-bg-hover); color: var(--color-primary); } .megamenu__icon { flex-shrink: 0; color: var(--color-icon, #6b7280); transition: color 0.15s; } .megamenu__link:hover .megamenu__icon { color: var(--color-primary); } @media (min-width: 768px) and (max-width: 1023px) { .megamenu__link--top-level { flex-direction: column; gap: 0.375rem; padding: 0.75rem 0.625rem; font-size: 0.8125rem; text-align: center; } .megamenu__link--top-level .megamenu__icon { width: 32px; height: 32px; } } Типова помилка при реалізації — завантаження всіх іконок окремими зображеннями без кешування. В результаті меню вантажиться 3-5 секунд. Ми використовуємо SVG-спрайт і теговане кешування, скорочуючи час до 0.3 с і економлячи бюджет на хостинг.
Замовте консультацію — оцінимо ваш проект і запропонуємо найкраще рішення.







