当前位置: 首页 > Web前端 > HTML

移动端开发系列——像素与viewport

时间:2023-04-03 00:24:30 HTML

分类移动端开发基本观点像素基础知识Viewport原理分析弹性布局响应式设计1Rem移动端事件应用Zepto库的使用移动端开发基本观点意义移动用户使用->市场需求->市场供给->企业需要移动开发人才->工资高,就业容易->一大波程序员涌现->猴年薪资将下降->新技术层出不穷,VR/AI->市场需求上升->原路返回……扯远了,以上就是学习移动开发的大致动机;对移动开发的理解移动开发和移动开发是一样的吗??不不不……移动端是个大类。小阳认为应该包括智能手机、平板电脑等移动设备,主要是这两个;移动端开发入门学习路径目录是像素基础知识。抛出3个概念,px(CSSpixels):虚拟像素,可以理解为“直观”的像素,我希望这个元素的宽高都是10px;dp(devicepixels):设备像素(物理像素),可以理解为实际像素,在设备中实际用了多少个物理像素来表示这个宽度为10px的元素;dpr(devicepixelsratio):设备像素比,公式为1px=(dpr)^2*1dp,可以理解为1px中有多少像素由设备像素组成;三个概念的综合理解就是:我把一个元素的宽高设置为10px,那么在显示设备中实际用多少设备像素来表示呢?如果dpr=2,则1px由4个设备像素显示。如果是10px,那么显示设备实际用40dp来显示10px;dpr=1,则1px按1个设备像素显示;px和dp之间的区别是直觉我认为实际使用的只有10px和40dp;为什么会出现dpr>=2的情况?dpr=1不是更符合我的认知和理解吗?并不是因为人们追求更高的分辨率,分辨率越高图像越清晰!!!;但是Mac的Retina屏幕和一般PC一样大,但是图像清晰多了,补肾?由于dpr>=2!!!其他牌子的机器老老实实是1px=1dp,而Mac是1px=4dp,所以你直观的认为大家都用相同的像素数来表示图像(这是真的),但Mac其实用了两倍(指的是dpr的设备像素显示图像);在实际应用中,显示设备不会直接给你一个px和dpr你实际看到的是下面的参数。以下是Kidney6Plus的显示参数信息:多抛几个概念,别晕……英寸:这里指的是屏幕主对角线的尺寸,1英寸=2.54cm,5.5英寸大约是等于14cm(13.97cm)Resolution:1920*1080pixels,这里指的是物理像素(devicepixels)ppi(pixelsperinch):pixelsperinch,这里Kidney6Plus是每英寸有401个像素,那么ppi是怎么计算的?顾名思义,每英寸像素(设备像素),已知屏幕分辨率和主对角线的大小,则ppi等于varhypotenusesize=V(1920^2+1080^2)V代表平方根varppi=Hypotenusesize/5.5ppi=401ppi现在我们知道ppi越高,每英寸的像素越多,图像越清晰;和前面的知识点有什么关系?毕竟这些参数是老外最先发明的,他们会优先选择自己熟悉的计量单位作为显示设备的出厂标准参数,所以ppi作为显示设备的行业标准;告诉业内人士,ppi达到多少就是高清屏。对应的dpr是多少,而不是直接告诉你我现在显示设备的dpr是多少?毕竟,当人们直接听到像素分辨率时,他们会更加敏感。以下为不同ppi对应的dpi:注]Retina屏为dpr>=2的高清屏,Kidney6Plus的dpr为3,为超高清屏;至此,我们了解到:给你一台分辨率为1920*1080,尺寸为5.5英寸的显示设备,可以计算出它的ppi=401,根据ppi计算它的dpr=3,所以设备1px=(3^2)dp,其虚拟像素为1920/3=660px,1080/3=px,即虚拟分辨率为360*660;这时候如果你在代码中设置元素的宽高为360*660,你会发现它的实际尺寸与肾6Plus的屏幕尺寸相等;[ppi]viewport原理分析一个有趣的现象是,当你在chrome中使用上面的设备模拟方法时,它模拟的是Kidney6Plus,这时候神奇的事情发生了。这个元素设置的宽高很明显就是手机的宽高。按照常理,它应该占据整个屏幕,但实际上是:这是怎么回事?,如何解决这个问题呢?好吧,作为实用主义者(不是我),我先说说解决方案:meta标签中有一个viewport属性,可以为这个属性设置宽度;Kidney6Plus默认宽度为980px,所以元素宽度为360px,实际显示尺寸为360px*360/980=132.24px(不信可以自己测试);现在只要把viewport的宽度设置为360px,那么元素就可以占满整个屏幕了。下面我们再介绍一个概念:viewportviewport的原理是:先把页面渲染到一个viewport上,这个viewport的宽度是默认的尺寸显示设备,例如Kidney6Plus为980px;然后将视口按比例缩放到整个手机屏幕;例如在上面的例子中,元素的宽和高是360*600px,元素先渲染在宽度为980px的viewport上,然后在整个手机屏幕上按比例缩放;视口是连接手机屏幕和页面的中间层,为什么不需要呢??想象一下,如果没有中间层,一个宽度为980px的页面直接缩放到320px,那么里面的DOM节点会被重新绘制,这可能会造成布局混乱;viewport的作用是先将所有DOM节点绘制在宽度为980px的viewport上,统一缩放整个viewport,以保证排版的正确性;关于viewport,涉及到两个概念:layoutviewport:布局视口,可以理解为放置页面的窗帘visualvewport:windowviewport,可以理解为屏幕的窗口。例如:Kidney6Plus的视觉视口宽度为360px,布局视口为980px;360px是屏幕窗口的虚拟像素,980px是放置页面的像素;回顾一下,前面的元素出现缩放现象:根据Kidney6Plus1920*1080和5.5英寸屏幕的物理分辨率,ppi=401->dpr=3->虚拟分辨率为640*360像素;绘制一个宽度为360px的元素,本应填满整个手机屏幕,但是由于视口的作用->将360px的元素绘制在980px的布局视口上,然后按比例缩放to360px在视觉视口上->最后看到的是360px的元素无法填满整个屏幕;之前的一个方案是改变布局视口,即,让整个布局视口为360px,那么元素就会充满整个屏幕;以上是世界观,给人一些概念上的认识,无法实践。以下是实际移动开发的方法论。我们只需要关注layoutviewport,我们知道每个移动设备提供给我们的屏幕尺寸是多少,但是移动设备型号那么多,不可能手动一一设置宽度!!!动态设置布局视口上面的设置意味着布局视口始终等于设备的宽度,即视觉视口;【注意】细心的童鞋可能会注意到肾为什么6Plus的虚拟分辨率不是640*360px,具体答案可以参考知乎获取视觉视口和布局视口的api。window.innerWidth:表示窗口的宽度(包括滚动条),即可视窗口的宽度。),即布局视口的宽度移动端其他初始化设置initial-scale:页面第一次显示时,可见区域的缩放比例,如果值为1.0,页面会按实际尺寸显示,不作任何缩放;no-scalable:是否允许缩放viewport属性的完整设置是:上面的完整意思布局视口等于设备的宽度,当页面第一次显示时,它不会缩放,也不允许用户缩放;demo总结一开始px/dp/dpr/ppi的意思是为了铺垫一下背景知识。了解了上面的知识之后,它会给你一个移动设备的物理分辨率,比如iPhone6Plus19201080,尺寸是5.5英寸,它的ppi可以计算为401->dpr=3,这样虚拟分辨率手机的计算结果为640360px;原则上可以开发一个640*360px的元素来填满整个手机屏幕,但是由于视口机制的原因,效果不尽如人意,这就引出了视口的概念。视口可分为视觉视口(窗口大小)和布局视口(放置页面的“幕布”)。iPhone6Plus默认值为980px;通过meta标签的viewport属性可以动态设置布局视口。实战中只需要设置:也可以传window.innerWidth和document.body.clientWidth(前提是不设置body的宽度)分别获取视觉视口和布局视口;