Простые способы создания оглавления (содержания) на сайте

Рассмотрим три способа добавления оглавления (содержания) для статей сайта — из заголовков HTML; с помощью jQuery; с плагином для WordPress.

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

Итак, давайте рассмотрим первый пример:

1. Создаем оглавление на jQuery

Скрипт легкий и не нагружает сайт, не создает текст в исходном коде страницы. Автоматически генерирует оглавление/содержание без вложенного списка из тегов h2-h7, по классу или ID. Блок содержания можно вывести перед первым заголовком или в любом месте по указанному селектору; при выделении области статьи, которую необходимо оглавить.

Создаем оглавление с помощью Javascript
Пример того, как будет отображаться оглавление/содержание статьи

Первым делом создайте в редакторе кода файл и назовите его toc.js. Скопируйте этот код и вставьте его в созданный файл, сохраните.

(function($) {
    'use strict';
    jQuery(document).ready(function() {

        /*
        Create a table of contents
        */
        $.fn.ToC = function(options) {

            var toc = $.extend({
                /*
                 * The heading property is the selector for your headings. It must be a valid
                 * jQuery selector, such as 'div' or '.heading'.
                 */
                heading: 'h2, h3, h4, h5, h6, h7',
                /*
                 * The generateID property specifies whether or not we want to have anchor ids
                 * automatically generated for us. This is recommended.
                 */
                generateID: true,
                /*
                 * If the generateID property is set to true, the baseID property will in turn
                 * be used as the base ID for your headings, such as <h2 id="foo-1">. In this case,
                 * foo would be the base ID.
                 */
                baseID: 'heading',
                /*
                 * The containerClass property is the class we'll add to our <nav> parent element.
                 * This has no bearing on the script, it is here merely for your convenience.
                 */
                containerClass: 'toc-navi',
                /*
                 * The appendTo property is crucial in determining the placement of your newly generated
                 * navigation. This property must be a valid jQuery selector.
                 * NOTE: The navigation will be prepened to this element (placed before all other elemenets within it).
                 */
                appendTo: this
            }, options);

            return this.each(function() {
                var $this = $(this),
                    navigation = $('<ol>');

                $this.find(toc.heading).each(function(i) {
                    var id = this.id;
                    /*
                     * If ID generation is enabled, we add a custom id to each heading,
                     * which will serve as the destination for our anchor.
                     */
                    if (toc.generateID) {
                        if (id.length) this.id += ' ';
                        id = toc.baseID + '-' + i;
                        this.id += id;
                    }

                    /*
                     * I opted for the <nav><ul><li><a> structure,
                     * so that's what you get.
                     */
                    navigation
                        .append(
                            $('<li>')
                            .append(
                                $('<a>')
                                .attr('href', '#' + id)
                                .text(this.innerHTML)
                            )
                        );
                });

                $(toc.appendTo).prepend($('<nav>').append(navigation).addClass(toc.containerClass));
            });

        };

        /*
         * Example usage, with all the extras.
         */
        $('.toc').ToC({
            heading: 'h2, h3'
        });

    });

})(jQuery);

1.1. Дополнительные параметры

Вы можете настроить вывод содержимого, указав свои параметры под комментарием «Example usage, with all the extras» .

/*
 * Example usage, with all the extras.
 */
    $('.toc').ToC({
        heading: 'h2, h3, h4',//укажите селекторы заголовков, можно указать тег, ID или class, по умолчанию h2-h7
        generateID: false,//отключит добавление ID в заголовки статьи, по умолчанию стоит true
        baseID: 'part',//изменит ID заголовков, по умолчанию "heading"
        containerClass: 'table-of-contents',//изменит класс контейнера содержания, по умолчанию "toc-navi"
        appendTo: '.entry-content'//вставит содержание перед любым блоком, тут надо указать селектор класса этого блока
    });

1.2. Подключение скрипта на сайт

Способ для WordPress

Зайдите на свой хостинг или подключитесь по FTP. Перейдите в /wp-content/themes, найдите папку «JS» и загрузите в нее файл toc.js.

