Интеграция с CMS

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

Подключение библиотеки через систему шаблонов

В большинстве CMS (например, WordPress, Joomla, Drupal) существует централизованный механизм подключения JavaScript-файлов.

WordPress

Подключение через файл functions.php:

function enqueue_smooth_scroll() {
    wp_enqueue_script(
        'smooth-scroll',
        get_template_directory_uri() . '/js/smooth-scroll.min.js',
        array(),
        null,
        true
    );
}
add_action('wp_enqueue_scripts', 'enqueue_smooth_scroll');

Инициализация:

document.addEventListener('DOMContentLoaded', function () {
    var scroll = new SmoothScroll('a[href*="#"]', {
        speed: 800,
        speedAsDuration: true
    });
});

Ключевой момент: использование wp_enqueue_script предотвращает конфликты и обеспечивает корректную загрузку зависимостей.


Joomla

Подключение через index.php шаблона:

$doc = JFactory::getDocument();
$doc->addScript($this->baseurl . '/templates/your_template/js/smooth-scroll.min.js');

Drupal

Добавление через .libraries.yml:

smooth-scroll:
  js:
    js/smooth-scroll.min.js: {}

И подключение в .info.yml:

libraries:
  - yourtheme/smooth-scroll

Работа с динамическим контентом

CMS часто генерируют HTML динамически: через виджеты, модули, блоки или AJAX. Это влияет на работу Smooth Scroll.

Проблема

Инициализация библиотеки происходит один раз при загрузке страницы, но новые элементы могут появляться позже.

Решение

Повторная инициализация или делегирование событий:

var scroll;

function initSmoothScroll() {
    scroll = new SmoothScroll('a[href*="#"]', {
        speed: 800
    });
}

document.addEventListener('DOMContentLoaded', initSmoothScroll);

// пример для AJAX
document.addEventListener('ajaxComplete', function () {
    initSmoothScroll();
});

Либо использование MutationObserver:

const observer = new MutationObserver(() => {
    initSmoothScroll();
});

observer.observe(document.body, {
    childList: true,
    subtree: true
});

Учет структуры шаблонов

В CMS часто используются якоря внутри:

  • меню
  • виджетов
  • контентных блоков
  • конструкторов страниц (Elementor, Gutenberg и др.)

Важно учитывать:

  • уникальность id элементов
  • корректность ссылок (href="#section")
  • отсутствие конфликтов с другими JS-скриптами

Пример корректной структуры

<a href="#section1">Раздел 1</a>

<section id="section1">
    <h2>Заголовок</h2>
</section>

Конфликты с другими библиотеками

CMS-проекты часто используют:

  • jQuery
  • Bootstrap
  • собственные скрипты темы

Возможные проблемы

  • двойная обработка кликов
  • конфликт анимаций
  • блокировка стандартного поведения

Решение

Отключение стандартного поведения других скриптов:

document.querySelectorAll('a[href*="#"]').forEach(anchor => {
    anchor.addEventListener('click', function (e) {
        e.stopPropagation();
    });
});

Или настройка Smooth Scroll:

var scroll = new SmoothScroll('a[href*="#"]', {
    ignore: '[data-scroll-ignore]'
});

Интеграция с конструкторами страниц

Популярные визуальные редакторы:

  • Elementor (WordPress)
  • WPBakery
  • Gutenberg

Особенности

  • элементы создаются динамически
  • часто используются собственные скрипты прокрутки

Практика

  1. Отключение встроенного smooth scroll конструктора (если есть)
  2. Инициализация после полной загрузки DOM
window.addEventListener('load', function () {
    new SmoothScroll('a[href*="#"]');
});

SEO и доступность

Плавная прокрутка не должна мешать:

  • индексации
  • навигации клавиатурой
  • работе screen reader

Рекомендации

  • сохранять стандартные якоря (id)
  • не удалять href
  • избегать preventDefault() без необходимости

Улучшение доступности

var scroll = new SmoothScroll('a[href*="#"]', {
    updateURL: true,
    popstate: true
});

Работа с фиксированными шапками

В CMS часто используются фиксированные header-элементы, которые перекрывают контент.

Решение

Использование offset:

var scroll = new SmoothScroll('a[href*="#"]', {
    offset: 80
});

Или динамический расчет:

var header = document.querySelector('header');

var scroll = new SmoothScroll('a[href*="#"]', {
    offset: function () {
        return header.offsetHeight;
    }
});

Кэширование и минификация

CMS часто используют:

  • кэширование страниц
  • объединение JS-файлов
  • минификацию

Влияние

  • изменения в JS могут не применяться сразу
  • возможны ошибки из-за объединения файлов

Практика

  • очистка кэша после изменений
  • исключение Smooth Scroll из агрессивной минификации (при необходимости)

Условная загрузка скрипта

Не всегда требуется подключать Smooth Scroll на всех страницах.

WordPress пример

if (is_page()) {
    wp_enqueue_script('smooth-scroll');
}

JavaScript-проверка

if (document.querySelector('a[href*="#"]')) {
    new SmoothScroll('a[href*="#"]');
}

Интеграция с AJAX-навигацией

Некоторые CMS используют AJAX для подгрузки страниц без перезагрузки.

Проблема

Smooth Scroll теряет привязку к элементам.

Решение

Повторная инициализация после загрузки:

document.addEventListener('pjax:end', function () {
    new SmoothScroll('a[href*="#"]');
});

Тестирование интеграции

Критически важно проверять:

  • все страницы сайта
  • разные типы контента (посты, категории, страницы)
  • мобильные устройства
  • работу в разных браузерах

Основные сценарии

  • переход по якорям
  • загрузка через AJAX
  • взаимодействие с меню
  • работа с динамическими блоками

Расширение функциональности

В рамках CMS можно интегрировать Smooth Scroll с:

  • пользовательскими настройками темы
  • панелью администратора
  • кастомными полями

Пример: настройка скорости через админку (WordPress)

$speed = get_theme_mod('scroll_speed', 800);
var scroll = new SmoothScroll('a[href*="#"]', {
    speed: <?php echo $speed; ?>
});

Безопасность и стабильность

При интеграции важно:

  • использовать проверенные версии библиотек
  • избегать загрузки из ненадежных CDN
  • контролировать обновления CMS и темы

Глубокая интеграция Smooth Scroll в CMS требует понимания не только самой библиотеки, но и внутренней логики платформы: шаблонов, хуков, системы кэширования и динамической генерации контента. Только при учете всех этих аспектов достигается стабильная и предсказуемая работа плавной прокрутки на проекте.