@cloud-ru/ds-scroll

中文文档
1.0.7发布于 2026/11/11Apache-2.0TypeScriptESM + CJS近 30 天下载 1.4万

Контейнер с кастомными скроллбарами, размерами s/m, стратегиями скрытия, автоскролом и опциональным ресайзом.

原始使用文档
文档目录14 节
  1. Когда использовать
  2. Анатомия
  3. Size
  4. Bar hide strategy
  5. Resize
  6. Autoscroll to
  7. Установка
  8. Примеры использования
  9. Базовый скролл
  10. Компактный размер s
  11. Скроллбар появляется при наведении
  12. Ресайзируемый контейнер
  13. Автоскрол вниз
  14. Props

Scroll

@cloud-ru/ds-scroll — Контейнер с кастомными скроллбарами, размерами s/m, стратегиями скрытия, автоскролом и опциональным ресайзом.

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

Когда использовать

  • Прокручиваемые области внутри интерфейса: боковые панели, чаты, логи, списки, таблицы в карточках.
  • Контент с динамической высотой, где нужно прилипание к низу (чат, live-лог) — через autoscrollTo='bottom'.
  • Контейнер, размер которого пользователь регулирует сам — через resize='both' | 'horizontal' | 'vertical'.

Когда не использовать:

  • На весь <body> — нативный скролл окна лучше для SEO, клавиатуры и системных жестов.
  • Внутри виртуализированных списков — они уже управляют своим скроллом.
  • Для коротких блоков, которые гарантированно помещаются — лишний контейнер и JS без выгоды.

Анатомия

Size

Толщина скролл-бара: s — дефолт для панелей и плотных списков; m — для крупных поверхностей, где нужен более заметный/удобный для мыши бар.

Bar hide strategy

Когда скрывать скролл-бар: never — всегда видим; leave — скрыть при уводе курсора; scroll — видим только во время прокрутки; move — видим при движении курсора над областью.

Resize

Разрешение пользовательского resize через CSS resize: none (дефолт), horizontal, vertical, both.

Autoscroll to

Автоприлипание к краю при появлении нового контента: bottom — для чатов и лент; right — для горизонтальных лент.

Установка

pnpm add @cloud-ru/ds-scroll
import { Scroll } from '@cloud-ru/ds-scroll'

Примеры использования

Базовый скролл

Оборачивает любой контент; родитель задаёт высоту.

import { Scroll } from '@cloud-ru/ds-scroll';

export function Basic() {
  return (
    <div style={{ height: 200, width: 320 }}>
      <Scroll>
        <div style={{ padding: 8 }}>
          {Array.from({ length: 20 }, (_, i) => (
            <div key={i}>Строка контента {i + 1}</div>
          ))}
        </div>
      </Scroll>
    </div>
  );
}

Компактный размер s

Для узких областей и popover-ов.

import { Scroll } from '@cloud-ru/ds-scroll';

export function SmallSize() {
  return (
    <div style={{ height: 180, width: 280 }}>
      <Scroll size='s'>
        <div style={{ padding: 8 }}>
          {Array.from({ length: 15 }, (_, i) => (
            <div key={i}>Пункт {i + 1}</div>
          ))}
        </div>
      </Scroll>
    </div>
  );
}

Скроллбар появляется при наведении

barHideStrategy="leave" — спокойный, не отвлекающий UI.

import { Scroll } from '@cloud-ru/ds-scroll';

export function HideOnLeave() {
  return (
    <div style={{ height: 200, width: 320 }}>
      <Scroll barHideStrategy='leave'>
        <div style={{ padding: 8 }}>
          {Array.from({ length: 20 }, (_, i) => (
            <div key={i}>Строка {i + 1}</div>
          ))}
        </div>
      </Scroll>
    </div>
  );
}

Ресайзируемый контейнер

resize="both" — пользователь тянет за угол.

import { Scroll } from '@cloud-ru/ds-scroll';

export function Resizable() {
  return (
    <div style={{ height: 200, width: 320 }}>
      <Scroll resize='both'>
        <div style={{ padding: 8 }}>
          {Array.from({ length: 20 }, (_, i) => (
            <div key={i}>Контент, который можно ресайзить — {i + 1}</div>
          ))}
        </div>
      </Scroll>
    </div>
  );
}

Автоскрол вниз

Для чатов и live-логов — прилипание к низу при добавлении сообщений.

