前置说明
本文基于以下认同为前提
- 移动端适配方案实际是等比缩放
- 通过插件统一将px转为rem
为什么说前端适配方案实际是等比缩放
UI设计师给你,750px宽度的设计稿,里面宽100px的ui元素,在375px宽的设备上,因为375是750的一半,因此,理论上所有元素都缩减到原本的一半大小即可完美适配,那么100px的ui元素,变成50px即可。
先要排除的情况
对插件是否有设置最小不转换值,比如小于等于2px就不转换。以最小转换单位为2px为例,如果设置了,那么小于等于2px的值,都不会被转化,在任何情况下都显示为2px。如果存在该设置,那要排查是否是这个设置导致的。
个人认为产生1px像素适配问题的原因
从软件适配角度看
UI设计师给你,750px宽度的设计稿,某个元素的边框为1px,你也是基于750px模式开发,于是你直接写1px,打包时,插件自动帮你将1px转为了对应的rem值,此时,在375px宽度的设备上,1px的边框按照等比缩放适配原理,应该缩减至0.5px,而有的浏览器,不支持显示0.5px的大小,凡是小于1px的,统统按1px显示,那么此时,问题就产生了。
那如果UI一开始就给你的是375的设计稿,那直接让插件转换,不用额外处理了。因为,移动端最小也就375的宽度( 你是否在想iPhone 5的屏幕? 拜托,今昔是何年, 还有没有iPhone 5用户都要两说 ),其他设备,屏幕宽度只可能增加,那375宽度的设计稿中的1px,在其他更宽宽度的屏幕上,只会增加,不会减小。
从网络上其他文章得出的结论
UI设计师,期望在任何分辨率下,1px始终是物理像素的1px
1px问题和dpr这些有关吗?
在产生原因上,与dpr无关。在解决方案上有关。
解决方案
如果要符合软件适配的标准(随着视口的放大与缩小,进行等比例缩放)
以rem适配方式为例,1px在大于等于设计稿宽度的视口上显示,无需做任何处理,都符合要求。
那么就只要考虑视口宽度小于设计稿宽度时的情况,当视口宽度小于设计稿宽度,先算出缩放比例,再设置到css变量,再缩放。
如果UI就要求所有情况下,都按照1px物理像素显示
通过css媒体查询判断dpi,再通过将宽度或高度或边框设置为原本的N倍值,再通过css的缩放,使其回到原本的大小。如果对于border的设置,还需要结合::after或::before伪类实现
参考资料
移动端1px像素问题的根本原因 | 优质解决方案 - 掘金 (juejin.cn)
(16条消息) 1px像素问题(一):真正原因_醉逍遥neo的博客-CSDN博客_1px问题
(16条消息) 1px像素问题(二):解决方法_醉逍遥neo的博客-CSDN博客_如何解决1px像素问题
移动端 1px 像素问题及解决办法 - 简书 (jianshu.com)
"resolution" | Can I use... Support tables for HTML5, CSS3, etc
"-webkit-min-device-pixel-ratio" | Can I use... Support tables for HTML5, CSS3, etc