移动端1像素的解决方案?

简介: 移动端1像素的解决方案?

初识1px

学习前端方向也有一段时间了,起初做过一些项目,总是发现做完之后自己的边框会变得比较粗,后面翻阅了部分资料慢慢的才了解了这个问题,大致列举了几种解决的办法。

造成边框变粗的原因

在window对象中有一个devicePixelRatio属性,他可以反应css中的像素与设备的像素比。然而1px在不同的移动设备上都等于这个移动设备的1px,这是因为不同的移动设备有不同的像素密度。有关这个属性,它的官方的定义为:设备物理像素和设备独立像素的比例,也就是

devicePixelRatio = 物理像素 / 独立像素

还记不记得移动端html的header这句话

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

这句话定义了本页面的viewport的宽度为设备宽度,初始缩放值和最大缩放值都为1,并禁止了用户缩放.手机存在一个能完美适配的理想viewport, 分辨率相差很大的手机的理想viewport的宽度可能是一样的, 这样做的目的是为了保证同样的css在不同屏幕下的显示效果是一致的, 上面的meta实际上是设置了ideal viewport的宽度.以实际举例: iphone3和iphone4的屏幕宽度分别是320px,640px,

但是它们的ideal viewport的宽度都是320px, 设置了设备宽度后, 320px宽的元素都能100%的填充满屏幕宽. 不同手机的ideal viewport宽度是不一样的, 常见的有320px, 360px, 384px. iphone系列的这个值在6之前都是320px, 控制viewport的好处就在于一套css可以适配多个机型.

看懂的人应该已经明白 1px变粗的原因了, viewport的设置和屏幕物理分辨率是按比例而不是相同的. 移动端window对象有个devicePixelRatio属性, 它表示设备物理像素和css像素的比例, 在retina屏的iphone手机上, 这个值为2或3, css里写的1px长度映射到物理像素上就有2px或3px那么长.谈到这里那么就会有人问,有哪些解决的办法呢?

1px的解决办法

伪类+transform实现

对于解决1px边框问题,我个人觉得最完美的解决办法还是伪类+transform比较好。原理:是把原先元素的 border 去掉,然后利用 :before 或者 :after 重做 border ,并 transform 的 scale 缩小一半,原先的元素相对定位,新做的 border 绝对定位。


单条border样式设置

.scale{
  position: relative;
  border:none;
}
.scale:after{
  content: '';
  position: absolute;
  bottom: 0;
  background: #000;
  width: 100%;
  height: 1px;
  -webkit-transform: scaleY(0.5);
  transform: scaleY(0.5);
  -webkit-transform-origin: 0 0;
  transform-origin: 0 0;
}

四条boder样式设置:

.scale{
  position: relative;
  margin-bottom: 20px;
  border:none;
}
.scale:after{
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  border: 1px solid #000;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  width: 200%;
  height: 200%;
  -webkit-transform: scale(0.5);
  transform: scale(0.5);
  -webkit-transform-origin: left top;
  transform-origin: left top;
}

最好在使用前也判断一下,结合 JS 代码,判断是否 Retina 屏

if(window.devicePixelRatio && devicePixelRatio >= 2){
  document.querySelector('ul').className = 'scale';
}

flexible.js

这是淘宝移动端采取的方案, github的地址:github.com/amfe/lib-fl…. 前面已经说过1px变粗的原因就在于一刀切的设置viewport宽度, 如果能把viewport宽度设置为实际的设备物理宽度, css里的1px不就等于实际1px长了么. flexible.js就是这样干的.

里面的scale值指的是对ideal viewport的缩放, flexible.js检测到IOS机型, 会算出

scale = 1/devicePixelRatio, 然后设置viewport

metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

devicePixelRatio=2时输出meta如下, 这样viewport与ideal viewport的比是0.5, 也就与设备物理像素一致

<meta name="viewport" content="initial-scale=0.5, maximum-scale=0.5, minimum-scale=0.5, user-scalable=no">

在devicePixelRatio = 3 时,输出viewport

<meta name="viewport" content="initial-scale=0.3333333333333333, maximum-scale=0.3333333333333333, minimum-scale=0.3333333333333333, user-scalable=no">

使用box-shadow模拟边框

利用css 对阴影处理的方式实现0.5px的效果

.box-shadow-1px {
  box-shadow: inset 0px -1px 1px -1px #c8c7cc;
}
相关文章
|
4月前
|
编解码 前端开发 JavaScript
移动端1像素的解决方案?
在移动端开发中,由于不同设备的像素密度差异,1像素问题成为了一个常见的难题。如果我们不对这个问题进行针对性的解决,那么会导致页面显示效果不美观,甚至影响用户体验。
30 0
|
9月前
|
JavaScript
深入了解移动端适配的方案
深入了解移动端适配的方案
176 0
|
10月前
|
移动开发 前端开发 JavaScript
360浏览器开启webGL硬件加速解决百度地图3D视角正常展示的解决方案
360浏览器开启webGL硬件加速解决百度地图3D视角正常展示的解决方案
194 0
|
10月前
|
缓存 编解码 监控
移动端适配方案总结(二)
由于自己太久没开发移动端的页面,个人觉得移动端开发相比较PC端开发最大的不同,在于需要去适配各种尺寸的手机屏幕,尤其还有1px的问题。
177 0
|
移动开发 前端开发 JavaScript
分享8个前端可以制作360度WebVr全景视图框架
分享8个前端可以制作360度WebVr全景视图框架
1406 0
分享8个前端可以制作360度WebVr全景视图框架
|
Web App开发
移动端适配——视口概念
事实上这种方式是不利于我们进行移动的开发的,我们希望的是设置100px,那么显示的就是100px;
118 0
移动端适配——视口概念
|
移动开发 前端开发 JavaScript
超详细讲解 H5 移动端适配方案
超详细讲解 H5 移动端适配方案
超详细讲解 H5 移动端适配方案
ADI
|
前端开发 iOS开发
[分享] 移动端适配iPhoneX方案
[分享] 移动端适配iPhoneX方案
ADI
89 0
|
Web App开发 移动开发 编解码
移动端法门:自适应方案和高清方案
笔者从毕业开始做前端到现在,90% 的项目是移动端打交道,所以当简历上写了“移动H5”几个字时,必会被问到自适应方案与高清方案
656 0
移动端法门:自适应方案和高清方案
|
编解码
一加8系列最新渲染图,比前代更克制也更精细
国产手机经过2010年到2016年的野蛮生长之后,渐渐形成了“华米OV”为首的四强格局,但唯一例外的就是作为小厂的一加。
134 0
一加8系列最新渲染图,比前代更克制也更精细