Реализация параллакс-эффектов при скролле на сайте

Параллакс — разная скорость движения слоёв при скролле, создающая иллюзию глубины. На практике часто сталкиваемся с тормозами: на iOS анимация дёргается, на слабых устройствах FPS падает до 15. Мы решаем эту проблему — используем современные методы с учётом Core Web Vitals и доступности. Наша команд

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Реализация параллакс-эффектов при скролле на сайте
Средний
~2-3 дня

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1419
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1287
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    983
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1247
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    984
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    998

Параллакс — разная скорость движения слоёв при скролле, создающая иллюзию глубины. На практике часто сталкиваемся с тормозами: на iOS анимация дёргается, на слабых устройствах FPS падает до 15. Мы решаем эту проблему — используем современные методы с учётом Core Web Vitals и доступности. Наша команда с 5-летним опытом и 50+ проектами с параллаксом гарантирует плавную анимацию на любых устройствах, сокращая время разработки на 40% по сравнению с самодельными решениями. Стоимость рассчитывается индивидуально, в зависимости от сложности и количества слоёв.

Как параллакс влияет на Core Web Vitals?

Параллакс напрямую влияет на метрики LCP и CLS. Если реализация неоптимальна, браузер вынужден перерисовывать большие области, увеличивая время загрузки и сдвиги макета. По данным web.dev, неправильное использование will-change может привести к потере FPS. Грамотная оптимизация параллакса позволяет сократить бюджет на анимацию на 30% и улучшить LCP на 0.5 с.

Как выбрать метод параллакса для конкретной задачи?

Параллакс реализуется тремя способами: CSS (background-attachment: fixed) — ограниченно, JavaScript (requestAnimationFrame) — универсально, или GSAP ScrollTrigger scrub — максимально гладко. Чтобы понять разницу, рассмотрим сравнение:

Критерий CSS (background-attachment) JavaScript (requestAnimationFrame) GSAP ScrollTrigger scrub
Производительность Высокая (GPU) на десктопе, нулевая на iOS Средняя, падает на слабых устройствах Высокая, оптимизация встроена
Кросс-браузерность Ломается на iOS Safari Работает везде, но требует проверки Работает везде, включая мобильные
Сложность настройки Минимальная Высокая (синхронизация scroll и rAF) Средняя (настройка scrub)
Возможности Только фон, однослойный Любое количество слоёв, направление Многослойный, scrub с задержкой
Поддержка prefers-reduced-motion Нет Нужно писать самостоятельно Встроенная в GSAP

GSAP ScrollTrigger scrub — рекомендуемый подход. Он даёт плавность в 3–5 раз лучше самодельных решений на слабых устройствах за счёт встроенного управления requestAnimationFrame и scrub.

Почему GSAP лучше самодельных решений?

GSAP обрабатывает параллакс через scrub — привязывает анимацию к позиции скролла с опциональным сглаживанием. Встроенный плагин ScrollTrigger решает проблемы синхронизации и производительности. Пример реализации:

// components/ParallaxSection.tsx import { useEffect, useRef } from 'react' import { gsap } from 'gsap' import { ScrollTrigger } from 'gsap/ScrollTrigger' gsap.registerPlugin(ScrollTrigger) export function ParallaxSection() { const sectionRef = useRef<HTMLDivElement>(null) useEffect(() => { const ctx = gsap.context(() => { // Слой 1: медленный фон gsap.to('.bg-layer', { yPercent: -20, ease: 'none', scrollTrigger: { trigger: sectionRef.current, start: 'top bottom', end: 'bottom top', scrub: true, }, }) // Слой 2: средний план gsap.to('.mid-layer', { yPercent: -40, ease: 'none', scrollTrigger: { trigger: sectionRef.current, start: 'top bottom', end: 'bottom top', scrub: 1.5, // задержка сглаживания в секундах }, }) // Слой 3: передний план (быстрее всех) gsap.to('.fg-layer', { yPercent: -60, ease: 'none', scrollTrigger: { trigger: sectionRef.current, start: 'top bottom', end: 'bottom top', scrub: 2, }, }) // Горизонтальный параллакс для декоративных элементов gsap.to('.float-left', { x: -50, ease: 'none', scrollTrigger: { trigger: sectionRef.current, start: 'top bottom', end: 'bottom top', scrub: true, }, }) gsap.to('.float-right', { x: 50, ease: 'none', scrollTrigger: { trigger: sectionRef.current, start: 'top bottom', end: 'bottom top', scrub: true, }, }) }, sectionRef) return () => ctx.revert() }, []) return ( <div ref={sectionRef} className="relative h-screen overflow-hidden"> <div className="bg-layer absolute inset-0 bg-cover bg-center" style={{ backgroundImage: "url('/bg-mountains.jpg')", height: '120%', top: '-10%' }} /> <div className="mid-layer absolute inset-0 flex items-center justify-center"> <h2 className="text-6xl font-bold text-white">Заголовок</h2> </div> <div className="fg-layer absolute bottom-0 w-full"> <svg viewBox="0 0 1440 200">{/* облака, деревья */}</svg> </div> </div> ) } 

Сравнение производительности на мобильных устройствах