import { Scroll } from '@cloud-ru/ds-scroll';

export function AutoscrollBottom() {
  return (
    <div style={{ height: 200, width: 320 }}>
      <Scroll autoscrollTo='bottom'>
        <div style={{ padding: 8 }}>
          {Array.from({ length: 40 }, (_, i) => (
            <div key={i}>Сообщение {i + 1}</div>
          ))}
        </div>
      </Scroll>
    </div>
  );
}

Props

ScrollProps

PropTypeDefaultDescription
autoscrollTo"bottom" | "right"—Включает автоскрол при маунте и изменении размера контента:

- bottom - автоскрол вниз,

- right - автоскрол вправо,
barHideStrategy"leave" | "move" | "never" | "scroll"leaveУправление скрытием скролл баров:

- Never - показывать всегда

- Leave - скрывать когда курсор покидает компонент

- Scroll - показывать только когда происходит скроллинг

- Move - показывать при движении курсора над компонентом
childrenstring | number | boolean | ReactElement<any, string | JSXElementConstructor<any>> | Iterable<ReactNode> | ReactPortal | null | undefined—
classNamestring—
clickScrollingbooleantrueСкролить ли по клику в скроллбар.
data-test-idstring—
onInitialized(() => void)—Коллбэк вызывающийся на инициализацию скролла
onScroll((event?: Event) => void)—Колбек события скрола.
overflow{ x?: "hidden" | "scroll" | "visible" | "visible-hidden" | "visible-scroll"; y?: "hidden" | "scroll" | "visible" | "visible-hidden" | "visible-scroll"; } | undefined—Поведение overflow по осям. По умолчанию OverlayScrollbars выставляет scroll
на обе оси; если контента по оси быть не должно — передавай 'hidden'.
paddingAbsoluteboolean—Должны ли паддинги быть абсолютными
resize"both" | "horizontal" | "none" | "vertical"noneНастройка возможности регулировать Scroll-контейнер:

- None - нельзя изменять размер

- Horizontal - можно изменять размер только по горизонтали

- Vertical - можно изменять размер только по вертикали

- Both - можно изменять размер в обеих координатах
size"m" | "s"mРазмер скролбаров
untouchableScrollbarsbooleanfalseОтключает возможность взаимодействовать со скролбарами мышью.
  • AutoscrollTo = "bottom" | "right"

  • BarHideStrategy = "leave" | "move" | "never" | "scroll"

  • Resize = "both" | "horizontal" | "none" | "vertical"

  • Size = "m" | "s"

版本与发布记录

@cloud-ru/ds-scroll 共发布 32 个版本,首次发布于 2026/08/18;过去 12 个月发布了 32 个版本。

版本发布日期距今
1.0.7latest2026/11/11今天
1.0.7-preview-e8fe6b56.0preview2026/11/11今天
1.0.7-preview-c0e895ed.02026/11/11今天
1.0.7-preview-90b10112.02026/11/11今天
1.0.7-preview-fd7dd437.02026/11/101 天前
1.0.7-preview-9a75a2a9.02026/11/101 天前

关于 @cloud-ru/ds-scroll 的常见问题

@cloud-ru/ds-scroll 是什么?

Контейнер с кастомными скроллбарами, размерами s/m, стратегиями скрытия, автоскролом и опциональным ресайзом.

如何安装 @cloud-ru/ds-scroll?

在项目目录运行 npm install @cloud-ru/ds-scroll,或使用 pnpm add / yarn add / bun add。

@cloud-ru/ds-scroll 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@cloud-ru/ds-scroll 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@cloud-ru/ds-scroll 可以商用吗?

@cloud-ru/ds-scroll 使用 Apache-2.0 许可。宽松许可:允许商业使用、修改和再分发,并附带明确的专利授权;分发时需保留许可与 NOTICE 文件,修改过的文件要注明改动。以上为概括,不构成法律意见,请以许可原文为准。

@cloud-ru/ds-scroll 的下载量有多少?

根据 npm 官方下载统计,@cloud-ru/ds-scroll 在 2026/10/10 – 2026/11/08 这 30 天内被下载 13,797 次,日均约 460 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@cloud-ru/ds-scroll 还在维护吗?

最新版本 1.0.7 发布于 2026/11/11(今天);至今共发布 32 个版本,其中过去 12 个月发布了 32 个;首次发布于 2026/08/18。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。