Locomotive Scroll — это библиотека для реализации плавной прокрутки и параллакс-эффектов в веб-интерфейсах. Она опирается на изменение трансформаций DOM-элементов через JavaScript, что часто приводит к тому, что содержимое страницы не доступно напрямую для поисковых роботов, если не учесть особенности рендеринга.
По умолчанию многие элементы внутри контейнера Locomotive Scroll
управляются через CSS-свойство transform,
что делает их визуально видимыми, но не включенными в поток
документа, как для обычного скролла. Это значит, что поисковые
роботы, которые не выполняют сложный JavaScript или не обрабатывают
трансформации, могут не индексировать содержимое,
находящееся внутри прокручиваемой области.
Server-Side Rendering позволяет генерировать весь HTML на сервере до того, как он попадет к пользователю или поисковому роботу. Это гарантирует, что даже если Locomotive Scroll манипулирует DOM на клиенте, исходный HTML содержит все элементы, которые нужно индексировать:
// Пример интеграции Locomotive Scroll в SSR-проекте (Next.js)
import { useEffect } from 'react';
import LocomotiveScroll from 'locomotive-scroll';
export default function Page() {
useEffect(() => {
const scroll = new LocomotiveScroll({
el: document.querySelector('#main-container'),
smooth: true
});
return () => scroll.destroy();
}, []);
return (
<main id="main-container">
<section data-scroll-section>
<h1>Заголовок</h1>
<p>Текст контента...</p>
</section>
</main>
);
}
Даже если Locomotive Scroll будет изменять положение элементов, поисковый робот уже видит их в исходном HTML.
Можно создать скрытую версию контента для поисковых
роботов, которая будет видна только при отключенном
JavaScript или через noscript. Этот подход
помогает, когда параллакс или плавная прокрутка полностью меняет поток
документа:
<noscript>
<div class="seo-content">
<h1>Заголовок страницы</h1>
<p>Основной текст, который важен для индексации</p>
</div>
</noscript>
Элемент noscript не отображается пользователю с
включённым JS, но будет прочитан поисковыми системами.
Для контента, который подгружается или анимируется при скролле, можно синхронизировать его появление с Intersection Observer, одновременно добавляя классы для SEO-дружественной структуры:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if(entry.isIntersecting){
entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
document.querySelectorAll('.scroll-item').forEach(el => {
observer.observe(el);
});
Это позволяет постепенно раскрывать элементы, при этом сохраняя их структурное присутствие в DOM.
Подход progressive enhancement заключается в том, что базовая версия страницы должна быть полностью функциональной без JS. Locomotive Scroll добавляет только визуальные эффекты:
<section class="content">
<h2>Текст для индексации</h2>
<p>Описание блока...</p>
</section>
Locomotive Scroll лишь управляет смещением этого блока, не удаляя его из DOM.
Если нельзя использовать SSR или noscript, можно
дублировать ключевой текст вне прокручиваемого
контейнера, делая его невидимым для пользователей через
CSS (например,
position: absolute; left: -9999px;):
.seo-hidden {
position: absolute;
left: -9999px;
width: 1px;
height: 1px;
overflow: hidden;
}
<div class="seo-hidden">
Ключевой текст для поисковых систем
</div>
В таком виде поисковые роботы смогут индексировать контент, при этом визуально он не мешает пользователю.
После реализации любой из стратегий необходимо тестировать страницу через инструменты поисковых систем:
URL Inspection;noscript для критического
текста.Эти подходы позволяют сочетать визуально сложные эффекты Locomotive Scroll с полной доступностью для поисковых роботов, обеспечивая SEO без потери пользовательского опыта.