屏幕尺寸、分辨率、倍率到底是什么鬼
目前我们做移动端项目几乎不需要考虑为什么要这样写样式,为什么设计稿上100px我们直接写成1rem,移动端的屏幕尺寸那么多变,为什么能轻松兼容?那我们得从移动端的屏幕尺寸来探索一下其中的原理,首先就得了解这些费解的概念。
我在网上收集了很多资料,众说纷芸,我按自己的理解整理了这篇文章,如果有理解不当的地方,请指正。
屏幕尺寸
即我们通常说的尺寸是多少多少英寸啦,指的是屏幕对角线的长度。比如iphone6的屏幕尺寸是4.7英寸
设备像素DP(device-pixels)
很多地方又叫设备屏幕尺寸、设备物理像素、屏幕分辨率等等,我感觉是一个概念。比如iphone6是1334*750
像素密度PPI(pixels per inch)
每英寸屏幕上的像素个数,不同屏幕不一样,PPI越大屏幕显示得越清晰,比如iPhone 3gs的设备像素是320×480,iPhone 4s的设备像素是640×960。刚好两倍,然而两款手机都是3.5英寸的,前者的像素密度是后者的两倍,显示出来的画面更清晰细腻。从网上扒了个图:
设备独立像素dips(device-independent pixels)
有的地方也叫逻辑像素。其实也就是我们开发中的document.documentElement.clientWidth。只要逻辑像素相同,显示区域的内容就相同。
倍率DPR(devicePixelRatio)
有的地方也叫设备像素比,是设备像素dp和设备独立像素dips的比例,
也就是dpr = dp / dips
倍率与逻辑像素
概念介绍完了,我们来研究一下这两者的关系,下面这个例子是在网上看到的,感觉解释得比较清晰。
我们以iphone3gs(倍率为1)和iphone4s(倍率为2)来举例,这两者屏幕尺寸都是3.5英寸,大小是一样的,但是分辨率相差了一倍。那么如果按PC网页来考虑,iphone3gs的屏幕分辨率为320480,iphone4s的则为640960,那么在iphone4s上显示的内容应该比在iphone3gs上显示的多,如下图:
可是实际上它们显示的内容是一样多的,这是为什么呢?这是因为Retina屏幕把2×2个像素当1个像素使用。比如原本44像素高的顶部导航栏,在Retina屏上用了88个像素的高度来显示。导致界面元素都变成2倍大小,反而和3gs效果一样了。画质却更清晰。
我们的设计稿是以iphone6为基准来做的,而iphone6的屏幕像素宽是750px,逻辑像素是375px,那么为什么我们的设计稿是750px宽的呢?就是因为切图时获取到的图片是页面上的两倍大,在retina屏幕上实际上是相当于把图片缩小了一倍的,这样可以看到更清晰的图片。如果我们用375px的图片,那么retina屏幕还有什么意义,显示出来的效果就跟倍率为1的屏幕一样了,没有那么细腻了。
我们现在的屏幕适配方式
我们的_reset.less文件里面有一段媒体查询代码
html{ font-size: 312.5%; }
@media screen and (max-width:359px) and (orientation:portrait) {
html { font-size: 266.67%; }
}
@media screen and (min-width:360px) and (max-width:374px) and (orientation:portrait) {
html { font-size: 300%; }
}
@media screen and (min-width:384px) and (max-width:399px) and (orientation:portrait) {
html { font-size: 320%; }
}
@media screen and (min-width:400px) and (max-width:413px) and (orientation:portrait) {
html { font-size: 333.33%; }
}
@media screen and (min-width:414px) and (max-width:431px) and (orientation:portrait){
html { font-size: 345%; }
}
@media screen and (min-width:432px) and (max-width:479px) and (orientation:portrait){
html { font-size:360%; }
}
@media screen and (min-width:480px)and (max-width:639px) and (orientation:portrait){
html{ font-size:400%;}
}
@media screen and (min-width:640px) and (orientation:portrait){
html{ font-size:533.33%;}
}
后面的那些百分比值是怎么来的呢?
312.5%这个基本值是为了计算方便
页面的字体默认是16px,我们把根节点字体设置为312.5%,那么就是16*312.5%=50px,对应设计稿上的100px,那么设计稿上100px的元素,我们样式表里面写成1rem就可以了。
在不同屏幕尺寸(指的是逻辑像素)下面,我们把根节点的字体按比例调整一下,那么页面就按比例进行了缩放,那么我们在不同尺寸的屏幕上看到的页面效果就是相同的了,这个比例是怎么计算的呢,我们拿
@media screen and (min-width:360px) and (max-width:374px) and (orientation:portrait) {
html { font-size: 300%; }
}
这个范围来说,(375/360)*312.5%=300%,于是就得到了这个比例。
> PS:其实这个媒体查询并不是最终起作用的,它的存在只是为了防止js没加载到的时候就先渲染了页面,等后面js加载完后,页面样式改变太大而发生页面跳动,体验不好。最终起作用的是下面这段js代码:
可以回头读一下(点这里—>)移动端开发规范感受一下
$("html").css("font-size",document.documentElement.clientHeight/document.documentElement.clientWidth<1.5 ? (document.documentElement.clientHeight/603*312.5+"%") : (document.documentElement.clientWidth/375*312.5+"%"));
//单屏全屏布局时使用,短屏下自动缩放
//$("html").css("font-size",document.documentElement.clientWidth/375*312.5+"%");//长页面时使用,不缩放
手机阅读请扫描下方二维码:
科普文写得挺好~~~解释了平常经常听到但却不知道啥意思的概念~~

有没有打赏功能 顺便 你的表情不够多啊
你可以直接发微信红包给我
12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

ldeqxcdilobiosjymyru
12345678

12345678

12345678

12345678

12345678

12345678

12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
12345678
555
555
555
555
555
12345678
12345678
12345678
12345678
12345678
1
1
1
1
1
12345678

12345678

12345678

12345678

12345678

12345678

mhqtsfalszedisjzlvee
12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

12345678

1

1

555
1

1

1
1
555
1
555
1
1
1
1
1

1

1
555
1
1
555
1
555
1
1
1
1