Material Design 这个名字,做界面设计和客户端开发的人基本都绕不开。我第一次接触到这套风格,还是在安卓 5.0 的时代,当时被那种“纸片浮起来”的视觉语言震撼到了:一个卡片可以有投影,点击有波纹,按钮像真的被按下去一样。后来我做了几年移动端 UI,也带过前端项目,越来越觉得 Material Design 不只是一套组件皮肤,它是一整套关于“信息怎么排布、层级怎么建立、交互怎么反馈”的方法论。这篇内容我就以自己的实际使用经验为线索,聊聊这套设计风格的底层逻辑、核心要素,以及落地时容易踩的坑。不管你是 UI 新人、客户端开发,还是做前端适配,应该都能拿到一些能直接用的东西。
1. Material Design 到底在解决什么问题
1.1 一套可以“触摸”的设计隐喻
早期的界面设计有一个明显的痛点:设计师和开发者都知道层级重要,但“层级”很难直观表达。文字阴影、背景深浅、边框粗细,每个人都有自己的习惯,最后做出来的页面经常是各搞一套。Material Design 最聪明的地方,是引入了“纸片”和“墨水”这两个物理隐喻。
纸片是什么?是承载内容的卡片、对话框、底部弹层、悬浮按钮。墨水是什么?是文字、图标、颜色和纹理。纸片之间可以叠放,叠得越高,离手指越近,投影越深。这种隐喻的好处是:所有人一听就懂。设计师不用解释“这里需要一个两像素的描边来区分区块”,只需要说“这层比那层高一级”,团队成员立刻就会去调整投影和 z 轴位置。
从开发角度理解,这个隐喻直接对应了一个关键概念:高度层级。在安卓系统里,我们有 elevation 的概念,在 Flutter 里也有 elevation 参数,在 Web 端可以用 box-shadow 模拟。它不是让设计师随便画阴影,而是给阴影建立了一套相对关系。关系对了,投影数值多少反而没那么重要。
1.2 跨设备、跨平台的秩序感
另一个让我佩服的点,是 Material Design 从一开始就没打算只服务手机端。大家现在都在提“多端一致”,可十年前大多数设计规范都是某个 App 内部的事情。Material Design 直接把适配范围扩大到手机、平板、桌面端、电视甚至手表,并且很早就给出了响应式布局的建议。
为什么这一点重要?因为界面设计最怕的不是“丑”,而是“乱”。同一个产品,手机上一套结构,平板上一套结构,网页上又一套结构,用户换设备后认知成本极高。Material Design 解决的,就是让同一套色彩、字体、间距、组件语言在不同屏幕上保持可预测的秩序感。你不需要知道每个平台的原生规范,只要套用 Material 的尺度体系,至少不会被骂“这看起来不像自家产品”。
1.3 为大规模协作提供“通用语言”
做中大型项目的人都会遇到一个问题:设计师和开发之间,互相听不太懂。设计师说“这个卡片要有点悬浮感”,开发问“那到底几像素的阴影”。设计师说“主色用品牌蓝”,开发问“那按压态用什么蓝”。
Material Design 把这些问题变成了表格和 token。颜色有主色、辅色、背景色、表面色,层级有明确的间距单位和投影档位。设计师在 Figma 里用一套设计规范,开发在代码里用同一套语义变量,两边甚至不需要反复对齐细节。这种“语义化”的思路,后来也被很多设计系统借鉴,但 Material 是做得最早、沉淀最完整的那批。
2. 设计语言的核心拆解
2.1 海拔与阴影:层级“长”在纸面上
很多人对 Material Design 的理解,停留在“圆角卡片 + 彩色按钮”。但实际上,海拔系统才是整个风格的骨架。
海拔用 z 轴表示,和 Photoshop 里的图层概念类似,但更强调整体的相对关系。具体参考值可以这样记:
- 静态组件:卡片、列表项,推荐海拔 1 到 4 dp,投影要淡。
- 交互上升态:被拖动、被点按的卡片,推荐 8 dp 到 12 dp,投影明显增强。
- 临时浮层:对话框、底部抽屉、菜单,推荐 16 dp 到 24 dp。
- 最重要的操作(FAB 悬浮按钮)通常被放在 6 dp 左右,保证伸出手指最容易触达。
阴影不只是尺寸问题。Material Design 里的阴影有两个方向:底部垂直投影和边缘阴影。垂直投影与光源方向相关,边缘阴影与组件厚度相关。实际开发时,我们通常用 elevation 或者水平垂直偏移来控制。如果你发现界面上所有东西都在飘,那多半是阴影给得太多,而不是给得太重。
2.2 颜色系统:从“主色”到“色彩容错”
颜色是设计风格里最容易翻车的部分。Material Design 推荐的做法是:选择两个基础色,一个是主色,一个是辅色,再配合表面色、背景色、错误色等语义色。
主色承担的是大面积的品牌感,经常用在顶部栏、选中态和主要按钮上。辅色用于强调和对比,通常用在 FAB、特殊标签、促销类元素上。真正的高级感来自大量留白和低饱和度的背景色,而不是把所有地方都刷成品牌色。
关于对比度,我有一条实操经验:正文文字和背景的对比度至少要满足 WCAG AA 标准,也就是 4.5:1 左右;大号文字和图形元素可以放宽到 3:1。很多新手怕“不够颜色突出”,反而选了浅色背景加深色文字,这没问题,但要注意文字不要用纯黑,Pure black 往往显得死板,Material 推荐使用带有一定透明度的深灰色,比如rgba(0,0,0,0.87),视觉上会舒服很多。
2.3 字体与间距:网格感从哪来
Material Design 一开始使用过很多字体方案,后来统一成了可变字体体系。中文环境下,我们通常的做法是保留系统默认字体,同时用“字重 + 字号 + 行高”的组合来形成层次。
需要注意一个误区:不是“标题字号最大,正文其次,辅助信息最小”就够的。层级还需要通过字重和字间距来区分。比如大标题用 600 或 700 字重,行高紧一点;正文用 400 字重,行高松一点。辅助说明可以加大字间距和降低对比度,但不要低于 12px,否则在手机屏幕上会很难读。
间距方面,我这里直接给一套实践中好用的参数:
| 场景 | 间距值(dp/px) | 说明 |
|---|---|---|
| 卡片外边距 | 16 | 页面左右留白,保证内容不靠边 |
| 卡片内边距 | 16 | 常用内容到卡片边缘距离 |
| 组件间小间距 | 8 | 按钮和文字之间的间距 |
| 分区间距 | 24 | 不同模块之间的间隔 |
| 列表项左右 | 16 或 24 | 统一对齐,形成对称感 |
这套数值不需要背,核心原则是 8dp 网格系统。所有间距尽量使用 4dp 或 8dp 的整倍数,视觉会比较整齐,开发在实现时也不用每次重新报。
2.4 组件体系:需要“状态感”而不只是“长相”
Material Design 里最珍贵的东西,不只是一个按钮长什么样,而是它“在不同状态下怎么表现”。比如一个按钮,除了默认态,还有按压态、焦点态、禁用态、加载态。每个状态都有明确的视觉反馈。
这一点在工作中特别重要。我见过很多开发直接用一个透明度来模拟禁用态,结果禁用按钮仍然有阴影,看起来还能点。正确的做法是:禁用时降低整体对比度、去掉阴影并且去掉交互反馈。状态和状态之间最好通过代码统一管理,而不是各处手写样式。
3. 落地实操:从设计稿到代码的关键参数
3.1 先定一套“设计令牌”
不管你是用安卓原生、Flutter、还是前端框架,我强烈建议第一步先定义设计令牌(Design Token)。所谓令牌,就是给颜色、间距、字号、圆角、阴影这些基础值起一个固定名称,代码和设计稿都引用同一个名字。
打个比方,不要叫“那个蓝色”,而是叫primary。不要叫“小间距”,而是叫space-md。这样做的好处是:后续改品牌色时,只需要改一个地方;换主题时,只换一组 token;多端开发时,也可以用同一套命名生成不同平台的样式文件。
具体到一套移动端项目,我建议至少定义这些令牌:
- 颜色:primary、primary-container、secondary、surface、background、error、on-background、outline
- 间距:space-xs、space-sm、space-md、space-lg、space-xl,分别对应 4、8、16、24、32
- 圆角:radius-sm、radius-md、radius-lg,分别对应 4、8、16
- 字阶:label-sm、body-md、title-lg、headline-sm 等
- 投影:elevation-1、elevation-2、elevation-3,对应不同层级阴影
3.2 页面示例:一个组件如何组合
我们拿最常用的卡片加按钮组合来演示。假设你要做一个用户信息卡片,里面有名字、简介、一个“编辑”按钮。
参考实现逻辑:
- 卡片使用 surface 背景色,圆角 12dp 或 16dp,elevation 1 档。
- 卡片内边距统一 16dp。
- 名字用 title-lg,颜色使用 on-surface 的 87% 透明度。
- 简介用 body-md,颜色使用 60% 透明度。
- 编辑按钮用 primary-container 背景,内部文字用 on-primary-container,圆角 8dp,带按压态反馈。
颜色和层级都对上了,即使按钮面积不大,整体视觉也会有“同一套系统”的协调感。相反,如果按钮用了一个全新的亮色,卡片又搞了彩色渐变背景,信息层级就会乱成一团。
3.3 组件库选型的参考
每个技术栈都有自己的 Material 实现库,选库时不要只看下载量,要看是否支持动态主题和暗色模式。
- 原生安卓底层:推荐直接用官方的 Material Components,它和系统的行为、无障碍、动画结合最好。
- 跨平台开发:Flutter 自带 Material 组件,开箱即用,定制化能力强。
- Web 端:可以使用适配 React 体系的 Material UI 组件库,或者使用基于 Web Components 的独立实现。
- 小程序或轻量场景:不建议直接引全量组件库,可以手工抽几个核心组件复用。
我的经验是:能用官方实现就不要从头造轮子。Material 的细节非常多,波纹动画、焦点环、点击目标尺寸、无障碍语义,自己实现很容易遗漏。你先把组件库用起来,再根据产品气质去覆盖主题,比从零写一套效率高太多。
3.4 主题定制的三个层次
- 浅层面:只改主色、辅色、圆角,适合快速识别。
- 中层面:调整间距尺度、字阶、控制元素状态样式。
- 深层面:自定义组件形状、动效曲线、打破默认布局规律。
我建议每个项目先停留在浅层面和中层面。深度定制需要成熟设计团队长期维护,如果只是一个小团队做一个内部工具,强行深度定制会让风格变得四不像。记住:Material Design 是设计工具,服务产品目标,不是用来炫技的美学口号。
4. 常见翻车场景与排查思路
4.1 阴影不显示或者被裁剪
这是最经典的翻车问题。很多开发设置了大量阴影,页面上却看不到。原因多半是父容器的 overflow 设置成了 hidden,或者裁剪了子区域;另一个原因是阴影颜色默认是黑色半透明,在深色背景下不明显。
排查顺序:
- 检查父组件是否有
clipBehavior或 overflow 裁剪。 - 检查组件的 elevation 是否被重置为 0。
- 检查是否使用了自定义背景颜色,黑色半透明投影在深色背景上需要换成更深的阴影色。
- 检查层级顺序,被后面的组件遮挡也是常见原因。
4.2 颜色对比度不足
彩色主题很常见,但彩色加大面积渐变经常导致文字看不清。尤其按钮上放白色字,如果按钮主色过浅,白字对比度会很低。这时有两种解法:加深按钮主色,或者把按钮内容改成深色文字。
我这里提供一个自查方法:把页面截图转成灰度图,如果文字和背景看不出明显区别,说明对比度不达标。这个方法不需要计算工具,肉眼就能快速排查。
4.3 暗色模式没有正确降级
很多项目一开始只做亮色主题,后来加暗色模式,结果发现“彩色卡片 + 亮色文字”在暗夜里变成刺眼大屏。原因在于没有为暗色模式准备独立的颜色语义。
规范做法是独立定义一组暗色 token:背景不直接用纯黑,而是深灰;卡片不用亮白,而是比背景稍亮;文字不用纯白,而是 87% 亮度的浅灰。切换主题时,除颜色外,投影也要变深或减弱,因为暗色模式下阴影不再有明显区分作用。
4.4 在 iOS 或桌面端显得“水土不服”
Material Design 不是万能药。在 iOS 上大量使用纸片和悬浮按钮,会显得很“硬”。桌面端如果没有鼠标悬停态和键盘焦点态的适配,用户也会觉得操作生硬。
我的建议是:跨平台产品可以共用主题 token,但交互细节要各平台差异化。比如在 iOS 上可以适当减少阴影强度,增加毛玻璃质感;在桌面端要补充 hover 态和键盘焦点环。判断标准不是“风格统一”,而是“行为合理”。整体风格统一,感受一致,不要求每个像素完全一样。
4.5 组件状态缺失
菜单类组件最容易出现状态缺失:有默认态,却没有焦点态;有按压态,却没有禁用态。无障碍用户靠键盘或屏幕阅读器操作时,就会卡住。建议在每个组件开发完成前,检查一遍可用状态:默认、悬浮(桌面端)、焦点、按压、禁用、加载。一套状态做全了,产品的笨拙感立刻少一半。
5. 什么时候该用 Material Design,什么时候别硬用
5.1 适合它的场景
- 工具型应用:后台管理系统、编辑器、数据看板,这类产品功能密度高,强调效率和清晰,Material 的布局和组件体系非常合适。
- 安卓优先的产品:目标用户长期使用安卓生态,Material 风格天然亲近。
- 快速验证的 MVP:组件库齐全,主题可快速切换,适合先跑通业务再慢慢打磨品牌。
5.2 不适合它的场景
- 强品牌内容型应用:比如阅读类、时尚类、娱乐内容产品,需要有独特气质的视觉语言,直接套 Material 会显得模板化。
- 桌面端专业软件:例如复杂的表格编辑器,Material 的留白和间隔比较占空间,桌面高密度需求不一定适配。
- 已有完整设计系统的产品:如果团队已经沉淀出自己的设计语言,新页面应该延续既有体系,而不是引入另一套风格打架。
5.3 我的个人使用体会
做了这些年设计,我最大的感触是:Material Design 最大的价值不是“好看”,而是“省力”。它给了团队一套共同语言,让设计师不用从零解释间距,让开发不用为了阴影设计调半天参数,让产品上线前不用反复检查层级逻辑。我后来做了一个内部管理端,几乎没有额外定制组件,只是改了主题色的两个 token,整体观感就非常统一。
当然,如果你想要品牌差异化,就不能停留在默认组件上。你可以调整圆角、字阶、动效曲线,只要保证“物理隐喻、层级关系、状态反馈”这三个根基不变,出来的产品还是会既有 Material 的逻辑,又有自己的气质。
最后再分享一个小技巧:每次新项目启动时,先把“8dp 网格”和“明暗两套 token”这两件事定下来。后面写代码和排版,基本不会出大问题。Material Design 说穿了就是一套有纪律的规则,遵守它容易,真正理解它灵活应用,才能把设计风格变成产品体验的一部分。