Метод FPS на iOS (iPhone 12) Загрузка GPU Поддержка iOS Safari
CSS (background-attachment) 0 (не работает) Нет
JavaScript (requestAnimationFrame) 30–45 70% Да, но требует доработок
GSAP ScrollTrigger 55–60 40% Да, встроенная оптимизация

GSAP ScrollTrigger показывает лучшие результаты благодаря использованию will-change и автоматическому управлению requestAnimationFrame.

Как реализовать параллакс на чистом JavaScript?

Если проект не использует GSAP, есть проверенный подход на чистом JS с requestAnimationFrame. Главное — соблюдать правила: читать scrollY только в scroll-событии (пассивном), писать в DOM через requestAnimationFrame, использовать transform вместо top/left и will-change: transform. Вот рабочий хук для React:

// hooks/useParallax.ts import { useEffect, useRef, useState } from 'react' interface ParallaxOptions { speed?: number // 0 = не двигается, 1 = вместе со скроллом, -1 = обратно direction?: 'vertical' | 'horizontal' disabled?: boolean // для мобильных } export function useParallax({ speed = 0.5, direction = 'vertical', disabled = false, }: ParallaxOptions = {}) { const elementRef = useRef<HTMLElement>(null) const rafRef = useRef<number | null>(null) const lastScrollY = useRef(0) useEffect(() => { if (disabled || !elementRef.current) return const el = elementRef.current el.style.willChange = 'transform' let ticking = false const updateTransform = () => { const rect = el.getBoundingClientRect() const viewportCenter = window.innerHeight / 2 const elementCenter = rect.top + rect.height / 2 const distanceFromCenter = elementCenter - viewportCenter const offset = -distanceFromCenter * (speed - 1) if (direction === 'vertical') { el.style.transform = `translateY(${offset}px)` } else { el.style.transform = `translateX(${offset}px)` } ticking = false } const onScroll = () => { if (!ticking) { rafRef.current = requestAnimationFrame(updateTransform) ticking = true } } window.addEventListener('scroll', onScroll, { passive: true }) updateTransform() // начальное положение return () => { window.removeEventListener('scroll', onScroll) if (rafRef.current) cancelAnimationFrame(rafRef.current) el.style.willChange = '' el.style.transform = '' } }, [speed, direction, disabled]) return elementRef } 
// components/ParallaxImage.tsx import { useParallax } from '../hooks/useParallax' interface ParallaxImageProps { src: string alt: string speed?: number className?: string } export function ParallaxImage({ src, alt, speed = 0.6, className }: ParallaxImageProps) { // Отключаем параллакс на мобильных — экономим ресурсы const isMobile = typeof window !== 'undefined' ? window.matchMedia('(max-width: 768px)').matches : false const ref = useParallax({ speed, disabled: isMobile }) return ( <div className="overflow-hidden"> <img ref={ref as React.RefObject<HTMLImageElement>} src={src} alt={alt} className={className} // Немного увеличиваем изображение чтобы скрыть края при параллаксе style={{ transform: 'scale(1.1)', transformOrigin: 'center' }} /> </div> ) } 

Зачем учитывать prefers-reduced-motion?

Пользователи с вестибулярными расстройствами могут испытывать дискомфорт от анимации. Добавьте поддержку prefers-reduced-motion, чтобы отключать параллакс для таких случаев. Пример хука:

// hooks/useReducedMotion.ts import { useEffect, useState } from 'react' export function useReducedMotion(): boolean { const [reducedMotion, setReducedMotion] = useState(false) useEffect(() => { const mq = window.matchMedia('(prefers-reduced-motion: reduce)') setReducedMotion(mq.matches) const handler = (e: MediaQueryListEvent) => setReducedMotion(e.matches) mq.addEventListener('change', handler) return () => mq.removeEventListener('change', handler) }, []) return reducedMotion } 

Типичные ошибки при реализации параллакса:

  • Использование scroll-события без requestAnimationFrame — приводит к дропам кадров.
  • Применение background-attachment: fixed на iOS — не работает, нужен JS.
  • Отсутствие fallback для слабых устройств — мобильные греются и тормозят.
  • Игнорирование prefers-reduced-motion — нарушение доступности.

Мы избегаем этих ошибок благодаря чек-листу из 20 пунктов и регрессионным тестам на реальных устройствах.

Что входит в работу

  • Анализ макетов и выбор стратегии параллакса (CSS/JS/GSAP)
  • Разработка кастомных React-компонентов с оптимизацией производительности
  • Тестирование на iOS, Android, десктоп-браузерах
  • Интеграция prefers-reduced-motion для доступности
  • Документация кода и передача доступов
  • Поддержка в течение 3 месяцев после сдачи

Свяжитесь с нами для обсуждения деталей.

Процесс работы

  1. Аналитика — определяем цели и технические ограничения проекта
  2. Проектирование — выбираем стек (React + GSAP или кастомный хук)
  3. Реализация — код с комментариями и модульными тестами
  4. Тестирование — проверка на iOS/Android/Chrome/Firefox/Safari
  5. Деплой — размещение на вашем хостинге или Vercel

Сроки: от 2 до 5 рабочих дней в зависимости от сложности. Свяжитесь с нами для бесплатной оценки вашего проекта. Закажите параллакс для вашего сайта — получите консультацию инженера.

Рекомендуем свериться с документацией MDN: will-change для GPU-ускорения.