Перейдите в файл темы functions.php и в самый конец добавьте функцию, которая подключит скрипт. В вашей теме папка «JS» может находиться в другом разделе, тогда не забудьте изменить в коде путь до файла. Если вы используете дочернюю тему, подключите скрипт в папку дочерней темы. Также код можно добавить с помощью плагина «Code Snippet».

а). Эта функция подключит скрипт на всех страницах сайта.

/**
 *Enqueues scripts TOC
 */
    add_action( 'wp_enqueue_scripts', 'webkato_toc_scripts' );
    function webkato_toc_scripts() {
        wp_enqueue_script( 'toc', get_template_directory_uri() . '/js/toc.js', array('jquery'), true );
    }

б). Чтобы подключить скрипт только на страницах с постами используйте условный тег is_single().

/**
 *Enqueues script TOC
 */
    add_action( 'wp_enqueue_scripts', 'webkato_toc_scripts' );
    function webkato_toc_scripts() {
        if( is_single() ) {
            wp_enqueue_script( 'toc', get_template_directory_uri() . '/js/toc.js', array('jquery'), true );
        }
    }

в). Если необходимо подключать скрипт только на определённых страницах, воспользуйтесь функцией регистрации скрипта.

/**
 *Register scripts TOC
 */
    add_action( 'wp_enqueue_scripts', 'webkato_toc_scripts' );
    function webkato_toc_scripts() {
        wp_register_script( 'toc', get_template_directory_uri() . '/js/toc.js', array('jquery'), true );
    }

Там же зарегистрируйте шорткод, который включит скрипт.

/**
 *Register shortcode for script TOC
 */
    add_shortcode( 'toc_script', 'webkato_toc_shortcode' );
    function webkato_toc_shortcode( $atts ) {
        wp_enqueue_script( 'toc' );
    }

Добавьте шорткод [toc] прямо в редакторе WordPress при написании статьи.

Способ для HTML сайта

У вас должен быть подключен JQuery. Загрузите файл toc.js в папку «JS». Вставьте строчку <script src="js/toc.js"></script> перед закрывающим тегом </body> на ту страницу, которая отвечает за вывод содержимого ваших постов.

1.3. Выводим оглавление в статье

На странице выделите ту часть статьи с заголовками для которой необходимо создать оглавление.

<div class="toc">статья с заголовками</div>

Например, первый заголовок у вас начинается со второго абзаца, над этим заголовком добавьте <div class="toc">, а в конце статьи закройте блок </div>. Содержание сгенерируется перед первым заголовком статьи.

Если в дополнительных настройках скрипта вы указали другой селектор, например, appendTo: '.entry-content', то содержание отобразится именно перед этим селектором.

2. Оглавление с помощью HTML

Если по какой-то причине вы не хотите устанавливать скрипты на своем сайте или вам необходимо всего пару раз указать содержание статьи, то сделать его можно с помощью ручного добавления анкоров в заголовки.

Добавьте в теги заголовков атрибут ID. В том месте где захотите вывести оглавление добавьте блок навигации и нумерованный <ol> или ненумерованный <ul> список ссылок.

<nav class="toc-navi">
  <h2 class="toc-heading">Оглавление</h2>
  <ol>
    <li><a href="#toc-1">Заголовок 1</a></li>
    <li><a href="#toc-2">Заголовок 2</a></li>
    <li><a href="#toc-3">Заголовок 3</a></li>
  </ol>
</nav>

  <h2 id="toc-1">Заголовок 1</h2>
  <p>Есть в тихом августе, мечтательном и кротком, такая мягкая, певучая печаль, что жаль минувшего, мелькнувшего в коротком, что сердце просится: «к забвению причаль».</p>

  <h2 id="toc-2">Заголовок 2</h2>
  <p>Как обвораживает мне глаза адриатическая бирюза! Облагораживает мне уста непререкаемая красота.</p>

  <h3 id="toc-3">Заголовок 3</h3>
  <p>Обескураживает вышина, от туч разглаживает лик луна. И разгораживает небеса семисияющая полоса.</p>

Теперь осталось добавить стили, можно воспользоваться предыдущим кодом, внеся небольшие правки.

3. Стили для блока «Содержание»

