Skip to content

Scroll 组件设计文档 ​

概述 ​

Scroll 组件是本组件库中专门用于自定义滚动条样式的容器组件。它延续了我们组件库一贯的设计理念,采用"关注点分离"和"逻辑抽象"的原则,通过 [useClassComputed] 和 [useScrollStyles]两个核心 Hooks 实现了简洁而强大的滚动条样式控制功能。

Scroll 组件专注于处理滚动条的样式定制,包括滚动条轨道颜色、滑块颜色、尺寸等属性,为用户提供了一套完整且易用的滚动条美化解决方案。

设计理念 ​

分层架构 ​

Scroll 组件严格按照三层架构设计:

  1. 结构层 scroll.vue - 负责组件的 DOM 结构和基本布局
  2. 逻辑层 scrollComputed.ts - 通过 Hooks 处理复杂的响应式计算
  3. 表现层 scroll.scss, thumb.scss - 定义组件的视觉呈现和样式规则

逻辑抽象 ​

Scroll 组件将复杂的样式逻辑抽象为两个核心 Hooks:

  • useClassComputed - 处理动态类名生成
  • useScrollStyles - 处理滚动条样式生成

这种设计使得组件本身只需要声明所需逻辑,而具体的计算由 Hooks 完成。

核心功能设计 ​

Props 结构化设计 ​

Scroll 组件的 props 按照功能划分为多个逻辑组:

typescript
// 滚动条颜色配置
const scrollColorProps = {
    thumbColor: {
        type: String,
        default: ''
    },
    thumbHoverColor: {
        type: String,
        default: ''
    },
    trackColor: {
        type: String,
        default: ''
    }
};

// 滚动条尺寸配置
const scrollSizeProps = {
    width: {
        type: String,
        default: ''
    }
};

// 容器标签配置
const scrollTagProps = {
    tag: {
        type: String,
        default: 'div'
    }
};

这种分组方式使得代码结构更加清晰,也方便后续的功能扩展。

useClassComputed 的应用 ​

Scroll 组件利用 useClassComputed Hook 来处理动态类名的生成:

typescript
const scrollClass = useClassComputed<ScrollProps>({
    baseClass: '',
    propClasses: {
        width: props.width,
        thumbColor: props.thumbColor,
        thumbHoverColor: props.thumbHoverColor,
        trackColor: props.trackColor,
    },
});

这种设计确保了类名生成的一致性和可维护性。

useScrollStyles 的应用 ​

Scroll 组件使用 useScrollStyles Hook 来处理滚动条样式生成:

typescript
const scrollStyle = useScrollStyles(props);

这种设计将复杂的滚动条样式逻辑封装在独立的 Hook 中,简化了组件本身的复杂度。

样式系统设计 ​

CSS 变量控制 ​

Scroll 组件通过 CSS 变量实现滚动条样式控制:

  1. --global-scroll-track-color - 滚动条轨道颜色
  2. --global-scroll-thumb-color - 滚动条滑块颜色
  3. --global-scroll-thumb-hover-color - 滚动条滑块悬停颜色
  4. --global-scroll-width - 滚动条宽度

WebKit 浏览器支持 ​

组件通过以下 CSS 规则支持 WebKit 浏览器的滚动条样式定制:

scss
html {
    --global-scroll-track-color: #2C2C2C;
    --global-scroll-width: 12px;

    /* Webkit 浏览器支持 */
    &::-webkit-scrollbar {
        width: var(--global-scroll-width);
    }

    // Track style
    &::-webkit-scrollbar-track {
        background-color: var(--global-scroll-track-color);
        border-radius: 10px;
    }
}

滚动条滑块样式 ​

组件还支持滚动条滑块的样式定制:

scss
html {
  --global-scroll-thumb-color: #9F9F9F;
  --global-scroll-thumb-hover-color: #D1D1D1;

  &::-webkit-scrollbar-thumb {
    background-color: var(--global-scroll-thumb-color);
    border-radius: 10px;
    border: 3px solid transparent;
    background-clip: content-box;

    &:hover {
      background-color: var(--global-scroll-thumb-hover-color);
    }
  }
}

组件结构设计 ​

Scroll 组件采用灵活的标签渲染机制:

html
<div :is="props.tag" :class="scrollClass" :style="scrollStyle">
    <slot />
</div>

这种设计允许组件渲染为不同的 HTML 元素,默认为 <div> 标签,但可以通过 tag 属性自定义为其他标签。

扩展性设计 ​

Scroll 组件具备良好的扩展性:

  1. 自定义标签支持:可通过 tag prop 渲染为不同 HTML 元素
  2. 全面样式控制:支持轨道颜色、滑块颜色、悬停颜色、宽度等完整样式设置
  3. 主题适配:通过 CSS 变量支持主题定制
  4. 灵活尺寸控制:支持自定义滚动条宽度

样式细节 ​

Scroll 组件在样式处理上有以下特点:

  1. 默认样式:提供深色主题的默认滚动条样式
  2. 圆角设计:滚动条轨道和滑块均采用圆角设计
  3. 悬停效果:滑块在悬停时会改变颜色
  4. 透明边框:滑块使用透明边框实现内容盒背景裁剪效果

性能优化 ​

通过以下方式优化性能:

  1. 使用 computed 属性缓存计算结果
  2. 将复杂逻辑移至独立的 hooks 中
  3. 避免不必要的重新渲染
  4. 使用 Vue 3 Composition API 提高运行效率

设计价值 ​

Scroll 组件延续了我们组件库的设计哲学:

  1. 关注点分离:结构、样式、逻辑完全解耦
  2. 高度复用:通过 hooks 抽象通用逻辑
  3. 易于维护:清晰的代码结构和命名规范
  4. 可扩展性强:支持丰富的定制选项
  5. 一致性:与 Button、Border、Text 等其他组件保持一致的设计语言

基于 MIT 协议