前言
随着前端项目规模的不断增大,CSS 的组织和管理变得越来越重要。传统的 CSS 编写方式往往导致样式冲突、维护困难、代码重复等问题。现代 CSS 架构通过组件化思维、模块化设计和系统化方法,为我们提供了更好的解决方案。本文将深入探讨各种 CSS 架构方法论,包括 BEM、ITCSS、CUBE CSS 等,并展示如何构建可扩展、可维护的样式系统。
1. CSS 架构方法论 API 详解
1.1 BEM (Block Element Modifier)
核心概念:
css
/* Block - 独立的功能组件 */
.button {
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
border-radius: 4px;
font-family: inherit;
cursor: pointer;
transition: all 0.2s ease;
}
/* Element - Block 的组成部分 */
.button__icon {
margin-right: 0.5rem;
font-size: 1rem;
}
.button__text {
font-weight: 500;
}
/* Modifier - Block 或 Element 的状态/变体 */
.button--primary {
background: #3b82f6;
color: white;
}
.button--secondary {
background: #e5e7eb;
color: #374151;
}
.button--large {
padding: 0.75rem 1.5rem;
font-size: 1.125rem;
}
.button--small {
padding: 0.25rem 0.75rem;
font-size: 0.875rem;
}
/* 组合使用 */
.button--primary.button--large {
box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
}
BEM 命名规则:
css
/* 标准 BEM 语法 */
.block {
}
.block__element {
}
.block--modifier {
}
.block__element--modifier {
}
/* 实际案例 */
.card {
} /* Block */
.card__header {
} /* Element */
.card__title {
} /* Element */
.card__content {
} /* Element */
.card--featured {
} /* Modifier */
.card__title--large {
} /* Element Modifier */
/* 避免过度嵌套 */
/* ❌ 错误 */
.card__header__title__text {
}
/* ✅ 正确 */
.card__header {
}
.card__title {
}
.card__text {
}
1.2 ITCSS (Inverted Triangle CSS)
层级结构:
css
/* 1. Settings - 全局变量和配置 */
:root {
--color-primary: #3b82f6;
--color-secondary: #6b7280;
--font-family-sans: system-ui, sans-serif;
--spacing-unit: 1rem;
--border-radius: 0.375rem;
}
/* 2. Tools - 混入和函数(预处理器) */
@function rem($px) {
@return ($px / 16) * 1rem;
}
@mixin visually-hidden {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
}
/* 3. Generic - 重置和规范化 */
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
line-height: 1.15;
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
font-family: var(--font-family-sans);
}
/* 4. Elements - 基础HTML元素 */
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0 0 0.5em 0;
font-weight: 600;
line-height: 1.25;
}
p {
margin: 0 0 1em 0;
line-height: 1.6;
}
a {
color: var(--color-primary);
text-decoration: underline;
}
a:hover {
color: var(--color-primary-dark);
}
/* 5. Objects - 设计模式和布局 */
.o-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--spacing-unit);
}
.o-media {
display: flex;
align-items: flex-start;
gap: var(--spacing-unit);
}
.o-media__figure {
flex-shrink: 0;
}
.o-media__body {
flex: 1;
min-width: 0;
}
/* 6. Components - UI组件 */
.c-button {
display: inline-flex;
align-items: center;
justify-content: center;
border: none;
border-radius: var(--border-radius);
font-family: inherit;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
}
.c-card {
background: white;
border-radius: var(--border-radius);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
/* 7. Utilities - 工具类 */
.u-text-center {
text-align: center !important;
}
.u-text-left {
text-align: left !important;
}
.u-text-right {
text-align: right !important;
}
.u-margin-bottom-small {
margin-bottom: 0.5rem !important;
}
.u-margin-bottom-medium {
margin-bottom: 1rem !important;
}
.u-margin-bottom-large {
margin-bottom: 2rem !important;
}
.u-visually-hidden {
@include visually-hidden;
}
1.3 CUBE CSS
CUBE 方法论:
css
/* Composition - 页面结构和布局 */
.composition {
display: grid;
gap: var(--space, 1rem);
}
.composition[data-layout='sidebar'] {
grid-template-columns: 250px 1fr;
}
.composition[data-layout='centered'] {
place-items: center;
min-height: 100vh;
}
/* Utilities - 单一职责的工具类 */
.flow > * + * {
margin-top: var(--flow-space, 1em);
}
.cluster {
display: flex;
flex-wrap: wrap;
gap: var(--space, 1rem);
justify-content: flex-start;
align-items: center;
}
.center {
box-sizing: content-box;
margin-left: auto;
margin-right: auto;
max-width: var(--measure, 60ch);
}
/* Blocks - 组件样式 */
.card {
padding: var(--space-m, 1.5rem);
background: var(--color-light);
border-radius: var(--border-radius);
}
.button {
display: inline-block;
padding: var(--space-xs) var(--space-s);
background: var(--color-primary);
color: var(--color-light);
border: none;
border-radius: var(--border-radius);
font: inherit;
cursor: pointer;
}
/* Exceptions - 特殊情况的覆盖 */
.card[data-variant='featured'] {
border: 2px solid var(--color-primary);
position: relative;
}
.card[data-variant='featured']::before {
content: 'Featured';
position: absolute;
top: 0;
right: 0;
background: var(--color-primary);
color: white;
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
transform: translate(0, -50%);
}
1.4 Atomic Design
原子设计层级:
css
/* Atoms - 原子(最小组件) */
.atom-button {
border: none;
border-radius: 4px;
font-family: inherit;
cursor: pointer;
transition: all 0.2s ease;
}
.atom-input {
border: 1px solid #d1d5db;
border-radius: 4px;
padding: 0.5rem;
font-family: inherit;
}
.atom-label {
display: block;
font-weight: 500;
margin-bottom: 0.25rem;
}
/* Molecules - 分子(原子组合) */
.molecule-field {
margin-bottom: 1rem;
}
.molecule-field .atom-label {
color: #374151;
}
.molecule-field .atom-input {
width: 100%;
}
.molecule-field .atom-input:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* Organisms - 有机体(分子组合) */
.organism-form {
background: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.organism-form .molecule-field:last-child {
margin-bottom: 0;
}
.organism-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
background: white;
border-bottom: 1px solid #e5e7eb;
}
/* Templates - 模板(页面结构) */
.template-page {
min-height: 100vh;
display: grid;
grid-template-rows: auto 1fr auto;
}
.template-page .organism-header {
grid-row: 1;
}
.template-page .organism-main {
grid-row: 2;
padding: 2rem;
}
.template-page .organism-footer {
grid-row: 3;
}
2. 实现兼容性分析
2.1 架构方法论支持情况
CSS 架构兼容性:
方法论 | 学习成本 | 维护性 | 扩展性 | 团队适用性 | 工具支持 |
---|---|---|---|---|---|
BEM | 低 ✅ | 高 ✅ | 高 ✅ | 优秀 ✅ | 优秀 ✅ |
ITCSS | 中 ⚠️ | 高 ✅ | 高 ✅ | 良好 ✅ | 良好 ✅ |
CUBE CSS | 中 ⚠️ | 高 ✅ | 高 ✅ | 良好 ✅ | 较新 ⚠️ |
Atomic Design | 高 ⚠️ | 高 ✅ | 高 ✅ | 中等 ⚠️ | 良好 ✅ |
CSS-in-JS | 高 ⚠️ | 中 ⚠️ | 中 ⚠️ | 依赖框架 | 优秀 ✅ |
CSS Modules | 低 ✅ | 高 ✅ | 中 ⚠️ | 良好 ✅ | 优秀 ✅ |
工具链生态:
工具类型 | BEM | ITCSS | CUBE | Atomic | 兼容性 |
---|---|---|---|---|---|
代码检查 | ✅ | ✅ | ⚠️ | ✅ | 良好 |
构建工具 | ✅ | ✅ | ✅ | ✅ | 优秀 |
设计系统工具 | ✅ | ✅ | ✅ | ✅ | 优秀 |
文档生成 | ✅ | ⚠️ | ⚠️ | ✅ | 中等 |
2.2 现代化集成策略
渐进式架构升级:
css
/* 传统CSS到BEM的迁移 */
/* 步骤1:识别组件边界 */
.header {
/* 转换为 .header */
}
.header ul {
/* 转换为 .header__nav */
}
.header li {
/* 转换为 .header__nav-item */
}
.header a {
/* 转换为 .header__nav-link */
}
/* 步骤2:应用BEM命名 */
.header {
background: white;
padding: 1rem 0;
}
.header__nav {
display: flex;
list-style: none;
gap: 2rem;
}
.header__nav-item {
/* 无需额外样式 */
}
.header__nav-link {
text-decoration: none;
color: #374151;
font-weight: 500;
}
.header__nav-link--active {
color: #3b82f6;
}
/* 步骤3:组件化封装 */
.header {
container-type: inline-size;
}
@container (max-width: 768px) {
.header__nav {
flex-direction: column;
}
}
CSS-in-JS 集成:
css
// styled-components with BEM-like naming
const Button = styled.button.attrs((props) => ({
className: `button ${props.variant ? `button--${props.variant}` : ''} ${
props.size ? `button--${props.size}` : ''
}`,
}))`
/* 基础样式 */
display: inline-flex;
align-items: center;
border: none;
border-radius: 4px;
font-family: inherit;
cursor: pointer;
/* 变体样式 */
&.button--primary {
background: #3b82f6;
color: white;
}
&.button--secondary {
background: #e5e7eb;
color: #374151;
}
/* 尺寸样式 */
&.button--small {
padding: 0.25rem 0.75rem;
font-size: 0.875rem;
}
&.button--large {
padding: 0.75rem 1.5rem;
font-size: 1.125rem;
}
`;
3. 实战演示:企业级组件库架构
3.1 完整的设计系统实现
html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>现代CSS架构与组件化</title>
<style>
/* ===== ITCSS Layer 1: Settings ===== */
:root {
/* Color System */
--color-primary: #3b82f6;
--color-primary-light: #93c5fd;
--color-primary-dark: #1d4ed8;
--color-secondary: #6b7280;
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Neutral Colors */
--color-white: #ffffff;
--color-gray-50: #f9fafb;
--color-gray-100: #f3f4f6;
--color-gray-200: #e5e7eb;
--color-gray-300: #d1d5db;
--color-gray-400: #9ca3af;
--color-gray-500: #6b7280;
--color-gray-600: #4b5563;
--color-gray-700: #374151;
--color-gray-800: #1f2937;
--color-gray-900: #111827;
/* Typography */
--font-family-sans: 'Inter', system-ui, -apple-system, sans-serif;
--font-family-mono: 'Fira Code', 'Monaco', monospace;
/* Font Sizes */
--font-size-xs: 0.75rem;
--font-size-sm: 0.875rem;
--font-size-base: 1rem;
--font-size-lg: 1.125rem;
--font-size-xl: 1.25rem;
--font-size-2xl: 1.5rem;
--font-size-3xl: 1.875rem;
--font-size-4xl: 2.25rem;
/* Spacing Scale */
--space-px: 1px;
--space-0: 0;
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-3: 0.75rem;
--space-4: 1rem;
--space-5: 1.25rem;
--space-6: 1.5rem;
--space-8: 2rem;
--space-10: 2.5rem;
--space-12: 3rem;
--space-16: 4rem;
/* Border Radius */
--radius-none: 0;
--radius-sm: 0.125rem;
--radius-base: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-xl: 0.75rem;
--radius-2xl: 1rem;
--radius-full: 9999px;
/* Shadows */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--shadow-base: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 /
0.1);
--shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 /
0.1);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0
0 / 0.1);
--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0
0 / 0.1);
/* Transitions */
--transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-base: 300ms cubic-bezier(0.4, 0, 0.2, 1);
--transition-slow: 500ms cubic-bezier(0.4, 0, 0.2, 1);
/* Z-Index Scale */
--z-dropdown: 1000;
--z-modal: 1010;
--z-popover: 1020;
--z-tooltip: 1030;
}
/* ===== ITCSS Layer 2: Tools ===== */
/* CSS 函数模拟 */
/* ===== ITCSS Layer 3: Generic ===== */
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
line-height: 1.15;
-webkit-text-size-adjust: 100%;
font-family: var(--font-family-sans);
}
body {
margin: 0;
padding: 0;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
color: var(--color-gray-900);
}
/* ===== ITCSS Layer 4: Elements ===== */
h1,
h2,
h3,
h4,
h5,
h6 {
margin: 0 0 var(--space-4) 0;
font-weight: 600;
line-height: 1.25;
color: var(--color-gray-900);
}
h1 {
font-size: var(--font-size-3xl);
}
h2 {
font-size: var(--font-size-2xl);
}
h3 {
font-size: var(--font-size-xl);
}
h4 {
font-size: var(--font-size-lg);
}
p {
margin: 0 0 var(--space-4) 0;
line-height: 1.6;
color: var(--color-gray-700);
}
a {
color: var(--color-primary);
text-decoration: underline;
transition: color var(--transition-fast);
}
a:hover {
color: var(--color-primary-dark);
}
/* ===== ITCSS Layer 5: Objects ===== */
.o-container {
max-width: 1200px;
margin: 0 auto;
padding: 0 var(--space-4);
}
.o-stack > * + * {
margin-top: var(--stack-space, var(--space-4));
}
.o-cluster {
display: flex;
flex-wrap: wrap;
gap: var(--cluster-space, var(--space-4));
justify-content: var(--cluster-justify, flex-start);
align-items: var(--cluster-align, center);
}
.o-media {
display: flex;
align-items: flex-start;
gap: var(--media-space, var(--space-4));
}
.o-media__figure {
flex-shrink: 0;
}
.o-media__body {
flex: 1;
min-width: 0;
}
.o-grid {
display: grid;
gap: var(--grid-gap, var(--space-4));
grid-template-columns: repeat(
var(--grid-columns, auto-fit),
minmax(var(--grid-min, 250px), 1fr)
);
}
/* ===== ITCSS Layer 6: Components ===== */
/* Button Component (BEM) */
.c-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
border: none;
border-radius: var(--radius-md);
font-family: inherit;
font-weight: 500;
text-decoration: none;
cursor: pointer;
transition: all var(--transition-fast);
user-select: none;
outline: none;
/* Default size */
padding: var(--space-2) var(--space-4);
font-size: var(--font-size-base);
min-height: 2.5rem;
}
.c-button:focus-visible {
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.5);
}
.c-button:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
}
/* Button Variants */
.c-button--primary {
background: var(--color-primary);
color: var(--color-white);
}
.c-button--primary:hover:not(:disabled) {
background: var(--color-primary-dark);
transform: translateY(-1px);
box-shadow: var(--shadow-md);
}
.c-button--secondary {
background: var(--color-gray-200);
color: var(--color-gray-900);
}
.c-button--secondary:hover:not(:disabled) {
background: var(--color-gray-300);
transform: translateY(-1px);
}
.c-button--outline {
background: transparent;
color: var(--color-primary);
border: 2px solid var(--color-primary);
}
.c-button--outline:hover:not(:disabled) {
background: var(--color-primary);
color: var(--color-white);
}
/* Button Sizes */
.c-button--small {
padding: var(--space-1) var(--space-3);
font-size: var(--font-size-sm);
min-height: 2rem;
}
.c-button--large {
padding: var(--space-3) var(--space-6);
font-size: var(--font-size-lg);
min-height: 3rem;
}
/* Card Component (BEM) */
.c-card {
background: var(--color-white);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-base);
overflow: hidden;
transition: all var(--transition-base);
}
.c-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.c-card__header {
padding: var(--space-6);
border-bottom: 1px solid var(--color-gray-200);
}
.c-card__title {
margin: 0;
font-size: var(--font-size-xl);
font-weight: 600;
color: var(--color-gray-900);
}
.c-card__subtitle {
margin: var(--space-2) 0 0 0;
color: var(--color-gray-600);
font-size: var(--font-size-sm);
}
.c-card__body {
padding: var(--space-6);
}
.c-card__footer {
padding: var(--space-6);
background: var(--color-gray-50);
border-top: 1px solid var(--color-gray-200);
display: flex;
justify-content: flex-end;
gap: var(--space-3);
}
/* Card Variants */
.c-card--featured {
border: 2px solid var(--color-primary);
position: relative;
}
.c-card--featured::before {
content: 'Featured';
position: absolute;
top: var(--space-4);
right: var(--space-4);
background: var(--color-primary);
color: var(--color-white);
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-full);
font-size: var(--font-size-xs);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
}
/* Badge Component */
.c-badge {
display: inline-flex;
align-items: center;
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-full);
font-size: var(--font-size-xs);
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
}
.c-badge--success {
background: #d1fae5;
color: #065f46;
}
.c-badge--warning {
background: #fef3c7;
color: #92400e;
}
.c-badge--info {
background: #dbeafe;
color: #1e40af;
}
.c-badge--error {
background: #fee2e2;
color: #991b1b;
}
/* Navigation Component */
.c-nav {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: var(--radius-lg);
padding: var(--space-4);
margin-bottom: var(--space-8);
box-shadow: var(--shadow-base);
}
.c-nav__content {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: var(--space-4);
}
.c-nav__brand {
font-size: var(--font-size-xl);
font-weight: 700;
color: var(--color-primary);
}
.c-nav__links {
display: flex;
gap: var(--space-6);
list-style: none;
margin: 0;
padding: 0;
}
.c-nav__link {
color: var(--color-gray-700);
text-decoration: none;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-md);
transition: all var(--transition-fast);
font-weight: 500;
}
.c-nav__link:hover,
.c-nav__link--active {
background: var(--color-primary);
color: var(--color-white);
}
/* ===== ITCSS Layer 7: Utilities ===== */
.u-text-center {
text-align: center !important;
}
.u-text-left {
text-align: left !important;
}
.u-text-right {
text-align: right !important;
}
.u-mb-0 {
margin-bottom: 0 !important;
}
.u-mb-2 {
margin-bottom: var(--space-2) !important;
}
.u-mb-4 {
margin-bottom: var(--space-4) !important;
}
.u-mb-6 {
margin-bottom: var(--space-6) !important;
}
.u-mb-8 {
margin-bottom: var(--space-8) !important;
}
.u-mt-0 {
margin-top: 0 !important;
}
.u-mt-2 {
margin-top: var(--space-2) !important;
}
.u-mt-4 {
margin-top: var(--space-4) !important;
}
.u-mt-6 {
margin-top: var(--space-6) !important;
}
.u-mt-8 {
margin-top: var(--space-8) !important;
}
.u-visually-hidden {
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0, 0, 0, 0) !important;
white-space: nowrap !important;
border: 0 !important;
}
/* Page-specific styles */
.page-header {
text-align: center;
color: var(--color-white);
margin-bottom: var(--space-8);
padding: var(--space-8) 0;
}
.page-title {
font-size: clamp(var(--font-size-2xl), 5vw, var(--font-size-4xl));
font-weight: 700;
margin-bottom: var(--space-2);
text-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.page-subtitle {
font-size: var(--font-size-lg);
opacity: 0.9;
font-weight: 400;
}
/* Responsive Design */
@media (max-width: 768px) {
.o-container {
padding: 0 var(--space-2);
}
.c-nav__content {
flex-direction: column;
text-align: center;
}
.c-nav__links {
justify-content: center;
flex-wrap: wrap;
}
.c-card__header,
.c-card__body,
.c-card__footer {
padding: var(--space-4);
}
.o-grid {
--grid-columns: 1;
}
}
/* Dark theme support */
@media (prefers-color-scheme: dark) {
:root {
--color-white: #111827;
--color-gray-50: #1f2937;
--color-gray-100: #374151;
--color-gray-900: #f9fafb;
}
}
/* Reduced motion support */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
</style>
</head>
<body>
<div class="o-container">
<!-- Page Header -->
<header class="page-header">
<h1 class="page-title">现代CSS架构与组件化</h1>
<p class="page-subtitle">构建可扩展、可维护的样式系统</p>
</header>
<!-- Navigation -->
<nav class="c-nav">
<div class="c-nav__content">
<div class="c-nav__brand">DesignSystem</div>
<ul class="c-nav__links">
<li>
<a href="#" class="c-nav__link c-nav__link--active">组件</a>
</li>
<li><a href="#" class="c-nav__link">文档</a></li>
<li><a href="#" class="c-nav__link">设计规范</a></li>
<li><a href="#" class="c-nav__link">工具</a></li>
</ul>
</div>
</nav>
<!-- Architecture Methods -->
<section class="o-stack u-mb-8" style="--stack-space: var(--space-6);">
<h2 class="u-text-center">CSS架构方法论对比</h2>
<div
class="o-grid"
style="--grid-columns: repeat(auto-fit, minmax(300px, 1fr)); --grid-gap: var(--space-6);"
>
<!-- BEM Card -->
<article class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">BEM</h3>
<p class="c-card__subtitle">Block Element Modifier</p>
<span class="c-badge c-badge--success">推荐</span>
</div>
<div class="c-card__body">
<div class="o-stack" style="--stack-space: var(--space-3);">
<p>最流行的CSS命名方法论,提供清晰的组件化思维和命名规则。</p>
<ul style="margin: 0; padding-left: var(--space-4);">
<li>学习成本低</li>
<li>团队协作友好</li>
<li>工具支持完善</li>
<li>社区活跃</li>
</ul>
</div>
</div>
<div class="c-card__footer">
<button class="c-button c-button--outline c-button--small">
了解更多
</button>
</div>
</article>
<!-- ITCSS Card -->
<article class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">ITCSS</h3>
<p class="c-card__subtitle">Inverted Triangle CSS</p>
<span class="c-badge c-badge--info">系统性</span>
</div>
<div class="c-card__body">
<div class="o-stack" style="--stack-space: var(--space-3);">
<p>倒三角形CSS架构,按特殊性递增的顺序组织样式代码。</p>
<ul style="margin: 0; padding-left: var(--space-4);">
<li>结构化程度高</li>
<li>可扩展性强</li>
<li>维护性好</li>
<li>适合大型项目</li>
</ul>
</div>
</div>
<div class="c-card__footer">
<button class="c-button c-button--outline c-button--small">
了解更多
</button>
</div>
</article>
<!-- CUBE CSS Card -->
<article class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">CUBE CSS</h3>
<p class="c-card__subtitle">
Composition Utility Block Exception
</p>
<span class="c-badge c-badge--warning">现代</span>
</div>
<div class="c-card__body">
<div class="o-stack" style="--stack-space: var(--space-3);">
<p>现代CSS架构方法,注重逻辑布局和实用工具的结合。</p>
<ul style="margin: 0; padding-left: var(--space-4);">
<li>逻辑性强</li>
<li>现代CSS友好</li>
<li>组合灵活</li>
<li>学习曲线适中</li>
</ul>
</div>
</div>
<div class="c-card__footer">
<button class="c-button c-button--outline c-button--small">
了解更多
</button>
</div>
</article>
<!-- Atomic Design Card -->
<article class="c-card c-card--featured">
<div class="c-card__header">
<h3 class="c-card__title">Atomic Design</h3>
<p class="c-card__subtitle">原子设计方法论</p>
<span class="c-badge c-badge--info">组件化</span>
</div>
<div class="c-card__body">
<div class="o-stack" style="--stack-space: var(--space-3);">
<p>从化学元素的角度组织UI组件,形成完整的设计系统。</p>
<ul style="margin: 0; padding-left: var(--space-4);">
<li>组件层次清晰</li>
<li>设计系统完整</li>
<li>复用性高</li>
<li>适合设计师协作</li>
</ul>
</div>
</div>
<div class="c-card__footer">
<button class="c-button c-button--primary c-button--small">
推荐使用
</button>
</div>
</article>
</div>
</section>
<!-- Component Demo -->
<section class="o-stack u-mb-8" style="--stack-space: var(--space-6);">
<h2 class="u-text-center">组件系统演示</h2>
<!-- Button Variants -->
<div class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">按钮组件</h3>
<p class="c-card__subtitle">展示 BEM 命名方法论的实际应用</p>
</div>
<div class="c-card__body">
<div class="o-stack" style="--stack-space: var(--space-4);">
<!-- Primary Buttons -->
<div>
<h4 class="u-mb-2">主要按钮</h4>
<div class="o-cluster">
<button class="c-button c-button--primary c-button--small">
小尺寸
</button>
<button class="c-button c-button--primary">标准尺寸</button>
<button class="c-button c-button--primary c-button--large">
大尺寸
</button>
</div>
</div>
<!-- Secondary Buttons -->
<div>
<h4 class="u-mb-2">次要按钮</h4>
<div class="o-cluster">
<button class="c-button c-button--secondary c-button--small">
小尺寸
</button>
<button class="c-button c-button--secondary">标准尺寸</button>
<button class="c-button c-button--secondary c-button--large">
大尺寸
</button>
</div>
</div>
<!-- Outline Buttons -->
<div>
<h4 class="u-mb-2">轮廓按钮</h4>
<div class="o-cluster">
<button class="c-button c-button--outline c-button--small">
小尺寸
</button>
<button class="c-button c-button--outline">标准尺寸</button>
<button class="c-button c-button--outline c-button--large">
大尺寸
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Badge Demo -->
<div class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">徽章组件</h3>
<p class="c-card__subtitle">状态指示器的多种变体</p>
</div>
<div class="c-card__body">
<div class="o-cluster">
<span class="c-badge c-badge--success">成功</span>
<span class="c-badge c-badge--warning">警告</span>
<span class="c-badge c-badge--info">信息</span>
<span class="c-badge c-badge--error">错误</span>
</div>
</div>
</div>
</section>
<!-- Code Examples -->
<section class="o-stack" style="--stack-space: var(--space-6);">
<h2 class="u-text-center">代码示例</h2>
<div
class="o-grid"
style="--grid-columns: repeat(auto-fit, minmax(400px, 1fr));"
>
<!-- BEM Example -->
<div class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">BEM 命名示例</h3>
<span class="c-badge c-badge--info">CSS</span>
</div>
<div class="c-card__body">
<pre
style="background: #1f2937; color: #e5e7eb; padding: var(--space-4); border-radius: var(--radius-md); overflow-x: auto; font-family: var(--font-family-mono); font-size: var(--font-size-sm);"
><code>/* Block */
.card {
background: white;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
/* Element */
.card__header {
padding: 1.5rem;
border-bottom: 1px solid #e5e7eb;
}
.card__title {
font-size: 1.25rem;
font-weight: 600;
}
/* Modifier */
.card--featured {
border: 2px solid #3b82f6;
}</code></pre>
</div>
</div>
<!-- ITCSS Example -->
<div class="c-card">
<div class="c-card__header">
<h3 class="c-card__title">ITCSS 层级示例</h3>
<span class="c-badge c-badge--warning">架构</span>
</div>
<div class="c-card__body">
<pre
style="background: #1f2937; color: #e5e7eb; padding: var(--space-4); border-radius: var(--radius-md); overflow-x: auto; font-family: var(--font-family-mono); font-size: var(--font-size-sm);"
><code>/* 1. Settings */
:root {
--color-primary: #3b82f6;
}
/* 2. Tools */
@mixin button-variant($bg) {
background: $bg;
}
/* 3. Generic */
* { box-sizing: border-box; }
/* 4. Elements */
button { cursor: pointer; }
/* 5. Objects */
.o-media { display: flex; }
/* 6. Components */
.c-button { /* styles */ }
/* 7. Utilities */
.u-text-center { text-align: center; }</code></pre>
</div>
</div>
</div>
</section>
</div>
<script>
// 组件交互演示
document.querySelectorAll('.c-button').forEach((button) => {
button.addEventListener('click', function () {
if (!this.disabled) {
// 点击反馈效果
this.style.transform = 'scale(0.95)';
setTimeout(() => {
this.style.transform = '';
}, 150);
// 模拟操作反馈
const originalText = this.textContent;
if (
originalText.includes('推荐') ||
originalText.includes('了解')
) {
this.textContent = '已点击!';
this.style.background = 'var(--color-success)';
setTimeout(() => {
this.textContent = originalText;
this.style.background = '';
}, 1500);
}
}
});
});
// 卡片悬停增强
document.querySelectorAll('.c-card').forEach((card) => {
card.addEventListener('mouseenter', function () {
this.style.transform = 'translateY(-4px)';
});
card.addEventListener('mouseleave', function () {
this.style.transform = '';
});
});
// 架构方法论信息
const architectureMethods = {
bem: {
name: 'BEM',
pros: ['学习成本低', '团队协作友好', '工具支持完善'],
cons: ['类名可能较长', '嵌套层级限制'],
bestFor: '中大型团队项目',
},
itcss: {
name: 'ITCSS',
pros: ['结构化程度高', '可扩展性强', '维护性好'],
cons: ['学习成本中等', '需要团队理解'],
bestFor: '大型企业级项目',
},
cube: {
name: 'CUBE CSS',
pros: ['现代CSS友好', '逻辑性强', '组合灵活'],
cons: ['相对较新', '社区资源有限'],
bestFor: '现代化项目',
},
atomic: {
name: 'Atomic Design',
pros: ['组件层次清晰', '设计系统完整', '复用性高'],
cons: ['概念抽象', '初期投入大'],
bestFor: '设计系统驱动的项目',
},
};
// 输出架构信息供开发者参考
console.log('CSS架构方法论对比:', architectureMethods);
// 性能监控
window.addEventListener('load', () => {
const componentsCount =
document.querySelectorAll('[class*="c-"]').length;
const utilitiesCount =
document.querySelectorAll('[class*="u-"]').length;
const objectsCount = document.querySelectorAll('[class*="o-"]').length;
console.log('组件统计:', {
components: componentsCount,
utilities: utilitiesCount,
objects: objectsCount,
total: componentsCount + utilitiesCount + objectsCount,
});
});
</script>
</body>
</html>
效果展示:这个完整的设计系统演示了现代 CSS 架构的各种方法论。展示了 ITCSS 层级结构、BEM 命名规范、组件化思维等。包含完整的组件库、设计系统和最佳实践,可直接用于生产环境。
4. 高级架构模式
4.1 组件状态管理
css
/* 状态驱动的组件设计 */
.c-button {
/* 基础状态 */
opacity: 1;
transform: none;
transition: all 0.2s ease;
}
/* 交互状态 */
.c-button:hover {
transform: translateY(-1px);
}
.c-button:active {
transform: translateY(0) scale(0.98);
}
.c-button:focus-visible {
outline: none;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.5);
}
/* 功能状态 */
.c-button[disabled] {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
}
.c-button[aria-pressed='true'] {
background: var(--color-primary-dark);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* 上下文状态 */
.c-button[data-loading='true'] {
position: relative;
color: transparent;
}
.c-button[data-loading='true']::after {
content: '';
position: absolute;
width: 1rem;
height: 1rem;
border: 2px solid currentColor;
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s linear infinite;
}
4.2 设计令牌系统
css
/* 设计令牌层级结构 */
:root {
/* Primitive Tokens - 原始令牌 */
--primitive-blue-50: #eff6ff;
--primitive-blue-500: #3b82f6;
--primitive-blue-600: #2563eb;
--primitive-blue-900: #1e3a8a;
--primitive-spacing-4: 1rem;
--primitive-spacing-8: 2rem;
/* Semantic Tokens - 语义令牌 */
--semantic-color-primary: var(--primitive-blue-500);
--semantic-color-primary-hover: var(--primitive-blue-600);
--semantic-color-text-primary: var(--primitive-gray-900);
/* Component Tokens - 组件令牌 */
--component-button-bg-primary: var(--semantic-color-primary);
--component-button-text-primary: white;
--component-button-padding: var(--primitive-spacing-4);
--component-button-radius: var(--primitive-radius-md);
}
/* Dark theme overrides */
[data-theme='dark'] {
--semantic-color-primary: var(--primitive-blue-400);
--semantic-color-text-primary: var(--primitive-gray-100);
}
/* High contrast theme */
[data-theme='high-contrast'] {
--semantic-color-primary: #0000ff;
--semantic-color-text-primary: #000000;
}
4.3 模块化 CSS 架构
css
/* config/_settings.css */
@import url('config/tokens.css');
@import url('config/breakpoints.css');
/* tools/_mixins.css */
@import url('tools/layout.css');
@import url('tools/typography.css');
@import url('tools/interactions.css');
/* base/_normalize.css */
@import url('base/reset.css');
@import url('base/typography.css');
/* layout/_objects.css */
@import url('layout/container.css');
@import url('layout/grid.css');
@import url('layout/stack.css');
/* components/_index.css */
@import url('components/button.css');
@import url('components/card.css');
@import url('components/form.css');
/* utilities/_index.css */
@import url('utilities/spacing.css');
@import url('utilities/typography.css');
@import url('utilities/display.css');
/* 条件加载 */
@media (prefers-reduced-motion: reduce) {
@import url('utilities/no-motion.css');
}
@supports (container-type: inline-size) {
@import url('enhancements/container-queries.css');
}
总结
现代 CSS 架构为大型项目提供了可持续的解决方案:
- 系统化方法论:BEM、ITCSS、CUBE CSS 等提供不同的组织策略
- 组件化思维:模块化设计,提高代码复用性和维护性
- 可扩展架构:支持团队协作和项目增长
- 标准化流程:统一的命名规范和开发流程
- 现代化特性:与新 CSS 特性和工具链良好集成
选择建议:
- 小型项目:简化的 BEM + 基础工具类
- 中型项目:完整 BEM + ITCSS 结构
- 大型项目:ITCSS + Atomic Design + 设计令牌
- 现代项目:CUBE CSS + Container Queries + CSS-in-JS
最佳实践:
- 建立清晰的命名规范和文档
- 使用设计令牌实现一致性
- 重视组件的可访问性和语义化
- 定期重构和优化架构结构
掌握现代 CSS 架构,让您的样式系统更加专业和可持续!