首先先说一下pixel(picture element),显示图像的最小单位,有多个带色彩的像素点组成的总体就是一张图像。而后再说一下ppi(pixel per inch)这个概念,其实就是在每英寸显示的像素数。javascript
设备像素(device independent pixels): 设备屏幕的物理像素
逻辑像素(CSS pixels): CSS像素css
CSS样式和几乎全部的javascript设置html DOM 元素都使用CSS像素,所以实际上历来用不上设备像素,惟一的例外是screen.width/height。html
dpr = 设备像素 / 逻辑像素前端
随着技术的发展,移动设备的屏幕像素密度愈来愈高。从iphone4开始,苹果公司推出了retina屏幕。。iphone4的分辨率提升了一倍,但屏幕尺寸却没有变化,这意味着一样大小的屏幕上,像素多了一倍,因而dpr = 2。dpr也有对应的javascript属性window.devicePixelRatio。以iphone5为例,iphone5的CSS像素为320px568px,dpr是2,因此其设备像素为640px1136pxjava
如今的iphone 6plus的dpr是3,因此UE出的设计稿宽都是414 * 3的,而咱们在开发的时候都是把UE的字体、块宽和高等标注同时 / 3,这样就能和设计稿保持一致。当咱们截屏iphone 6plus浏览器中访问开发好的网页,放到ps中进行测量,和设计稿中一致。web
在这里必定要注意,在retina屏幕中显示图片的时候,为了保证不失真模糊,图片的尺寸必须是图片的显示尺寸 * dpr,这样在retina屏幕中被放大dpr倍后才会不失真。浏览器
注意如下两种实现方式都有问题,显示单边1px,在retina屏幕上会有一条细缝,4边1px,在retina屏幕上会存在position定位从块元素的padding开始定位,会覆盖2条边,另外2条边则多出来了iphone
codepen实例ide
如下代码实现的是底部1px变换,其原理: 使用伪元素after绝对定位到块元素底部,宽度100%,高度1px,在Y轴上缩放1倍,记住要设置背景色。字体
<div class="box-1px-bottom-border">I'm box 1px bottom border</div>
.box-1px-bottom-border { position: relative; width: 100px; height: 100px; background: #0f0; &:after { content: ' '; display: block; left: 0; right: 0; position: absolute; bottom: 0; height: 1px; background: #f00; -webkit-transform-origin: 0 0; transform-origin: 0 0; @media screen and (-webkit-min-device-pixel-ratio: 2) { -webkit-transform: scaleY(.5); transform: scaleY(.5); } } }
<div class="box-four-side-border">I'm box four side border</div>
.box-four-side-border { width: 100px; height: 100px; background: #00f; position: relative; &:after { content: " "; display: block; width: 100%; height: 100%; position: absolute; left: 0; top: 0; border: 1px solid #f00; @media screen and (-webkit-min-device-pixel-ratio: 2) { width: 200%; height: 200%; -webkit-transform-origin: 0 0; transform-origin: 0 0; -webkit-transform: scale(.5); transform: scale(.5); } } }