Telegram
Будьте в курсе всех обновлений: подпишитесь на наш официальный Telegram-канал uCoz и задавайте вопросы в чате сообщества!

Как сделать блок "Содержание" для материалов

Как сделать блок "Содержание" для материалов
Материал добавлен: 09 Июля 2024
Материал обновлен: 05 Июня 2025
  1. Зачем нужен скрипт блока "Содержание"?
  2. Как работает данное решение?
  3. Пошаговая инструкция по установке скрипта

В этой статье мы рассмотрим, как создать удобный блок "Содержание" для навигации по материалу, статье или новости. Этот блок содержит ссылки-якоря, ведущие к основным разделам текста.

Пример блока 'Содержание'

Пример материала с блоком "Содержание"

Зачем нужен скрипт блока "Содержание"?

Блок "Содержание" позволяет пользователям быстро переходить к нужным разделам статьи, облегчая восприятие материала. В нем автоматически формируются ссылки на заголовки <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>

Пример добавления скрипта

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>

Пример блока 'Содержание' в шаблоне

После внесения всех изменений блок "Содержание" будет автоматически отображаться при наличии заголовков в тексте материала. Это существенно улучшит навигацию по вашим материалам и сделает их более удобными для пользователей.

Как сделать блок "Содержание" для материалов