Автоматическое оглавление для сайта: Заставьте заголовки работать на вас

Наши разработки | Плагины для DLE

Или: Почему ваши читатели путаются в длинных текстах и как 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-скрипт, который:

  1. Находит все заголовки H2, H3, H4 внутри вашей статьи
  2. Генерирует им уникальные ID (если их нет), чтобы на них можно было ссылаться
  3. Строит древовидное оглавление с учётом вложенности
  4. Вставляет этот блок в нужное место страницы
  5. Добавляет плавный скролл — при клике на пункт читатель перемещается к нужному месту

Всё это работает на стороне браузера. Никакого 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. Правильная нумерация


Скрипт не просто выводит заголовки списком. Он строит иерархию:
  1. Первый раздел (H2)

1.1. Подраздел (H3)
1.2. Ещё подраздел (H3)
  1. Второй раздел (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. Выберите один из трёх способов внедрения.
  1. Скопируйте код стилей и скрипта.
  2. Выберите один из трёх способов внедрения.
  3. Проверьте на тестовой статье.
  4. Радуйтесь, когда читатели скажут «О, как удобно!».


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

Готовый файл custom/fullstory/tcse4toc.tpl


Скачать файл: tcse4toc.tpl [14,83 Kb] (cкачиваний: 6)
Зачем я заменил скучные комментарии на сайте на хайп из Telegram (и вы тоже можете)

Привет, коллеги-владельцы сайтов на DLE! Давайте начистоту: стандартная система комментариев — это часто боль, а не...

Подробнее
Блог им. Bormaley / О SEO

SEO как игра на фортепиано, один неправильный аккорд может расстроить весь концерт. Про «серую» оптимизацию: Чем бы...

Подробнее
API против RSS: Или как перестать раздавать свой контент всем подряд и начать контролировать

Приветствую, уважаемый владелец контента! Сидите вы, значит, такой довольный: настроили RSS-ленту на своём сайте,...

Подробнее
«Похороны email» отменяются — Часть 2: Вы купились. И правильно сделали. Что дальше?

Или: Пошаговое руководство для тех, кто прочитал первую статью, кивнул головой, сказал «да, email — это суверенитет», —...

Подробнее
Мебельный щит vs готовая мебель: Как выбирать CMS и не выкинуть деньги на ветер

Или: Почему Webasyst — это круто, если вы столяр, а DLE — если вы просто хотите жить 🪑 Пролог: История про мебельный...

Подробнее
Про автоматическое SEO продвижение — стоит ли использовать и когда?

Как то на Яндекс Кью попросили ответить на вопрос про автоматическое SEO продвижение — стоит ли его использовать и...

Подробнее

💬 Комментарии

В связи с новыми требованиями законодательства РФ (ФЗ-152, ФЗ «О рекламе») и ужесточением контроля со стороны РКН, мы отключили систему комментариев на сайте.

🔒 Важно Теперь мы не собираем и не храним ваши персональные данные — даже если очень захотим.

💡 Хотите обсудить материал?

Присоединяйтесь к нашему Telegram-каналу:

https://t.me/tcsecms/

Нажмите кнопку ниже — и вы сразу попадёте в чат с комментариями