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

移动端适配

时间:2023-04-05 00:05:25 HTML5

前言:这周工作中遇到移动端1px的问题。之前一直在写styles,并没有特别注意。还有rem原则。这些其实都是比较常见的移动端适配问题。现阶段主流的适配方案有两种。一个是flexible+rem,一个是vw看具体情况1.基本概念在了解具体解决方案的原理之前,先看一下一些基本概念:1.1.物理像素称为设备像素,它是显示设备中最小的物理组件之一。每个像素都可以根据操作系统设置自己的颜色和亮度。1.2.Device-independentpixel(density-independentpixel)设备无关像素也称为密度无关像素,可以认为是计算机坐标系中的一个点。这个点代表一个可以被程序使用的虚拟像素(比如CSS像素)。然后通过相关系统将其转换为物理像素。(在没有视网膜屏幕之前,设备独立像素等于物理像素)1.3CSS像素CSS像素是一个抽象单位,主要用于浏览器中以准确衡量网页上的内容。通常,CSS像素称为设备无关像素,简称DIP。1.4.设备像素比(devicepixelratio)设备像素比简称dpr,它定义了物理像素和设备独立像素之间的对应关系。它的值可以根据以下公式计算:设备像素比=物理像素/设备独立像素在JavaScript中,可以通过window.devicePixelRatio获取当前设备的dpr。在CSS中,可以通过-webkit-device-pixel-ratio、-webkit-min-device-pixel-ratio和-webkit-max-device-pixel-ratio进行媒体查询,针对不同的dpr设备做一些样式适配(这里只针对webkit内核浏览器和webviews)因此在dpr为2的iphone6、7、8设备中,一个设备无关像素为4个物理像素,所以css上设置的1px在其屏幕上占用2个物理像素像素,0.5px对应的是它能显示的最小单位。1.5.简单理解rem,rem是相对根元素的font-size计算的。在我们的解决方案中,rem单元用于根据的ont-size轻松计算元素的盒模型大小。而这个特性对我们来说特别有利。2.灵活的实现方案在了解了上面的一些相关概念之后,我们来看看实际的解决方案。淘宝有一个库叫lib-flexible,这个库就是用来解决H5页面终端适配的。我们把屏幕分成10等份,那么物理像素就是750=375*2,那么10rem=750px,1rem=75px;物理像素为1125=375*3,则10rem=1125px,1rem=112.5px;物理像素为1242=414*3,则10rem=1242px,1rem=124.2px;functionrefreshRem(){varwidth=docEl.getBoundingClientRect().width;如果(宽度/dpr>540){宽度=540*dpr;}varrem=宽度/10;docEl.style.fontSize=rem+'px';flexible.rem=win.rem=rem;}2.1、1px物理像素解由此我们得到一个1px像素解。viewport的initial-scale具有缩放页面的效果。对于dpr=2的屏幕,1px压缩一半可以匹配设备像素比1px,可以通过设置缩放比例initial-scale为0.5=1/2来实现。以此类推,dpr=3的屏幕可以通过设置initial-scale为0.33=1/3来实现。if(!metaEl){metaEl=doc.createElement('meta');metaEl.setAttribute('名称','视口');metaEl.setAttribute('content','initial-scale='+scale+',maximum-scale='+scale+',minimum-scale='+scale+',user-scalable=no');如果(docEl.firstElementChild){docEl.firstElementChild.appendChild(metaEl);}else{varwrap=doc.createElement('div');wrap.appendChild(metaEl);doc.write(wrap.innerHTML);}}3.视口单元适配方案将视口宽度window.innerWidth和视口高度window.innerHeight分成100份,这里的视口理解为idealviewport比较合适,不会随着视口的不同设置而变化.1、vw:1vw为视口宽度的1%2、vh:1vh为视口高度的1%3、vmin:vw和vh中较小的值4、vmax:如果设计时选择vw和vh中较大的值draft为750px,则1vw=7.5px,100vw=750px。事实上,设计稿设置成什么并不重要。最后换算出来的是相对单位。上面说的rem也是对它的模拟。和之前一样的痛点,我们还是需要花费大量不必要的计算时间将标注图中的px转为vw,有没有类似postcss-px2rem的工具?很荣幸再次站在巨人的肩膀上。有大神写过类似的PostCss插件postcss-px-to-viewport。请参考https://www.w3cplus.com/mobil...