摘要:真的是给我们新手学习移动端适配造成不少困惑英语真的很重要呀。细节高清屏上的处理其实并不是所有做移动端适配的人都一定会遇到这个问题。
一次搞清楚移动端这几个坑爹的单位慨念
目录:
一、让坑爹的单位,不再坑爹
二、需要准备什么样的设计稿
三、rem方案的原理和细节
高清屏上,位图的处理
高清屏上,关于border: 1px的处理
移动端屏幕的自动适配的处理
移动端屏幕上字体大小的处理
一、让坑爹的单位,不再坑爹移动端适配本身不难,但是因为涉及到单位转换,想要解释清楚移动端适配方案,你必须要搞清楚各个单位的慨念。
但是由于中英翻译的问题,我发现很多文章在讲解移动端适配时,关于单位,我们有一万种翻译方法...
"物理像素、逻辑像素、物理分辨率、逻辑分辨率、实际像素、css像素、设备像素、ppi、pt、dpr。"
真的是给我们新手学习移动端适配造成不少困惑,英语真的很重要呀。下面分享一下,我觉得最靠谱最需要理解的4个慨念。
推荐把这4个名词记住,我觉得翻译的很贴切,好理解。
物理像素(physical pixel) : 显示器上最小的物理显示单位,苹果的retina屏幕很清晰吧?就是因为它的物理像素很高。
设备独立像素(density-independent pixel) : 这个是计算机坐标系统里的虚拟慨念,这个点代表一个可以由程序使用的虚拟像素(比如: css像素)
设备像素比(device pixel ratio) : 也叫dpr。 设备像素比 = 物理像素 / 设备独立像素 。你也可以通过window.devicePixelRatio获取设备像素比
位图像素 : png, jpg, gif这类都是位图,位图像素就是位图的最小数据单元
举个栗子以iphone6来说,
物理像素分辨率: 750 * 1334
设备独立像素分辨率 : 375 * 667
设备像素比: 2
不管是高清屏幕还是普通屏幕,一个11 css像素那么大的物理尺寸是一样的,区别在于高清屏上一个一个11 css像素那么大的地方,对应2*2个物理像素,所以很清晰。
在普通屏幕下1个css像素(11)对应1个物理像素(11)
在高清屏幕下1个css像素(11)对应4个物理像素(22)
不知道看完这个例子,你是否能理解这些叫法的区别。如果还是有些迷糊,可以看下面的补充说明 ; 如果已经了解,可以跳过下面一小节。
关于这4个叫法的补充说明:物理像素(physical pixel): 物理像素越大,屏幕越清晰。
设备独立像素(density-independent pixel) : 也叫密度无关像素。这个设备独立像素,就是你眼睛看到的手机大小有关。
2个手机看上去一样大? 那他们设备独立独立像素就是一样的。也就是说我不管你高清屏还是什么**屏设备独立像素只跟我这个设备看上去大不大有关。
设备看上去很大? 那设备独立像素就大 ; 设备看上去很小? 那设备独立像素就小
所以我觉得设备独立像素(density-independent pixel)。这个翻译比较贴切也好理解。只跟设备看上去的大小相关。
很多翻译也管设备独立像素叫做: 逻辑像素 、 css像素 、 实际像素...
二、需要准备什么样的设计稿首先,选取一款手机的屏幕宽高作为基准(以前是iphone4的320×480,现在更多的是iphone6的375×667)。
对于retina屏幕(如: dpr=2),为了达到高清效果,视觉稿的画布大小会是基准的2倍,也就是说像素点个数是原来的4倍(对iphone6而言:原先的375×667,就会变成750×1334)。
三、rem方案的原理和细节rem方案的原理:
让需要动态变化的布局、图片的单位都用rem来写。比如width: 2rem
那么2rem究竟表示多少呢? 这个和根元素html的font-size属性相关, 比如font-size为75px,那么 2rem 就表示150px
所以只要html的font-size可以根据屏幕的尺寸和dpr动态的变化,那么所有以rem为单位的元素都会动态变化。
这个就是rem能够适配的基本原理。至于屏幕的尺寸和dpr都是可以通过js或者css获取的。
细节1: 高清屏上,位图的处理常见的位图,包括png / jpg / gif类型的图片。只有一个位图像素对应一个物理像素时,位图才会被高质量的显示
所以常见的问题就是: png图片在普通屏幕上正常显示,但是在高清屏上,会出现位图像素不够的情况,导致图片模糊。
所以其实比较好的解决方案就是:
在根据不同的dpr,显示不同的位图。
另一个就是可以不用位图,改用矢量图、字体图标、转成base64。不用位图自然就没有位图的问题了。
细节2: 高清屏上,border: 1px的处理其实并不是所有做移动端适配的人,都一定会遇到这个问题。
比如你的设计师给了一张iphone6为基准的 750*1334 的设计稿,里面有一个border标注的是1px。
所以设计师实际上想要的是retina屏下的1px,也就是普通屏幕下的0.5px。
但问题是: 并不是手机端屏幕都支持0.5px,ios7之下或者安卓机都可能把0.5解析成0px
这里给到一种解决方案: 设置initial-scale=0.5
这样,页面中的所有的border: 1px都将缩小0.5,从而达到border: 0.5px;的效果。
然而,页面scale,必然会带来一些问题:
字体大小会被缩放
页面布局会被缩放(如: div的宽高等)
细节3: 移动端屏幕的自动适配的处理rem原理: 根据手机的屏幕尺寸和dpr,动态的修改html的font-size(基准值)
求rem
1 rem = document.documentElement.clientWidth * dpr / 10 (1) 乘以dpr,是因为页面有可能为了实现1px border页面会缩放(scale) 1/dpr 倍(如果没有,dpr=1),。 (2) 除以10,是为了取整,方便计算(理论上可以是任何值)
求iphone6的1rem 例子:
iphone6的 1rem : 375px * 2 / 10 = 75px
知道1rem是多少后,如何写其他的css呢?
比如width: 150px, 我们就可以写成2rem
实际上,我们往往通过一个px2rem的函数,来做转换。算法就是 设计稿上某个div的宽度值 / 1rem的像素值, 例如 : 150px / 75px = 2rem
细节4: 移动端屏幕上字体大小的处理移动端上,关于字体大小的需求,一般都是希望各个屏幕的字体都是保持一样大的。
一般解决方案,就是根据dpr,设置不同的font-size,让字体大小保持一致
推荐再读了很多文章后,觉得这篇文章讲的最清楚,所以本文也算是对自己学习知识的一个整理。
http://www.html-js.com/articl...
关于viewport的讲解很详细
https://www.cnblogs.com/2050/...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/115765.html
摘要:真的是给我们新手学习移动端适配造成不少困惑英语真的很重要呀。细节高清屏上的处理其实并不是所有做移动端适配的人都一定会遇到这个问题。 一次搞清楚移动端这几个坑爹的单位慨念 目录: 一、让坑爹的单位,不再坑爹 二、需要准备什么样的设计稿 三、rem方案的原理和细节 高清屏上,位图的处理 高清屏上,关于border: 1px的处理 移动端屏幕的自动适配的处理 移动端屏幕上字体大小的处理...
摘要:第一种情况也不讨论了,通过断点适配后,其实你处理的还是第二种情况。至于移动端,支持情况不错,可以在生产环境使用。 css中的单位很多,%、px、em、rem,以及比较新的vw、vh等。每个单位都有特定的用途,比如当需要设置一个矩形的宽高比为16:9,并且随屏幕宽度自适应时,除了用%,其他单位是很难做到的。所以不存在说某个单位是错误的,某个单位是最好的这种说法。 那本文说的页面适配,指的...
摘要:第一种情况也不讨论了,通过断点适配后,其实你处理的还是第二种情况。至于移动端,支持情况不错,可以在生产环境使用。 css中的单位很多,%、px、em、rem,以及比较新的vw、vh等。每个单位都有特定的用途,比如当需要设置一个矩形的宽高比为16:9,并且随屏幕宽度自适应时,除了用%,其他单位是很难做到的。所以不存在说某个单位是错误的,某个单位是最好的这种说法。 那本文说的页面适配,指的...
阅读 2568·2021-11-23 09:51
阅读 2480·2021-09-30 09:48
阅读 1075·2021-09-10 10:51
阅读 2212·2021-08-12 13:22
阅读 3567·2021-08-11 10:24
阅读 2166·2019-08-30 15:55
阅读 645·2019-08-30 14:05
阅读 3209·2019-08-30 13:03