---
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
{{ error }}
```
---
### 4. 图表容器 (Chart Container)
**ECharts容器模板**:
```vue
```
---
## 🏷️ BEM 命名规范
### 基础规则
**命名格式**:
- **Block**: `.block`
- **Element**: `.block__element`
- **Modifier**: `.block--modifier` 或 `.block__element--modifier`
**分隔符**:
- `__` (双下划线): 元素分隔符
- `--` (双中划线): 修饰符分隔符
- `-` (单中划线): 词语分隔符(多个单词)
---
### KPI 卡片示例
```html
```
**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