Если все прошло успешно, то у вас должен появиться блок с содержанием. Теперь можно задать ему стили. Как вариант, можете применить этот CSS; блок будет выглядеть точно также, как на первом изображении данной статьи.

/* Table of contents ------------------------------------------------- */ 
.toc-navi {
    float: right;
    font-size: 0.8em;
    max-width: 30%;
    margin-bottom: 12px;
    margin-left: 16px;
    padding: 0 1em;
    border: 1px solid #dadada;
    -webkit-border-radius: 3px;
    border-radius: 3px;
    background: #f5f7f9;
    -webkit-box-shadow: inset 0 0 1px rgba(255, 255, 255, .5), 0 1px 2px rgba(0, 0, 0, .3);
    box-shadow: inset 0 0 1px rgba(255, 255, 255, .5), 0 1px 2px rgba(0, 0, 0, .3);
}

.toc-navi::before { /*только для 1 способа на jQuery*/
    content: 'Содержание';
    display: block;
    font-size: 1.2rem;
    font-weight: bold;
    color: #8495a3;
}
.toc-heading { /*только для 2 способа на HTML*/
    content: 'Содержание';
    display: block;
    font-size: 1.2rem;
    font-weight: bold;
    color: #8495a3;
}
.toc-navi a {
    text-decoration: none;
    color: #545454;
}
.toc-navi a:hover, .toc-navi a:active {
    text-decoration: underline;
}
.toc-navi ol {
    padding: 0 0 0 20px;
}
toc-navi ol li {
    margin: .5em 0;
}
@media only screen and (max-width: 768px){
    .toc-navi {
        float: none;
        max-width: 100%;
        margin-left: 0;
    }
}

3. Плагин «Легкое оглавление» для WordPress

Очень удобный плагин «Easy Table of Contents», генерирует блок с содержанием статьи как на страницах, так и в записях. Можно настроить условие когда содержание будет появляться в статье; выбрать место вывода; стиль нумерации.

плагин для создания содержания статьи сайта

Есть функция отключения содержания на определенной странице. Позволяет указать какие заголовки необходимо исключить из списка по ключевым словам. Имеется несколько встроенных тем оформления, но есть и настройки собственного стиля. Плагин переведен на русский язык.

Простые способы создания оглавления (содержания) на сайте

Не забудьте оставить комментарий, помогла ли вам наша статья и каким из способов добавления содержания в статью вы воспользовались

Комментарии

4 Комментариев

  1. Все это интересно и правильно, но я искал вариант оформления уже готового оглавления для html-книги...
    То ли выпадающий список, то ли огромная простыня ссылок... может, есть другие идеи? Здесь не нашел...

    1. Здравствуйте, Ignis! Этот способ не подходит для оглавления книги на сайте. Но с этим справится обычное меню. Возможно, вам подойдёт вот такой вариант. Если создаёте книгу для чтения на мобильных устройствах, то есть уже готовые приложения.

      1. Здравствуйте, Наталья!
        Да, весьма интересно выглядит. Чисто формально это типичный фрейм, и его можно сделать без стольких библиотек. Перелистывание красиво, но не обязательно по сути. Я просто думал, что если страниц десятки, то простой список ссылок ("Содержание") будет выглядеть некрасиво. В результате я сделал некий "компромисс" для своей последней повести. Но за идею спасибо, возможно, пригодится...

        1. Можно то можно, только frame устаревшая функция, использовать её уже не рекомендуется. Рада, что у вас нашлось решение. Если необходима персональная помощь - обращайтесь через контактную форму.

Оставьте комментарий

Комментарии, считающиеся спамом или исключительно рекламные по своему содержанию, будут удалены. Допускается включение ссылки на соответствующий контент, но текст должен иметь отношение к теме поста. Также будут удалены анонимные, оскорбительные, содержащие ненормативную лексику, вводящие в заблуждение или клеветнические комментарии.

Для публикации кода в комментариях используйте следующие шорткоды -
[php]ваш код[/php] - для PHP, [css]ваш код[/css] - для CSS, [code lang="js"]ваш код[/code] - для HTML или JS, указав соответствующий lang.

Ваш адрес email не будет опубликован. Обязательные поля помечены *