--- name: component-styling description: Component style templates and BEM naming for vehicle insurance platform. Use when styling Vue components, implementing BEM classes, creating responsive layouts, or writing scoped CSS. Keywords: BEM naming, component styles, KpiCard, FilterPanel, scoped CSS, responsive design, card styles, button styles, form controls. allowed-tools: Read, Edit, Grep, Glob --- # Component Styling - 组件样式规范 车险签单数据分析平台的组件样式模板和BEM命名规范。 --- ## 🧩 组件样式模板 ### 1. 卡片样式 (Card) **基础卡片模板**: ```vue ``` --- ### 2. 按钮样式 (Button) **按钮变体模板**: ```vue ``` --- ### 3. 表单控件 (Form Controls) **输入框模板**: ```vue ``` --- ### 4. 图表容器 (Chart Container) **ECharts容器模板**: ```vue ``` --- ## 🏷️ BEM 命名规范 ### 基础规则 **命名格式**: - **Block**: `.block` - **Element**: `.block__element` - **Modifier**: `.block--modifier` 或 `.block__element--modifier` **分隔符**: - `__` (双下划线): 元素分隔符 - `--` (双中划线): 修饰符分隔符 - `-` (单中划线): 词语分隔符(多个单词) --- ### KPI 卡片示例 ```html

签单保费

1,234,567
+12.5%
``` **CSS**: ```css /* Block */ .kpi-card { /* ... */ } /* Element */ .kpi-card__header { /* ... */ } .kpi-card__title { /* ... */ } .kpi-card__main { /* ... */ } .kpi-card__value { /* ... */ } .kpi-card__trend { /* ... */ } .kpi-card__trend-icon { /* ... */ } .kpi-card__trend-text { /* ... */ } .kpi-card__chart { /* ... */ } .kpi-card__chart-canvas { /* ... */ } /* Modifier */ .kpi-card__trend--up { color: var(--status-success); } .kpi-card__trend--down { color: var(--status-warning); } .kpi-card__trend--neutral { color: var(--status-neutral); } ``` --- ### 命名示例表 | 场景 | 正确 ✅ | 错误 ❌ | |------|---------|---------| | 块 | `.card` | `.Card`, `.CARD` | | 元素 | `.card__header` | `.card-header`, `.cardHeader` | | 修饰符 | `.card--large` | `.card-large`, `.cardLarge` | | 多词元素 | `.card__price-tag` | `.card__priceTag`, `.card__price_tag` | | 状态修饰符 | `.button--disabled` | `.button-disabled`, `.disabled` | --- ### 常见反模式 ❌ **避免过深嵌套**: ```html
标题
``` ✅ **扁平化元素**: ```html
标题
``` --- ## 📱 响应式设计 ### 断点系统 **3级断点**: ```css /* 移动端 (默认) */ @media (max-width: 767px) { /* Mobile styles */ } /* 平板端 */ @media (min-width: 768px) and (max-width: 1023px) { /* Tablet styles */ } /* 桌面端 */ @media (min-width: 1024px) { /* Desktop styles */ } ``` --- ### Dashboard 布局示例 **移动端** (单列): ```css /* 移动端(默认) */ .dashboard { display: flex; flex-direction: column; gap: var(--space-4); padding: var(--space-4); } .dashboard__kpi-grid { display: grid; grid-template-columns: 1fr; /* 单列 */ gap: var(--space-4); } ``` **平板端** (2列): ```css @media (min-width: 768px) { .dashboard { padding: var(--space-6); } .dashboard__kpi-grid { grid-template-columns: repeat(2, 1fr); /* 2列 */ } } ``` **桌面端** (3列): ```css @media (min-width: 1024px) { .dashboard { padding: var(--space-8); } .dashboard__kpi-grid { grid-template-columns: repeat(3, 1fr); /* 3列 */ } } ``` --- ### 响应式字体 **流式字体**: ```css .kpi-card__value { font-size: clamp(1.5rem, 4vw, 2.5rem); /* 最小24px, 理想4vw, 最大40px */ } ``` **断点字体**: ```css .heading { font-size: var(--text-xl); /* 移动端: 20px */ } @media (min-width: 768px) { .heading { font-size: var(--text-2xl); /* 平板: 24px */ } } @media (min-width: 1024px) { .heading { font-size: var(--text-3xl); /* 桌面: 30px */ } } ``` --- ## ✅ 最佳实践 ### 1. Scoped 样式 ```vue ``` --- ### 2. BEM 命名 ```css /* ✅ 正确 */ .kpi-card { } .kpi-card__header { } .kpi-card__title { } .kpi-card__value--up { } /* ❌ 错误 */ .card { } .cardHeader { } ``` --- ### 3. 响应式设计 (移动优先) ```css /* ✅ 推荐: 移动优先 */ .grid { grid-template-columns: 1fr; /* 移动端默认 */ } @media (min-width: 768px) { .grid { grid-template-columns: repeat(2, 1fr); /* 平板 */ } } /* ❌ 不推荐: 桌面优先 */ .grid { grid-template-columns: repeat(3, 1fr); } @media (max-width: 1023px) { .grid { grid-template-columns: repeat(2, 1fr); } } ``` --- ## 🔗 相关资源 ### 关键文档位置 - [frontend/src/components/dashboard/KpiCard.vue](../../frontend/src/components/dashboard/KpiCard.vue) - KPI卡片组件 - [frontend/src/components/dashboard/FilterPanel.vue](../../frontend/src/components/dashboard/FilterPanel.vue) - 筛选面板组件 ### 相关 Skills - [css-design-tokens](../css-design-tokens/SKILL.md) - CSS变量和颜色系统 - [vue-component-dev](../vue-component-dev/SKILL.md) - Vue组件开发 ### 外部参考 - [BEM官方文档](http://getbem.com/) - [响应式设计最佳实践](https://web.dev/responsive-web-design-basics/) --- ## ✅ 总结 ### 核心要点 1. **组件模板**: 卡片/按钮/表单/图表容器 2. **BEM命名**: `.block__element--modifier` 3. **响应式**: 移动优先, 768px / 1024px断点 4. **Scoped CSS**: 避免样式污染 5. **CSS变量**: 使用设计Token,不硬编码 ### 适用场景 ✅ **适用**: - 创建新组件样式 - 修改现有组件样式 - 实现响应式布局 - BEM命名规范 ❌ **不适用**(请使用其他Skills): - 定义CSS变量 → `css-design-tokens` - Vue组件逻辑 → `vue-component-dev` --- **文档维护者**: Claude Code AI Assistant **创建日期**: 2025-11-09 **下次审查**: 2025-11-23