> 适用于:制作数据看板、可视化报表、数据长图、运营驾驶舱类页面时遵循的统一设计规范。
> 风格定位:冰蓝毛玻璃 · 柔光渐变 · 轻质浮层 · 呼吸感留白。
整体风格关键词:冰蓝毛玻璃 · 柔光渐变 · 轻质浮层 · 呼吸感留白。
设计语言偏向 Apple Human Interface Guidelines 的"材质"理念——半透明叠加、饱和度增强模糊、极浅投影、大圆角、渐变光晕背景。
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC',
'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
color: #1a2332;
min-height: 100vh;
position: relative;
background:
radial-gradient(ellipse 800px 600px at 15% 10%, rgba(165,195,245,.55), transparent 60%),
radial-gradient(ellipse 700px 500px at 85% 20%, rgba(140,175,235,.5), transparent 60%),
radial-gradient(ellipse 900px 700px at 50% 60%, rgba(175,200,250,.55), transparent 65%),
radial-gradient(ellipse 600px 500px at 80% 75%, rgba(210,190,240,.45), transparent 60%),
radial-gradient(ellipse 650px 500px at 20% 80%, rgba(150,185,240,.5), transparent 60%),
linear-gradient(135deg, #edf2fb 0%, #e8eef8 100%);
background-attachment: fixed;
}
background-attachment: fixed 保证滚动时背景不动,产生视差深度body::before, body::after {
content: '';
position: fixed;
border-radius: 50%;
pointer-events: none;
z-index: 0;
filter: blur(60px);
}
body::before {
width: 700px; height: 700px; top: -150px; left: -100px;
background: radial-gradient(circle, rgba(160,190,245,.4), transparent 70%);
animation: float1 22s ease-in-out infinite;
}
body::after {
width: 650px; height: 650px; bottom: -200px; right: -100px;
background: radial-gradient(circle, rgba(160,170,235,.35), transparent 70%);
animation: float2 26s ease-in-out infinite;
}
@keyframes float1 {
0%,100% { transform: translate(0,0) scale(1) }
50% { transform: translate(60px,40px) scale(1.08) }
}
@keyframes float2 {
0%,100% { transform: translate(0,0) scale(1) }
50% { transform: translate(-50px,-60px) scale(1.1) }
}
:root {
/* 卡片 */
--card: rgba(255,255,255,.45);
--card-hover: rgba(255,255,255,.6);
--card-solid: #fff;
/* 边框 */
--border: rgba(255,255,255,.5);
--border-soft: rgba(200,210,230,.35);
/* 文字三级 */
--text: #1a2332; /* 标题/主体数值 */
--text2: #5a6a80; /* 卡片标题/次要文字 */
--text3: #8c9ab0; /* 标签/辅助说明 */
/* 色板 */
--blue: #4a7cff;
--blue2: #6c9cff;
--green: #22c55e;
--amber: #f59e0b;
/* 圆角 */
--radius: 18px; /* 卡片 */
--radius-sm: 10px; /* 按钮/输入框/小组件 */
/* 阴影 */
--shadow: 0 4px 24px rgba(80,100,160,.08);
--shadow-lg: 0 12px 40px rgba(80,100,160,.12);
}
| 用途 | 色值 | 说明 |
|---|---|---|
| ------ | ------ | ------ |
| 主色 | #4a7cff | 蓝,链接/按钮/选中态/装饰线默认色 |
| 辅色 | #6c9cff | 浅蓝,渐变终点/图表第二色 |
| 成功/增长 | #22c55e | 绿 |
| 警告/次分类 | #f59e0b | 琥珀橙 |
| 独立模块 | #c084fc | 紫,仅在独立图表中单独使用 |
| 补充色 | #14b8a6 | 青 |
| 同图第二色 | #f59e0b / #d97706 | 蓝+X 同图时用橙,不用紫 |
| 层级 | 字号 | 字重 | 色值 |
|---|---|---|---|
| ------ | ------ | ------ | ------ |
| 一级标题(section-title) | 17px | 700 | --text |
| 卡片标题 | 14px | 600 | --text2 |
| 数值(大) | 22-26px | 800 | --text |
| 数值单位 | 11-13px | 500 | --text3 |
| 标签/说明 | 11px | 400 | --text3 |
| 正文/表格 | 13px | 400 | --text |
| 增长标记 | 10.5px | 500 | --green / 红 |
.card {
background: var(--card); /* rgba(255,255,255,.45) */
backdrop-filter: saturate(180%) blur(20px);
-webkit-backdrop-filter: saturate(180%) blur(20px);
border: 1px solid var(--border); /* rgba(255,255,255,.5) */
border-radius: var(--radius); /* 18px */
padding: 20px 24px;
box-shadow: var(--shadow);
transition: all .3s;
}
.card:hover {
background: var(--card-hover); /* rgba(255,255,255,.6) */
box-shadow: var(--shadow-lg);
transform: translateY(-1px);
}
saturate(180%) blur(20px) 先增饱和再模糊,颜色更鲜润.topbar {
position: sticky; top: 0; z-index: 300;
background: rgba(255,255,255,.4);
backdrop-filter: saturate(180%) blur(20px);
border-bottom: 1px solid var(--border);
}
.control {
background: rgba(255,255,255,.55);
backdrop-filter: blur(10px);
border: 1px solid var(--border);
border-radius: var(--radius-sm); /* 10px */
}
.panel {
background: rgba(255,255,255,.95); /* 接近不透明,保证可读 */
backdrop-filter: saturate(180%) blur(20px);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 12px 40px rgba(30,40,60,.15); /* 比卡片更深 */
}
section-title 一级标题::before 伪元素,3px × 14px,圆角 2px)margin-left:auto 推到右端1fr 1fr 等宽3fr 2fr 或 2fr 3fr1fr 2frrepeat(3, 1fr)aspect-ratio: 2/1 + min-height: 180pxareaColor: 'inherit'),只叠加白色描边 + 阴影根据数据性质 → 图表类型选择,不要乱配:
| 数据需求 | 推荐图表 | 说明 |
|---|---|---|
| --------- | --------- | ------ |
| 时间序列趋势(UV/PV、日活、某指标随日期变化) | 折线图 | 平滑曲线 + 渐变填充,多指标叠加用不同色折线 |
| 多时间点对比累积量(新增 vs 累计) | 面积图(堆叠/重叠) | 趋势感 + 量级感 |
| 分类对比(对象排行、来源量级) | 水平条形图 或 表格 | 类别多(>5)用表格+进度条,少用柱状 |
| 结构占比(两/三/四分类的比例) | 环图(doughnut,cutout 70%) | 不用饼图实心;2-4 类别最合适 |
| 细分下钻(一级分类 → 二级明细) | 双环联动 或 环图 + 图例列表 | 左主图点击联动右细分图 |
| 目标完成度 / 进度 | 水平堆叠进度条 | 已完成段 + 待完成段;不用 Gauge |
| 地域分布 | ECharts 中国地图(choropleth) | visualMap 蓝色深浅,禁用 select |
| 时段分布(24 小时) | 热力格子 12×2 网格 | 不用 ECharts heatmap,CSS grid 即可 |
| 转化漏斗(曝光→点击→转化) | 水平漏斗 或 条形阶梯 | 每级显示绝对值+转化率 |
| 多指标并列(多个核心数字) | 指标卡网格 stat-metric | 不画图,大数值+标签 |
| 文本型排行 / 榜单 | 表格(detail-table) | 序号、名称、多列数值,支持分页 |
| 留存率(次日/7日/30日) | 大数字 + 标签 retention-item | 不画图,简洁明确 |
选型红线:
单张图表的容器尺寸(卡片内的 chart-wrap):
| 图表类型 | 宽度 | 高度规则 | min-height |
|---|---|---|---|
| --------- | ------ | --------- | ----------- |
| 折线/柱状/面积 | 100% | aspect-ratio: 2/1 | 180px |
| 环图(单个) | width: 130-160px 方形 | 同宽 | — |
| 双环并列 | 每侧各占 50% | canvas-box 130×130 固定 | — |
| 中国地图 | 100% | 固定 360-400px | 360px |
| 热力图(24×2) | 100% | 按 repeat(12,1fr) gap:4px 自然撑开 | — |
| 漏斗图 | 100% | 每级 36-42px 高 × N 级 | — |
卡片内嵌多元素时的行高:
20px 24px并排卡片的行高对齐:
响应式断点下的图表缩放:
max-width: 1024px:双列变单列,图表宽度自动扩展到满宽,高度按 aspect-ratio 重算max-width: 640px:地图高度可降至 280px;环图 canvas 降至 110×110maintainAspectRatio: false + responsive: true每次新增卡片、新增横向数据、改变栅格比例时,必须显式检查以下三项:
| 检查项 | 要求 |
|---|---|
| -------- | ------ |
| grid/flex 容器的 gap | 不仅设 grid-template-columns,必须同时设 gap(建议 14-18px);单列布局下 gap 变成上下间距,同样必须合理 |
| 响应式断点覆盖 | inline style 的 grid 布局必须换成 class,以便在 @media(max-width:1024px) 下覆盖为单列;忘记覆盖会导致移动端拥挤 |
| 卡片 class 是否与看板风格匹配 | B 端用 .stat-group-body / .stat-metric,产品看板用 .health-grid / .health-metric / .ai-stat-row,不要混用(混用会塌样式) |
常见翻车:
‹ 1/N › 居中| 禁止项 | 说明 |
|---|---|
| -------- | ------ |
| 居中数据指标 | 一律居左 |
| 标题下虚线 | 不加 dashed border |
| 无意义 badge | 不加装饰标签 |
| 地图 hover 变色 | 只描边阴影 |
| 图表写死高度 | 用 aspect-ratio |
| 冗余前缀 | 子标题去重复 |
| 过大占位图 | 小尺寸 |
| 内部过程信息 | 不写进输出物 |
| 纯白/纯灰背景 | 必须用冰蓝渐变光晕背景 |
| 实色不透明卡片 | 必须用半透明毛玻璃 |
| 粗黑边框 | 边框只用半透明白/浅灰 |
createPager() 统一分页共 3 个版本