如果你之前被 px / pt / dp 弄糊涂了,绝对不是你笨,而是这些概念常常被讲得又学术又碎。今天我们就从底层把这三个单位讲透。看完后当你再遇到这些单位时,心里会很踏实许多。
一、屏幕到底长什么样?
想象你面前有一块“LED 拼接大屏”,是由一颗颗小灯珠排成的网格组成的。每一颗小灯珠,就是一个 物理像素(physical pixel)。手机屏幕也是一样,里面密密麻麻排满了小方格,每个小方格可以发不同的颜色。
比如一块屏幕的参数写着:750 × 1334,意思是:宽方向有 750 个小格,高方向有 1334 个小格。这就是我们说的 px(pixel )。
px = 硬件世界里的“最小方格单位”。所以请记住一句话:px 是“屏幕造出来就定死的格子数量”,你改不了。
二、为什么要搞这么多“单位”?
如果设计师直接用 px 来设计,会遇到一个很现实的问题,同样是 100px × 100px 的按钮 放在一个 750px 宽的小屏上,看起来挺大 放在一个 1440px 宽的大屏上,就显得很小,你不可能每出一台新手机就重画一次设计稿,对吧?于是 iOS 和 Android 各自发明了一种“抽象单位”:
- iOS:pt(point)
- Android:dp(density-independent pixel)
这两个东西的核心目的只有一个:屏幕再怎么换分辨率,“看上去差不多大”就行。
你可以把它们想象成:
- px:砖头数量
- pt / dp:图纸上的“标尺单位”(比如 1 格代表 10cm)
你画图的时候不要老盯着“有多少块砖”,而是用一把统一的尺子去标:这个窗户 1m 宽、门 2m 高。施工时工人会根据当地砖块大小去“换算”,使得建造的窗口肉眼看上去都差不多大。
三、pt 是怎么工作的?
1. 先看两个数字:375 和 750
经典 iPhone(比如 iPhone 6/7/8),物理分辨率:750 × 1334 px,逻辑尺寸(布局用的):375 × 667 pt
关系很简单:1pt = 2px(2 倍屏),也就是:
- 375pt × 2 = 750px
- 667pt × 2 = 1334px
所以你在设计软件里画一个宽度 375 的界面(并把它当作 375pt)时,在 2x 屏手机上,会用 750px 的宽度去显示,但用户眼里看到的,就是“刚好填满屏幕的宽度”
再比如 3x 屏(iPhone 11 Pro 一类):
- 物理分辨率:1125px 宽
- 逻辑尺寸:375pt 宽
- 关系变成:1pt = 3px
所以对 iOS 来说,你真正要关心的,是“逻辑坐标系的 pt”, 而不是底下那堆成千上万的像素砖。
2. pt 对设计师的实际意义是什么?
从设计师视角,你可以这样理解,
1. 你画的布局尺寸(375、44、16 这种)单位其实是 pt, 比如导航栏高度 44,其实是 44pt。
2. 工程师写代码时也用pt,
button.heightAnchor.constraint(equalToConstant: 44) // 44pt3. 系统负责把 pt 换成真实的 px 去画在屏幕上,在 2x 屏 就 ×2;在3x 屏就 ×3,这个设计师不用管。
所以如果你以后看到iOS 规范里写:“触控目标不小于 44pt × 44pt” 你就当作:“我在设计稿里画的按钮高度,至少要 44 这个数”。
四、dp 是怎么工作的?
Android 世界更乱,因为厂商太多,分辨率五花八门,屏幕尺寸从 4 寸到 7 寸都有。为了不被 px 杀死,Android 发明了 dp(density-independent pixel)。
官方的定义是,在 160 dpi 的屏幕上,1dp = 1px。什么意思?我们换成“比喻语言”:假设“标准屏幕”是 160 dpi(每英寸 160 个像素),在这块标准屏幕上,1dp 大小就等于 1 个 px。如果屏幕变成 320 dpi(像素变密了),为了让效果“看上去一样大”, 系统会让1dp = 2px。以此类推,在再高密度屏幕,值会调整为 3px、4px…
所以 dp 做的事情和 pt 一样,不管你手机分辨率多高,我用 dp 标记元素时,肉眼看到的实际大小差不多。








