设计稿还原:从 Figma 到真实大屏

说实话,很多前端同学看到设计稿就头疼。尤其是大屏项目,动不动就是 1920x1080 的固定尺寸,设计师还喜欢用各种奇奇怪怪的字体和间距。我刚开始做大屏时也踩过不少坑,今天就把这些经验掰开揉碎了讲给你听。

Figma/蓝湖设计稿分析:别急着写代码

拿到设计稿,我习惯先花 15 分钟做「设计稿体检」。不是看颜色好不好看,而是分析布局结构。

核心思路:把设计稿拆成「行」和「列」,再决定用 Grid 还是 Flexbox。

举个例子,一个典型的大屏通常长这样:

  • 顶部:标题 + 时间(一行)
  • 中部:左侧图表 + 中间地图 + 右侧图表(三列)
  • 底部:数据滚动条或底部图表(一行)

你看,这不就是 Grid 的天然应用场景吗?行和列都清清楚楚。

我个人习惯在 Figma 里用「测量工具」先量一下各区域的占比。比如左侧占 25%,中间占 50%,右侧占 25%。这些比例在写 CSS 时直接转成 fr 单位就行。

小技巧:Figma 里按住 Alt 键可以快速测量元素间距。蓝湖的话,直接点元素就能看到尺寸和边距。

CSS Grid 实战:大屏布局的骨架

大屏项目我几乎必用 Grid。为什么?因为 Grid 天生就是做「二维布局」的。Flexbox 是一维的,处理行或列没问题,但遇到行和列交叉的情况就有点吃力了。

来看一个实际的大屏布局代码:

.dashboard {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: 80px 1fr 60px;
  gap: 16px;
  height: 100vh;
  padding: 16px;
}

.header {
  grid-column: 1 / -1;  /* 跨三列 */
  grid-row: 1;
}

.map-area {
  grid-column: 2;
  grid-row: 2;
}

.left-panel {
  grid-column: 1;
  grid-row: 2;
}

.right-panel {
  grid-column: 3;
  grid-row: 2;
}

.footer {
  grid-column: 1 / -1;
  grid-row: 3;
}

嗯,这里要注意:grid-column: 1 / -1 的意思是「从第一列开始,到最后一列结束」。这样顶部和底部就能横跨整个屏幕。

我在项目中遇到过一个问题:设计师给的间距是 20px,但大屏在不同分辨率下看起来间距忽大忽小。后来我改用 gap: 1vw,让间距跟着视口宽度走,效果就好多了。

Flexbox 实战:搞定内部细节

Grid 管大局,Flexbox 管细节。说白了,Grid 是「骨架」,Flexbox 是「血肉」。

比如左侧面板里有三个图表卡片,垂直排列。用 Flexbox 就很简单:

.left-panel {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.chart-card {
  flex: 1;  /* 每个卡片等分高度 */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

你想想看,如果这里用 Grid 去写,反而要定义行高,不够灵活。Flexbox 的 flex: 1 自动均分剩余空间,省事多了。

避坑指南:我曾经在 Flexbox 里嵌套 Grid,又在 Grid 里嵌套 Flexbox,结果嵌套太深,浏览器渲染卡顿。后来我给自己定了个规矩:最多嵌套三层。超过三层就考虑抽组件。

响应式大屏适配方案:别只用 rem

说到大屏适配,很多人第一反应就是 rem。但 rem 有个问题:它基于根字体大小,而大屏的缩放逻辑其实更接近「等比缩放」。

我个人推荐三种方案,按场景选:

方案 适用场景 优点 缺点
vw/vh 单位 全屏大屏 直接等比缩放,简单粗暴 小屏上文字可能太小
transform: scale() 固定尺寸设计稿 完美还原设计稿 交互区域会偏移
CSS 媒体查询 + clamp() 混合场景 精细控制每个断点 代码量较大

我最常用的是 vw/vh 方案。比如设计稿是 1920x1080,那么:

/* 设计稿上 100px 的宽度 */
width: calc(100 / 1920 * 100vw);

/* 设计稿上 16px 的字体 */
font-size: calc(16 / 1920 * 100vw);

但有个坑:如果屏幕比例不是 16:9,内容会被拉伸。我一般会加一个 max-widthmax-height 来兜底。

我的习惯:写一个 Sass 函数,自动把 px 转成 vw。比如 font-size: vw(16);,这样写起来快,后期改设计稿也方便。

实战案例:一个完整的大屏适配流程

光说不练假把式。咱们走一遍完整流程:

  1. 分析设计稿:打开 Figma,看布局结构。顶部导航 + 三列内容 + 底部状态栏。
  2. 定 Grid 骨架grid-template-columns: 1fr 2fr 1fr,中间地图区域占两倍宽度。
  3. 写 Flexbox 细节:每个面板内部用 Flexbox 排列图表卡片。
  4. 做适配:用 vw 单位写尺寸,用 clamp() 限制最大最小值。
  5. 测试:在 1920x1080、1366x768、2560x1440 三个分辨率下跑一遍。

为什么会强调这三个分辨率?因为这是大屏项目最常见的三种屏幕。我遇到过客户现场是 2560 的带鱼屏,结果页面两边全是空白。后来加了 max-width: 1920px 居中显示,才解决问题。

核心总结:Grid 定大局,Flexbox 管内部,vw 做适配。这三板斧用好了,大屏设计稿还原基本不会出大问题。

好了,这一章的内容就到这。下一章咱们聊聊「数据对接与动态渲染」,到时候会讲到怎么把真实数据塞进这些图表里。记得提前准备好你的 API 接口文档。