Skip to content

Scroll 滚动容器

说实话,我也不知道现代这些浏览器怎么搞的,发展了几十年了,滚动条样式居然还这么丑,害的我不仅要优化滚动条样式,还要想方设法地优化滚动条性能。

基础用法

跟在普通的容器里面一样,给容器设置高度即可。

控制滚动

通过滚动条暴露的 api 可以控制滚动。

其实更好地做法是通过el.scrollIntoView来控制,但是没办法写都写好了,演示一下。

属性

ts
/** 滚动条组件属性 */
interface ScrollProps {
  /**
   * 容器元素标签名
   * @default div
   */
  tag?: string
  /**
   * 容器高度
   * @default 100%
   */
  height?: string | number

  /**
   * 总是显示滚动条
   * @default false
   */
  always?: boolean

  /**
   * 内容样式
   */
  contentStyle?: string | CSSProperties

  /**
   * 容器样式
   */
  containerStyle?: string | CSSProperties

  /** 内容类名 */
  contentClass?: unknown

  /** 容器类名 */
  containerClass?: string | string[]

  /** 拖拽防抖时间 */
  dragDebounce?: number
}

事件

ts
type ScrollPosition = {
  /** 横向位置 */
  x?: number
  /** 纵向位置 */
  y?: number
  /** 横向滚动宽度 */
  sw?: number
  /** 纵向滚动高度 */
  sh?: number
  /** 横向可视宽度 */
  cw?: number
  /** 纵向可视高度 */
  ch?: number
}

interface ScrollEmits {
  /** 滚动事件 */
  (e: 'scroll', position: Required<ScrollPosition>): void
  /** 尺寸调整事件 */
  (e: 'resize', targets: HTMLElement[]): void
}

暴露的属性和方法

ts
interface ScrollExposed {
  /**
   * 滚动至
   * @param position 位置
   */
  scrollTo(position: ScrollPosition): void

  /**
   * 更新滚动条状态
   */
  update(): void

  /** 滚动内容元素引用 */
  contentRef?: HTMLElement

  /** 滚动容器元素引用 */
  containerRef?: HTMLElement

  /** 滚动容器元素引用 */
  el?: HTMLElement
}

基于 MIT 协议