Навігація по сторінці
В Albireo є корисние поле для формування списку із заголовків поточної сторінки, що полегшує навігацію у статті, особливо, якщо вона структурована і достатньо довга.
Стандартний підхід
З коробки, Albireo пропонує підключення сніппету, який, по суті, є нічим іншим, як скриптом JS, для підключення до будь-якої сторінки. Результатом, згідно довідника, буде формування навігації з html-тегів другого рівня <h2>
поточної сторінки, оформлене в три колонки.
<div class="article_navigation"></div> <?= snippet('article-navigation-flat') ?>
Варіації стандарту
Можна змінювати ім'я адженди в сніпеті, або додати 'h2,h3'
як параметр, що логічно додасть теги <h3>
до списку (не пам'ятаю, чи це документовано саме так, але воно спрацьовує).
<div class="article_navigation"></div> <?= snippet('article-navigation-flat', 'h2,h3', 'Навігація по тегах h2,h3') ?>
Результат виглядатиме так:
Звісно, це треба розміщувати на початку статті, або оформити на свій смак де-інде.
Нестандартний підхід
Чи достатньо коробочного виводу - кожен вирішує сам, але ми спробували трохи погратись на таку тему й створити древовидну структуру списків, які візуалізують ієрархію. Хочу зауважити, що наведений нижче код написаний без підглядання до авторського стандартного, тому критика має бути напралена виключно на автора статті.
Одинарний список <h2>
Це виведе список по тегу 'h2'
, але, на відміну від авторського - в один стовпчик.
<ul class="height" id="h2-list"></ul> <script> document.addEventListener('DOMContentLoaded', function () { // Знаходимо всі елементи <h2> const h2Elements = document.querySelectorAll('h2'); const ulElement = document.getElementById('h2-list'); // Перетворюємо NodeList у масив та перебираємо кожен заголовок h2Elements.forEach((h2, index) => { // Додаємо унікальний id для кожного <h2> const id = `section${index + 1}`; h2.setAttribute('id', id); // Створюємо елемент <li> зі посиланням <a> const li = document.createElement('li'); const anchor = document.createElement('a'); // Створюємо текст і посилання для анкора anchor.textContent = h2.textContent; anchor.href = `#${id}`; // Додаємо посилання до <li> і <li> до <ul> li.appendChild(anchor); ulElement.appendChild(li); } }); </script>
Одинарні списки <h2> та <h3>
Наступний скрипт - звичайний розвиток попереднього, але з виводом окремих списків для кожного тега. Практичну потребу в такому варіанті уявити важкувато, тому його код ми наводити не будемо, хоча результат продемонструємо:
Комбіновані списки з <h2> та <h3>
Скрипт генерації древовидної структури сторінки, зформованої по тегах заголовків на льоту. Виводиться одним блоком, до того ж він працюватиме й за межами Albireo.
<ul id="toc-list"></ul> <script> document.addEventListener('DOMContentLoaded', function () { // Знаходимо всі елементи <h2> та <h3> const headings = document.querySelectorAll('h2, h3'); const ulElement = document.getElementById('toc-list'); let currentUl = ulElement; headings.forEach((heading, index) => { // Створюємо унікальний id для кожного заголовка const id = `section${index + 1}`; heading.setAttribute('id', id); // Створюємо елемент <li> зі посиланням <a> const li = document.createElement('li'); const anchor = document.createElement('a'); anchor.textContent = heading.textContent; anchor.href = `#${id}`; // Додаємо посилання до <li> li.appendChild(anchor); // Якщо це <h2>, додаємо його в основний список if (heading.tagName.toLowerCase() === 'h2') { ulElement.appendChild(li); // Створюємо новий підсписок для <h3>, якщо він з'явиться currentUl = document.createElement('ul'); li.appendChild(currentUl); } else if (heading.tagName.toLowerCase() === 'h3') { // Якщо це <h3>, додаємо його у підсписок до поточного <h2> currentUl.appendChild(li); } } }); </script>
На виході отримаємо більш логічну древовидну структуру заголовків такого плану:
Таке уже можна додавати до свого проекту в теку albireo/website/templates/default/assets/js наприклад, під назвою htree.js
, або у вигляді сніппета. Після чого, не забудьте його підключити разом з іншими полями в коді PHP отак: js.lazy[]: htree.js
. Головне, - ці скрипти мають розміщуватися в кінці розмітки, перед закриваючим /body
, щоби DOM встиг завантажитись повністю. Порівняйте результат зі стандартним на початку статті та виберіть варіант, який вам до вподоби.
Ну й на цьому все сьогодні.