Как сделать блок "Содержание" для материалов
- Зачем нужен скрипт блока "Содержание"?
- Как работает данное решение?
- Пошаговая инструкция по установке скрипта
В этой статье мы рассмотрим, как создать удобный блок "Содержание" для навигации по материалу, статье или новости. Этот блок содержит ссылки-якоря, ведущие к основным разделам текста.
Пример материала с блоком "Содержание"
Зачем нужен скрипт блока "Содержание"?
Блок "Содержание" позволяет пользователям быстро переходить к нужным разделам статьи, облегчая восприятие материала. В нем автоматически формируются ссылки на заголовки <h2> и <h3>, что обеспечивает удобство навигации.
Как работает данное решение?
Скрипт ищет заголовки в тексте материала (теги <h2> и <h3>) и создает из них блок навигации в виде списка. Каждому заголовку присваивается уникальный якорь, что позволяет пользователю легко перемещаться по тексту, кликая на элементы блока "Содержание".
Пошаговая инструкция по установке скрипта
1. Добавление скрипта в шаблон
Перейдите в Дизайн → Управление дизайном → Редактирование шаблонов → Страница материалов и комментариев к нему и перед тегом </body> добавьте следующий скрипт:
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", () => {
const headings = document.querySelectorAll('.eMessage h2, .eMessage h3');
const marker = document.getElementById('marker');
const markerRemove = document.getElementById('marker-remove');
if (headings.length > 0 && marker) {
headings.forEach(heading => {
const thisText = heading.textContent;
const hash = self.crypto.randomUUID();
// Создаем элемент якоря
const anchorLink = document.createElement('a');
anchorLink.name = hash;
heading.parentNode.insertBefore(anchorLink, heading);
// Создаем ссылку в списке
const listItem = document.createElement('a');
listItem.href = `#${hash}`;
listItem.textContent = thisText;
// Создаем элемент списка
const anchorItem = document.createElement('li');
anchorItem.appendChild(listItem);
// Добавляем ссылку в список маркеров
marker.appendChild(anchorItem);
});
// Удаляем класс u-hidden с content-wrapper
const contentWrapper = document.getElementById('contentwrapper');
if (contentWrapper) {
contentWrapper.classList.remove('u-hidden');
}
} else if (markerRemove) {
// Удаляем блок с маркером, если не найдены заголовки или маркер
markerRemove.remove();
}
});
</script>
.eMessage — это блок, внутри которого находится оператор $MESSAGE$. Если у вас используется другой класс, замените его название в скрипте.
2. Установка стилей для оформления блока
Добавьте следующий CSS-код в шаблон "Таблица стилей (CSS)":
#contentwrapper {
flex-grow: 1;
}
.contents-block:has(.e-cover-image) {
float: left;
}
.contents-block:has(#contentwrapper) {
float: none;
}
.contents-block:has(.e-cover-image):has(#contentwrapper) {
float: left;
margin-bottom: 30px;
width: 100%;
}
.contents-block:has(#contentwrapper.u-hidden) {
margin-right: 30px;
}
.contents {
color: var(--tpl-dark-800);
background-color: var(--tpl-dark-100);
}
.contents-block {
display: flex;
width: auto;
float: left;
gap: 30px;
}
.contents-secondary {
padding: 15px;
border: 1px solid transparent;
border-radius: 16px;
}
@media screen and (width < 1200px) {
.contents-block {
flex-wrap: wrap;
}
.contents-block:has(.e-cover-image):has(#contentwrapper) {
.e-cover-image {
margin: 0;
width: 100%;
}
}
}
3. Добавление кода для вывода блока "Содержание"
Чтобы отобразить блок "Содержание", добавьте следующий код в шаблон "Страница материалов и комментариев" модуля перед оператором $MESSAGE$:
<div class="contents-block"> <?if $COVER_IMAGE$?>$COVER_IMAGE$<?endif?> <div id="contentwrapper" class="u-hidden"> <div class="contents contents-secondary" id="marker-remove"> <p style="text-align:center; font-weight:bold; font-size:1.17em;">Содержание</p> <ol class="content-list" id="marker"></ol> </div> </div> </div>
После внесения всех изменений блок "Содержание" будет автоматически отображаться при наличии заголовков в тексте материала. Это существенно улучшит навигацию по вашим материалам и сделает их более удобными для пользователей.



