一直对h5页面充满崇敬,揣着忐忑的心开始了个人h5之旅。才发现直接照抄网上的方案是很容易,可是想真的了解内部的原理,这就给我了一个下马威了.经过在网上各类找资料,才将各类概念以及原理了解清楚.故写下这篇文章用于积累知识,若有问题,欢迎指正!css
先来看看不少资料上面的描述html
它是物理概念,指的是设备中使用的物理像素(Physic pixel)。这个单位用px表示,它是一个[相对绝对单位]———— 即在一样一个设备上,每1个设备像素所表明的物理长度(如英寸)是固定不变的(即设备像素的绝对性); 但在不一样的设备之间,每1个设备像素所表明的物理长度(如英寸)是能够变化的(即设备像素的相对性);前端
总结的说: 就是像素就至关于咱们平常所说的的厘米(cm)、米(m)、克(g)这些度量单位,但稍微有些不一样的是它是个相对单位,对于不一样的设备中它对应的英寸数是不同的.设备像素就是这个设备上总共有多少个这样的单位像素vue
这个也是一个相对单位,因此它在一个设备中具体表现为多少英尺不肯定,除受到设备宽度影响外还有如下两点能够影响它。git
一、屏幕布局视口大小
二、屏幕的分辨率
复制代码
由上概念咱们知道 1设备像素 ≠ 1css像素github
在桌面浏览器中css的1个像素每每都是对应着电脑屏幕的1个物理像素,这可能会形成咱们的一个错觉,那就是css中的像素就是设备的物理像素。但实际状况却并不是如此(理由如上),但在移动设备上,必须弄明白这点。在早先的移动设备中,屏幕像素密度都比较低,如iphone3,它的分辨率为320x480,在iphone3上,一个css像素确实是等于一个屏幕物理像素的。后来随着技术的发展,移动设备的屏幕像素密度愈来愈高,从iphone4开始,苹果公司便推出了所谓的Retina屏,分辨率提升了一倍,变成640x960,但屏幕尺寸却没变化,这就意味着一样大小的屏幕上,像素却多了一倍,这时,一个css像素是等于两个物理像素的。其余品牌的移动设备也是这个道理。例如安卓设备根据屏幕像素密度可分为ldpi、mdpi、hdpi、xhdpi等不一样的等级,分辨率也是五花八门,安卓设备上的一个css像素至关于多少个屏幕物理像素,也因设备的不一样而不一样,没有一个定论。web
这两个概念不一样对咱们在开发h5页面产生什么样的影响呢,哈哈,应该你会说这不废话吗,固然是不可以将设计师的设计稿百分百的还原到手机上,嗯,是的你说的没错,那怎样才能作到百分百的还原呢?这里面先买个关子,后面咱们慢慢来分析.浏览器
先来一张图 iphone
设备分辨率在设备出厂时就已经定了,并不能更改了.读到这可能有人就有疑惑了,咱们在用电脑的时候可都是能够调节分辨率的ide
电脑上面调整分辨率的时候,其实我怎么调它的像素点数仍是那么多的.不信你看电脑,人家系统给你推荐的是1366px * 768px的分辨率,你知道意味着什么吗?没错,微软在这块屏幕上横向设置了768个像素,竖向设置1366个像素。再怎么拉扯,这个数字是不会变了。那么,为啥我还能调整分辨率呢?我要是调整到800px * 600px,按照定义,横向就是60个像素,竖向就是800个像素了啊。其实呢,你把分辨率调800 * 600,系统就会分配给你800 * 600个有效像素个数,也就是真实的色彩块。其余的个数呢,就由系统自做主张,经过一系列运算给你一个模拟色彩块,填充成正好1366*768个色彩块。这些拿来充数的像素块,和真实的像素块放到一块儿。就比如一个正规军,里面掺了不少杂牌军同样,只能是队伍很差带了
计算公式 PPI = 屏幕对角线的像素数/屏幕对角线的长度。 由此咱们能够知道PPI越大屏幕的清晰度越高
首先咱们先想一想上面这些所带来的影响:
咱们的目的是将1设备像素等于1css像素,鉴于这个目的咱们说说个人方案.具体代码可看我写的demo 根据不一样屏幕来动态写入font-size和改变布局视口,并以rem做为宽度单位
解释: 首先咱们要知道若是不设置meta viewport标签,那么移动设备上浏览器默认的layout viewport宽度值为980px,1024px等这些,因此第一步咱们先将视口宽度设置和布局宽度同样即在html头部设置(这个时候咱们不作下一步的操做也能作到自适应网页,但有1px的问题存在,咱们能够经过接下来的这一步来解决这个问题)。而后经过js来获取不一样的dpr获取scale=1/dpr来设置这样设置就能够解决1px的问题了
注:屏幕即布局视口可经过document.documentElement.clientWidth得到.这里将屏幕分红10等份,固然你也能够分红其余等份,不过最好是10的倍数,这样咱们算出的rem小数点也会少些,这样还原度也会高些)` 这样在任何屏幕下,总长度都为10rem。1rem对应的值也不固定,与屏幕的布局视口宽度有关。
使用sublime text中的插件来实现转换,具体怎么作可参照这个 使用postcss的插件postcss-pxtorem,具体可参照
哈哈,终于将这篇文章写完了,总结一哈😄
移动前端开发之viewport的深刻理解
深刻理解移动端像素知识与Viewport知识
Meta viewport (视口元信息标签)
移动端页面适配———多方案解析