Компоненты/Параллакс-картинка

Параллакс-картинка

29 сентября 2026

Фото в рамке смещается медленнее прокрутки и создаёт ощущение глубины, а колесо мыши крутит страницу плавно.

Установка

npm install clsx motion tailwind-merge
pnpm add clsx motion tailwind-merge
yarn add clsx motion tailwind-merge
bun add clsx motion tailwind-merge

Файлы

parallax-image.tsx
НазадПараллакс-шапкаДалееПроявление из частиц

Фотография лежит в рамке фиксированной высоты и при прокрутке сдвигается внутри неё медленнее, чем сама страница. За счёт этой разницы кажется, что снимок находится глубже остального контента.

Силу сдвига задаёт проп speed: чем он больше, тем заметнее отстаёт картинка. В демо дополнительно подключён хук useSmoothWheel, который сглаживает прокрутку колесом, чтобы движение было мягким и без рывков.

Вручную

Скопируйте эти файлы в components/parallax-image/:

Общие помощники положите в lib/ проекта:

Проверьте алиас путей. Импорты в коде выше записаны как @/components/... и @/lib/.... Нужен алиас "@/*" на папку, где лежат components/ и lib/, в tsconfig.json — или поправьте импорты под свои пути.

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

import { useRef } from "react";

import { ParallaxImage } from "@/components/parallax-image/parallax-image";

export function Hero() {
const scrollRef = useRef<HTMLDivElement>(null);
return (
  <div ref={scrollRef} className="h-[640px] overflow-y-auto">
    <div className="flex h-[1280px] items-center justify-center">
      <ParallaxImage
        src="/photos/lake.webp"
        alt="Горное озеро"
        containerClassName="w-full max-w-3xl"
        className="h-[640px] w-full"
        height="448px"
        speed={40}
        scrollContainer={scrollRef}
      />
    </div>
  </div>
);
}

Пропсы

Пропс
Описание
src

Адрес изображения

Тип string

alt?

Альтернативный текст

Тип string·По умолчанию ""

speed?

На сколько процентов сдвигается картинка, пока рамка проходит экран

Тип number·По умолчанию 30

height?

Высота рамки

Тип string·По умолчанию "70vh"

radius?

Скругление рамки в пикселях

Тип number

maxWidth?

Максимальная ширина рамки в пикселях

Тип number

scrollContainer?

Свой прокручиваемый контейнер вместо окна

Тип RefObject<HTMLElement | null>

containerClassName?

Классы рамки

Тип string

className?

Классы изображения

Тип string