useScroll

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

Объект с методами:

МетодТипОписание
getScroll(options?: GetScrollOptions) => { x: number; y: number }Возвращает текущие координаты прокрутки
scrollTo(x?: number, y?: number) => voidПрокручивает к указанным координатам
// Главный компонент приложения
const App = () => {
  const [isModalOpen, setIsModalOpen] = React.useState(false);
  const { scrollTo, getScroll } = useManualScroll();
 
  // Прокрутка фона на 100px вниз
  const scrollBackground = () => {
    const currentY = getScroll().y;
    scrollTo(0, currentY + 100);
  };
 
  return (
    <>
      <button onClick={() => setIsModalOpen(true)}>Открыть модалку</button>
 
      {isModalOpen && (
        <PopoutWrapper>
          <div>
            <button onClick={scrollBackground}>Скроллить фон ↓</button>
            <button onClick={() => setIsModalOpen(false)}>Закрыть</button>
          </div>
        </PopoutWrapper>
      )}
    </>
  );
};
 
const Example = () => (
  <AppRoot>
    {/* или scroll="contain" */}
    <App />
  </AppRoot>
);
 
<Example />;

В зависимости от значения свойства scroll компонента AppRoot меняется поведение useScroll:

scrollПоведение
"contain"Управляет прокруткой внутреннего контейнера приложения.
"global"Работает с глобальной полосой прокрутки окна браузера.
const Modal = () => {
  const [opened, setOpened] = useState(false);
 
  // Блокируем прокрутку при открытии
  useScrollLock(opened);
 
  // Получаем доступ к ручному управлению
  const { scrollTo, getScroll } = useManualScroll();
 
  // Пользовательская прокрутка фона
  const handleScroll = () => scrollTo(0, getScroll() + 200);
 
  return <>{/* Код компонента */}</>;
};