模块化架构的可扩展CSS

57 阅读2分钟

SMACSS,全称为“Scalable and Modular Architecture for CSS”。提供一个分类系统和一套指导方针,用于组织大型项目的 CSS 代码,提高整个项目 CSS 的可预测性、可维护性和扩展性。

分类系统

把样式系统划分为五个具体类型。

Base 基础:定义元素的默认样,为项目提供一致的基础外观。

  • 只使用元素选择器、伪类选择器、属性选择器、后代选择器、子选择器。
  • 避免使用 !important 和类选择器。

Layout 布局:定义页面的骨架结构,构建页面的整体框架。

  • 通常使用以 l-layout- 为前缀的类名(可选但推荐,用于清晰区分)。
  • 样式主要涉及宽度、浮动、清除浮动、定位、显示属性、内外边距(布局相关)、Flexbox 或 Grid 属性。

Module 模块:核心和主题,可复用的、独立的组件。构建页面的具体内容快。

  • 模块名通常使用单一类名(如 .media, .card, .btn, .tabs)。
  • 模块的子元素使用后代选择器( .module-name > child.module-name-child)。推荐使用子选择器 > 限制范围。避免使用元素选择器(如 .card div),使用类选择器(如 .card-content)。
  • 模块内部避免使用 ID 选择器。
  • 模块应尽可能独立于其所在的布局上下文。

State 状态:描述模块或布局在特定状态下的样式变化。

  • 通常使用以 is-has-s- 为前缀的类名(如 .is-active, .is-hidden, .has-error, .is-loading)。
  • 状态类通常通过 JavaScript 动态添加/移除。
  • 状态样式可以覆盖任何 Base、Layout 或 Module 的样式。它们通常具有更高的优先级(可能使用 !important,尤其是在覆盖第三方库时,但应谨慎使用)。

Theme 主题:可选的视觉外观层,实现主题更换。

  • 通常使用以 theme- 为前缀的类名。

指导方针

  • 深度限制: 建议选择器嵌套深度不超过 2-3 层(例如 .module > .child 或 .module-child)。避免 .layout .module .child .grandchild 这样的深层次选择器。

  • 最小化特异性: 优先使用类选择器。避免过度依赖 ID 选择器(特异性过高,难以覆盖)。在 State 层才考虑使用 !important(有节制地)。

  • 命名约定: 强烈推荐使用命名空间前缀(l- 表示 Layout, is- 表示 State)来清晰区分类别,提高代码可读性和可维护性。