详解手机移动适配

419 阅读3分钟

1. 认识手机分辨率

在iPhone还处于2G,3G,3GS时代(即非retinap屏)的时候,屏幕宽度统一都是 320px * 480px,设计师直接按照这个固定宽度即可。但是,iPhone4的出现带来了变化,其分辨率变成了 640px * 960px ,然而屏幕物理尺寸没改变(对角线3.5英寸,屏幕高宽无官方数据,网上的2.13*4.54是整个手机的高宽,按2:3比例计算得出约为1.94*2.91)。

所以这里引入了第一组概念:

  • PPI
  • px density密度
  • 逻辑分辨率

1.1 PPI

PPI即 Pixels Per Inch 的首字母缩写。 例如 iPhone4以前是 163 。iPhone4 的PPI是 326 (=163的2倍),后续有401,458。

计算公式: Math.pow(640^2 + 960^2, 0.5) / 3.5 = 1153.7764 / 3.5 = 329.65

注意:

  1. 每个像素视为1个小正方形块,对角线其实不是正好穿过每个小正方形的对角线,所以算出来的对角线上有 1153.7764 这么个含小数点的值。
  2. 这里算出来不是 326 ,猜测对角线可能不是正好3.5英寸,但搜索了一圈未找到任何相关资料,求证实。

image.png

备注:DPI即 Dots Per Inch 的首字母缩写。两者概念是非常相似的,这个 Dot (点) 常用于打印机,移动设备用统一用PPI较清晰,本文后续不使用DPI。

1.2 逻辑分辨率

因为iPhone4的屏幕物理尺寸没有变化,但是清晰度提高了,其物理分辨率是之前的2倍,为了保证显示的内容和以前一样多一样大(这个极其必要),仅仅是更清晰,所以引入了 pixel density / Scale Factor 概念,以前这个值为1,现在为 2 了,因此引入了一个新概念:逻辑分辨率 = 物理分辨率 / pixel density。这样 iPhone4 的逻辑分辨率和以前一样。

备注:逻辑分辨率下的每个点也称为 Point 。

2. device independent pixels(设备独立像素)

2.1 安卓原生 —— dp/sp

  • 1dp表示在屏幕像素点密度为160ppi时1px长度,安卓开发中的最小长度单位。
  • 会获取手机设置的字体大小,字体大小为100%时,1sp=1px

2.2 iOS原生 —— pt

pt有2种,一是Word和Web里的pt,多用于打印,Web开发不常用。
然后就是 iOS 的表示屏幕像素点密度为163ppi时1px的长度,iOS开发中的最小长度单位。

大雾:关于 iOS 中 pt 的误解 中说 1pt 约为 0.16毫米,是绝对错误的说法,应为在 2x 和 3x 下不一样。

image.png

型号逻辑分辨率物理分辨率Screen Diagonal物理宽高(计算得到)Scale FactorPPI1英寸=?pt
6/6s375*667750*13344.7"2.3"*4.1"2326163
6 Plus/6s Plus414*7361242*22085.5"2.7"*4.8"3401153
12390*8441170*25326.06"2.54"*5.5"3460153
12 Pro Max428*9261284*27786.68"2.8"*6.06"3458153
/**
 * 物理高宽计算公式
 */
function size(w, h, diagonal) {
	let width = Math.pow(diagonal ** 2 * w ** 2 / (w ** 2 + h ** 2), .5)
	return [width, width * h / w]
}

那么在 iPhone 12 上的

2.3 Web开发

2.4 结论

结论:原生客户端开发,对于字体和高度,iOS用 pt ,安卓用 sp 。

参考文档

  1. Screensiz.es
  2. 详解px,dp,pt,sp,ppi,dpi及屏幕适配
  3. iOS Resolution
  4. 关于 iOS 中 pt 的误解
  5. iOS及Android移动端设计规范整理