Автоматическое оглавление для сайта: Заставьте заголовки работать на вас
Или: Почему ваши читатели путаются в длинных текстах и как JS-скрипт может стать их навигатором
Представьте: вы заходите на сайт, находите полезную статью на 15 000 знаков, начинаете читать... и через пять минут понимаете, что уже не помните, о чём было в начале, и не знаете, где искать нужный раздел.
Знакомо?
В 2026 году средняя длина текста в топе поисковой выдачи выросла на 40% . Люди пишут подробнее, стараются ответить на все вопросы сразу. Но читатель не становится усидчивее. Он хочет быстро найти то, зачем пришёл, и уйти.
Оглавление (Table of Contents) — это не просто «красивая фишка». Это:
Хорошая новость: вам не нужно ничего ставить со стороны. Всё, что нужно — правильно расставить заголовки в статье и подключить один скрипт.
Заголовки — это дорожные указатели. Человек скроллит страницу, видит H2, H3, H4 и понимает:
Без заголовков текст превращается в кирпичную стену. Читатель либо продирается сквозь неё, либо уходит.
Яндекс и Google любят структуру. Они смотрят на заголовки, чтобы понять:
Правильная иерархия заголовков = +5% к шансу попасть в топ.
Попробуйте написать статью без плана. Получится каша. Заголовки заставляют вас думать:
Вывод: Заголовки нужны всем. Но просто заголовков мало. Нужно оглавление, которое соберёт их в единую навигацию.
Мы написали небольшой jаvascript-скрипт, который:
Всё это работает на стороне браузера. Никакого PHP, никакой нагрузки на сервер, никаких проблем с кэшированием. Просто вставили код — и забыли.
Если у вас сайт на DLE, но вы не хотите редактировать шаблоны глубоко — можно вставить всё сразу в fullstory.tpl.
Шаг 1. В нужном месте шаблона (там, где хотите видеть оглавление) вставьте:
Шаг 2. Найдите тег {full-story} и оберните его в div с классом:
Шаг 3. В самый низ файла fullstory.tpl добавьте:
Шаг 4. Создайте файл /templates/ваш_шаблон/custom/fullstory/tcse4toc.tpl и скопируйте туда содержимое стилей и скрипта (весь код, который я дал выше).
✅ Плюсы: Всё в одном месте, легко править.
❌ Минусы: Код дублируется в каждой странице, чуть медленнее загрузка.
Этот вариант — профессиональный. Стили выносятся в общий CSS-файл, скрипт — в общий JS-файл. В шаблоне остаётся только разметка.
Шаг 1. В ваш основной файл стилей (style.css) добавьте весь блок стилей из моего кода.
Шаг 2. В ваш основной файл скриптов (script.js) добавьте весь JS-код.
Шаг 3. В fullstory.tpl:
✅ Плюсы:
❌ Минусы:
Если вам не нужна кнопка «Свернуть/Развернуть», можно упростить стили и убрать обработчик клика. Но я рекомендую оставить как есть — пользователи любят управлять интерфейсом.
Скрипт не просто выводит заголовки списком. Он строит иерархию:
1.1. Подраздел (H3)
1.2. Ещё подраздел (H3)
Нумерация автоматическая, сбрасывается на каждом уровне.
По умолчанию оглавление видно полностью. Но если места мало, можно кликнуть на заголовок — блок свернётся в компактную кнопку. Это удобно на мобильных.
На телефонах отступы уменьшаются, шрифт становится чуть меньше, но структура сохраняется. Всё читаемо.
Если у пользователя в системе включён тёмный режим, скрипт автоматически подстроит цвета. Без дополнительных усилий.
При печати страницы оглавление остаётся (в отличие от многих плагинов) и даже нумерация сохраняется. Полезно, если кто-то захочет сохранить статью в PDF.
Допустим, у вас есть статья с такой структурой:
Скрипт превратит это в:
📖 Содержание ▼
1. Как выбрать хостинг
1.1. Критерий 1: Скорость
1.2. Критерий 2: Цена
2. Как перенести сайт
При клике на «1.2. Критерий 2: Цена» страница плавно прокручивается к этому заголовку. В адресной строке появляется якорь #tcse4toc-h3-1-2, которым можно поделиться.
Обратная сторона: Если статья короткая (до 1000 знаков) и имеет 1-2 заголовка — оглавление не нужно. Оно будет выглядеть глупо.
Скрипт проверяет: если у заголовка уже есть id, он использует его. Если нет — генерирует свой. Так что существующие якоря не сломаются.
Скрипт пропускает заголовки без текста. Не переживайте.
Скрипт игнорирует H1 по умолчанию. Обычно H1 — это заголовок самой статьи, его не включают в оглавление. Если нужно — можете поправить конфигурацию.
Скрипт использует современный jаvascript (ES6), но все основные браузеры (Chrome, Firefox, Safari, Edge последних 3 лет) поддерживают его. На древнем IE работать не будет. Но у кого сейчас IE?
Внедрение оглавления занимает 10-15 минут даже у новичка. Эффект:
Что делать прямо сейчас:
1. Скопируйте код стилей и скрипта.
2. Выберите один из трёх способов внедрения.
P.S.
Главное — не забывайте сами структурировать статьи. Скрипт лишь показывает то, что вы написали. Если заголовки кривые — и оглавление будет кривым.
Удачи в навигации! 🧭
/templates/ВАШ_шаблон/js/tcse4toc.js
🧭 Пролог: Читатель устал. Помогите ему не заблудиться
Представьте: вы заходите на сайт, находите полезную статью на 15 000 знаков, начинаете читать... и через пять минут понимаете, что уже не помните, о чём было в начале, и не знаете, где искать нужный раздел.
Знакомо?
В 2026 году средняя длина текста в топе поисковой выдачи выросла на 40% . Люди пишут подробнее, стараются ответить на все вопросы сразу. Но читатель не становится усидчивее. Он хочет быстро найти то, зачем пришёл, и уйти.
Оглавление (Table of Contents) — это не просто «красивая фишка». Это:
- Навигация для тех, кто ищет конкретный ответ
- Структура для тех, кто хочет понять логику статьи
- SEO-плюшка для поисковиков (якорные ссылки, быстрые переходы)
- Удержание для тех, кто боится потеряться
Хорошая новость: вам не нужно ничего ставить со стороны. Всё, что нужно — правильно расставить заголовки в статье и подключить один скрипт.
📚 Акт 1: Зачем вообще нужны заголовки (кроме красоты)
1.1. Для читателя — карта текста
Заголовки — это дорожные указатели. Человек скроллит страницу, видит H2, H3, H4 и понимает:
- «Ага, тут про установку, а тут — про настройку»
- «Это мне не нужно, пропускаю»
- «Вот это как раз то, что я искал»
Без заголовков текст превращается в кирпичную стену. Читатель либо продирается сквозь неё, либо уходит.
1.2. Для поисковиков — иерархия смыслов
Яндекс и Google любят структуру. Они смотрят на заголовки, чтобы понять:
- Какая тема главная (H1)
- Какие подтемы раскрываются (H2, H3)
- Насколько логично построен текст
Правильная иерархия заголовков = +5% к шансу попасть в топ.
1.3. Для самого автора — дисциплина мышления
Попробуйте написать статью без плана. Получится каша. Заголовки заставляют вас думать:
- «А что я хочу сказать в этом разделе?»
- «Не повторяю ли я сам себя?»
- «Не слишком ли я углубился?»
Вывод: Заголовки нужны всем. Но просто заголовков мало. Нужно оглавление, которое соберёт их в единую навигацию.
🔧 Акт 2: Как это работает (для тех, кому неинтересно — можно пропустить)
Мы написали небольшой jаvascript-скрипт, который:
- Находит все заголовки H2, H3, H4 внутри вашей статьи
- Генерирует им уникальные ID (если их нет), чтобы на них можно было ссылаться
- Строит древовидное оглавление с учётом вложенности
- Вставляет этот блок в нужное место страницы
- Добавляет плавный скролл — при клике на пункт читатель перемещается к нужному месту
Всё это работает на стороне браузера. Никакого PHP, никакой нагрузки на сервер, никаких проблем с кэшированием. Просто вставили код — и забыли.
🎨 Акт 3: Три способа внедрения (выбирайте свой)
Вариант 1. Быстрый старт (для тех, кто не хочет копаться в шаблонах)
Если у вас сайт на DLE, но вы не хотите редактировать шаблоны глубоко — можно вставить всё сразу в fullstory.tpl.
Шаг 1. В нужном месте шаблона (там, где хотите видеть оглавление) вставьте:
html
<!-- Контейнер для оглавления -->
<div id="tcse4toc-container"></div>
Шаг 2. Найдите тег {full-story} и оберните его в div с классом:
html
<div class="tcse4toc-article">
{full-story}
</div>
Шаг 3. В самый низ файла fullstory.tpl добавьте:
html
{include file="custom/fullstory/tcse4toc.tpl"}
Шаг 4. Создайте файл /templates/ваш_шаблон/custom/fullstory/tcse4toc.tpl и скопируйте туда содержимое стилей и скрипта (весь код, который я дал выше).
✅ Плюсы: Всё в одном месте, легко править.
❌ Минусы: Код дублируется в каждой странице, чуть медленнее загрузка.
Вариант 2. Правильный (для тех, кто дружит с CSS и JS)
Этот вариант — профессиональный. Стили выносятся в общий CSS-файл, скрипт — в общий JS-файл. В шаблоне остаётся только разметка.
Шаг 1. В ваш основной файл стилей (style.css) добавьте весь блок стилей из моего кода.
Шаг 2. В ваш основной файл скриптов (script.js) добавьте весь JS-код.
Шаг 3. В fullstory.tpl:
- Оберните {full-story} в
<div class="tcse4toc-article"> - Вставьте
в нужное место<div id="tcse4toc-container"></div>
✅ Плюсы:
- Скрипт и стили загружаются один раз на весь сайт
- Легче обновлять
- Меньше кода в шаблоне
❌ Минусы:
- Нужно иметь доступ к основным файлам
- Чуть сложнее настройка для новичков
Вариант 3. Минимальный (для тех, кто хочет только навигацию, без сворачивания)
Если вам не нужна кнопка «Свернуть/Развернуть», можно упростить стили и убрать обработчик клика. Но я рекомендую оставить как есть — пользователи любят управлять интерфейсом.
🧩 Акт 4: Что умеет этот скрипт (особенности)
4.1. Правильная нумерация
Скрипт не просто выводит заголовки списком. Он строит иерархию:
- Первый раздел (H2)
1.1. Подраздел (H3)
1.2. Ещё подраздел (H3)
- Второй раздел (H2)
Нумерация автоматическая, сбрасывается на каждом уровне.
4.2. Сворачивание/разворачивание
По умолчанию оглавление видно полностью. Но если места мало, можно кликнуть на заголовок — блок свернётся в компактную кнопку. Это удобно на мобильных.
4.3. Адаптивность
На телефонах отступы уменьшаются, шрифт становится чуть меньше, но структура сохраняется. Всё читаемо.
4.4. Тёмная тема
Если у пользователя в системе включён тёмный режим, скрипт автоматически подстроит цвета. Без дополнительных усилий.
4.5. Печать
При печати страницы оглавление остаётся (в отличие от многих плагинов) и даже нумерация сохраняется. Полезно, если кто-то захочет сохранить статью в PDF.
💡 Акт 5: Пример работы (как это выглядит)
Допустим, у вас есть статья с такой структурой:
html
<h2>Как выбрать хостинг</h2>
<p>Текст про выбор...</p>
<h3>Критерий 1: Скорость</h3>
<p>Текст про скорость...</p>
<h3>Критерий 2: Цена</h3>
<p>Текст про цену...</p>
<h4>Акции и скидки</h4>
<p>Текст про акции...</p>
<h2>Как перенести сайт</h2>
<p>Текст про перенос...</p>
Скрипт превратит это в:
📖 Содержание ▼
1. Как выбрать хостинг
1.1. Критерий 1: Скорость
1.2. Критерий 2: Цена
2. Как перенести сайт
При клике на «1.2. Критерий 2: Цена» страница плавно прокручивается к этому заголовку. В адресной строке появляется якорь #tcse4toc-h3-1-2, которым можно поделиться.
🎯 Акт 6: Для каких сайтов это особенно полезно
| Тип сайта | Зачем им оглавление |
| Блоги, статьи, новости | Читатели могут быстро перейти к интересующей части |
| Интернет-магазины | В описаниях товаров — к характеристикам, доставке, отзывам |
| Документация, мануалы | Пошаговые инструкции без оглавления — мучение |
| Образовательные порталы | Студенты ищут конкретные темы |
| Корпоративные сайты | Длинные страницы «О компании» с историей и миссией |
Обратная сторона: Если статья короткая (до 1000 знаков) и имеет 1-2 заголовка — оглавление не нужно. Оно будет выглядеть глупо.
⚠️ Акт 7: Технические тонкости
7.1. Что если заголовки уже имеют ID?
Скрипт проверяет: если у заголовка уже есть id, он использует его. Если нет — генерирует свой. Так что существующие якоря не сломаются.
7.2. Что если заголовки пустые?
Скрипт пропускает заголовки без текста. Не переживайте.
7.3. А если у меня H1 внутри статьи?
Скрипт игнорирует H1 по умолчанию. Обычно H1 — это заголовок самой статьи, его не включают в оглавление. Если нужно — можете поправить конфигурацию.
7.4. Совместимость с браузерами
Скрипт использует современный jаvascript (ES6), но все основные браузеры (Chrome, Firefox, Safari, Edge последних 3 лет) поддерживают его. На древнем IE работать не будет. Но у кого сейчас IE?
🚀 Эпилог: Сделайте это сегодня
Внедрение оглавления занимает 10-15 минут даже у новичка. Эффект:
- Читатели дольше остаются на сайте
- Показатель отказов снижается
- Поисковики видят структуру
- Вы выглядите профессионально
Что делать прямо сейчас:
1. Скопируйте код стилей и скрипта.
2. Выберите один из трёх способов внедрения.
- Скопируйте код стилей и скрипта.
- Выберите один из трёх способов внедрения.
- Проверьте на тестовой статье.
- Радуйтесь, когда читатели скажут «О, как удобно!».
P.S.
Главное — не забывайте сами структурировать статьи. Скрипт лишь показывает то, что вы написали. Если заголовки кривые — и оглавление будет кривым.
Удачи в навигации! 🧭
Стили и скрипты для добавления в свои шаблоны
Стили спойлера реализованного через теги DL
<style>
/* TCSE4TOC Plugin Styles */
[tcse4toc-version] {
/* Версионный маркер */
}
/* Основной блок оглавления */
.tcse4toc-block {
margin-bottom: 25px;
border: 1px solid #e9ecef;
border-radius: 8px;
overflow: hidden;
background: #ffffff;
box-shadow: 0 2px 8px rgba(0,0,0,0.03);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
/* Заголовок оглавления (dt) */
.tcse4toc-header {
padding: 14px 18px;
background: linear-gradient(to bottom, #f8f9fa, #f1f3f5);
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
font-weight: 600;
font-size: 1.1rem;
color: #212529;
border-bottom: 2px solid transparent;
transition: all 0.25s ease;
user-select: none;
margin: 0; /* Сброс для dl */
}
.tcse4toc-header:hover {
background: linear-gradient(to bottom, #e9ecef, #dee2e6);
border-bottom-color: #0d6efd;
}
/* Заголовок в развернутом состоянии */
.tcse4toc-header[aria-expanded="true"] {
border-bottom-color: #0d6efd;
background: linear-gradient(to bottom, #e9ecef, #dee2e6);
}
/* Иконка сворачивания/разворачивания */
.tcse4toc-icon {
display: inline-block;
width: 24px;
height: 24px;
line-height: 24px;
text-align: center;
background: rgba(0,0,0,0.05);
border-radius: 50%;
font-size: 14px;
color: #495057;
transition: all 0.3s ease;
}
.tcse4toc-header:hover .tcse4toc-icon {
background: rgba(0,0,0,0.1);
color: #0d6efd;
}
/* Контент оглавления (dd) */
.tcse4toc-content {
padding: 16px 20px;
background: #ffffff;
transition: all 0.3s ease;
}
/* Скрытое состояние */
.tcse4toc-content[aria-hidden="true"] {
display: none;
}
/* Список оглавления */
.tcse4toc-list {
margin: 0;
padding-left: 0;
list-style: none;
counter-reset: toc-h2;
}
/* Элементы списка */
.tcse4toc-item {
margin-bottom: 6px;
line-height: 1.5;
}
/* Ссылки оглавления */
.tcse4toc-link {
display: inline-block;
padding: 6px 10px 6px 24px;
color: #495057;
text-decoration: none;
border-left: 3px solid transparent;
transition: all 0.2s ease;
position: relative;
font-size: 0.95rem;
}
.tcse4toc-link:hover {
color: #0d6efd;
border-left-color: #0d6efd;
background: rgba(13,110,253,0.03);
transform: translateX(3px);
}
/* Уровень H2 */
.tcse4toc-item-h2 {
font-weight: 500;
counter-increment: toc-h2;
counter-reset: toc-h3;
}
.tcse4toc-item-h2 .tcse4toc-link {
padding-left: 28px;
font-weight: 600;
color: #212529;
border-left-width: 4px;
}
.tcse4toc-item-h2 .tcse4toc-link::before {
content: counter(toc-h2) ".";
position: absolute;
left: 6px;
color: #0d6efd;
font-weight: 600;
font-size: 0.9rem;
opacity: 0.7;
}
/* Уровень H3 */
.tcse4toc-item-h3 {
margin-left: 20px;
counter-increment: toc-h3;
counter-reset: toc-h4;
position: relative;
}
.tcse4toc-item-h3 .tcse4toc-link {
padding-left: 40px;
font-size: 0.9rem;
}
.tcse4toc-item-h3 .tcse4toc-link::before {
content: counter(toc-h2) "." counter(toc-h3);
position: absolute;
left: 6px;
color: #6c757d;
font-size: 0.85rem;
opacity: 0.7;
}
/* Уровень H4 */
.tcse4toc-item-h4 {
margin-left: 40px;
counter-increment: toc-h4;
}
.tcse4toc-item-h4 .tcse4toc-link {
padding-left: 52px;
font-size: 0.85rem;
color: #6c757d;
}
.tcse4toc-item-h4 .tcse4toc-link::before {
content: counter(toc-h2) "." counter(toc-h3) "." counter(toc-h4);
position: absolute;
left: 6px;
color: #adb5bd;
font-size: 0.8rem;
opacity: 0.6;
}
/* Активный пункт при скролле (можно добавить через JS позже) */
.tcse4toc-link.active {
color: #0d6efd;
border-left-color: #0d6efd;
background: rgba(13,110,253,0.08);
font-weight: 500;
}
/* Минималистичная тема (опционально) */
.tcse4toc-block.minimal {
border: none;
box-shadow: none;
background: transparent;
}
.tcse4toc-block.minimal .tcse4toc-header {
background: transparent;
padding: 10px 0;
border-bottom: 2px solid #e9ecef;
}
.tcse4toc-block.minimal .tcse4toc-content {
padding: 15px 0;
}
/* Темная тема (опционально) */
@media (prefers-color-scheme: dark) {
.tcse4toc-block {
background: #2d2d2d;
border-color: #404040;
}
.tcse4toc-header {
background: linear-gradient(to bottom, #333, #2a2a2a);
color: #e0e0e0;
}
.tcse4toc-content {
background: #2d2d2d;
}
.tcse4toc-link {
color: #b0b0b0;
}
.tcse4toc-item-h2 .tcse4toc-link {
color: #e0e0e0;
}
}
/* Адаптивность */
@media (max-width: 768px) {
.tcse4toc-block {
border-radius: 6px;
}
.tcse4toc-header {
padding: 12px 15px;
font-size: 1rem;
}
.tcse4toc-content {
padding: 12px 15px;
}
.tcse4toc-item-h3 {
margin-left: 15px;
}
.tcse4toc-item-h4 {
margin-left: 30px;
}
.tcse4toc-link {
padding: 5px 8px 5px 20px;
font-size: 0.9rem;
}
}
/* Печать */
@media print {
.tcse4toc-block {
border: 1px solid #000;
break-inside: avoid;
}
.tcse4toc-header {
background: none;
border-bottom: 1px solid #000;
}
.tcse4toc-icon {
display: none;
}
.tcse4toc-content {
display: block !important;
}
}
</style>
Ссылка на код JS скрипта
/templates/ВАШ_шаблон/js/tcse4toc.js